update sdmmc driver and hdmi driver
authorkfx <kfx@rock-chips.com>
Wed, 18 May 2011 03:06:12 +0000 (11:06 +0800)
committerkfx <kfx@rock-chips.com>
Wed, 18 May 2011 03:06:12 +0000 (11:06 +0800)
drivers/mmc/host/rk29_sdmmc.c
drivers/video/hdmi/hdmi-new/chips/anx7150.c
drivers/video/hdmi/hdmi-new/chips/anx7150_hw.c
drivers/video/hdmi/hdmi-new/hdmi-codec.c
drivers/video/hdmi/hdmi-new/hdmi-core.c
drivers/video/hdmi/hdmi-old/chips/anx7150_hw.c
sound/soc/codecs/wm8900.c

index 2ca15e69acf4abf31b819e69114032eb6e9162da..25c4e94a505607a5cb9dd93ada52566f75b53c4a 100755 (executable)
@@ -176,7 +176,7 @@ struct rk29_sdmmc {
        struct early_suspend            early_suspend;
 #endif
 };
-
+struct rk29_sdmmc *sdio_host = NULL;
 static void rk29_sdmmc_write(unsigned char  __iomem    *regbase, unsigned int regOff,unsigned int val)
 {
        __raw_writel(val,regbase + regOff);
@@ -382,7 +382,7 @@ static void rk29_sdmmc_show_info(struct rk29_sdmmc *host)
 static int rk29_sdmmc_reset_fifo(struct rk29_sdmmc *host)
 {
        int tmo = RK29_SDMMC_TMO_COUNT;
-       int retry = 1000;
+       int retry = 10000;
        if(!(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & (SDMMC_STAUTS_MC_BUSY|SDMMC_STAUTS_DATA_BUSY)) &&
                (rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_FIFO_EMPTY))
                return 0;
@@ -393,7 +393,8 @@ retry:
                if(rk29_sdmmc_read(host->regs, SDMMC_STATUS) & (SDMMC_STAUTS_MC_BUSY|SDMMC_STAUTS_DATA_BUSY)){
                        udelay(1);
                        if(retry <= 0){
-                               dev_dbg(host->dev, "%s error,retry = %d\n", __func__,retry);
+                               if(host->is_sdio)
+                                       dev_info(host->dev, "%s error,retry = %d\n", __func__,retry);
                                return -1;
                        }
                        retry--;
@@ -473,10 +474,15 @@ static void rk29_sdmmc_dma_cleanup(struct rk29_sdmmc *host)
 
 static void rk29_sdmmc_stop_dma(struct rk29_sdmmc *host)
 {
+       int ret = 0;
        rk29_sdmmc_set_mrq_status(host, MRQ_STOP_DMA);
        rk29_sdmmc_dma_cleanup(host);
-       rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
-       rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);
+       ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
+       if(ret < 0)
+                       dev_err(host->dev, "stop dma:rk29_dma_ctrl stop error\n");
+       ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);
+       if(ret < 0)
+                       dev_err(host->dev, "stop dma:rk29_dma_ctrl flush error\n");
        rk29_sdmmc_write(host->regs, SDMMC_CTRL, 
                        (rk29_sdmmc_read(host->regs, SDMMC_CTRL))&(~SDMMC_CTRL_DMA_ENABLE));
 }
@@ -496,7 +502,7 @@ static void rk29_sdmmc_request_done(struct rk29_sdmmc *host,struct mmc_request      *
                rk29_sdmmc_stop_dma(host);
        if(mrq->stop && !rk29_sdmmc_test_mrq_status(host, MRQ_STOP_START_DONE))
                send_stop_cmd(host);
-       if(mrq->cmd->opcode == 17|| mrq->cmd->opcode == 51){
+       if(mrq->cmd->opcode == 17 && (host->data_intsts & SDMMC_INT_SBE)){
                rk29_sdmmc_write(host->regs, SDMMC_CMD, 12|SDMMC_CMD_STOP | SDMMC_CMD_START); 
                while (--tmo && rk29_sdmmc_read(host->regs, SDMMC_CMD) & SDMMC_CMD_START);
        }
@@ -670,28 +676,44 @@ static int rk29_sdmmc_submit_data(struct rk29_sdmmc *host, struct mmc_data *data
 {
        struct scatterlist              *sg;
        unsigned int                    i,direction;
-       int dma_len=0;
+       int dma_len=0, ret = 0;
 
-       if (data->blksz & 3)
+       if (data->blksz & 3){
+               dev_info(host->dev, "data->blksz = %d\n", data->blksz);
                return -EINVAL;
+       }
        for_each_sg(data->sg, sg, data->sg_len, i) {
-               if (sg->offset & 3 || sg->length & 3)
+               if (sg->offset & 3 || sg->length & 3){
+                       dev_info(host->dev, "sg->offset = %d, sg->length = %d\n",
+                               sg->offset, sg->length);
                        return -EINVAL;
+               }
        }
        if (data->flags & MMC_DATA_READ)
                direction = RK29_DMASRC_HW;  
        else
                direction = RK29_DMASRC_MEM;  
        
-       rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
-       rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);                                             
-    rk29_dma_devconfig(host->dma_info.chn, direction, (unsigned long )(host->dma_addr));
+       ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_STOP);
+       if(ret < 0)
+                       dev_err(host->dev, "rk29_dma_ctrl stop error\n");
+       ret = rk29_dma_ctrl(host->dma_info.chn,RK29_DMAOP_FLUSH);       
+       if(ret < 0)
+                       dev_err(host->dev, "rk29_dma_ctrl flush error\n");
+    ret = rk29_dma_devconfig(host->dma_info.chn, direction, (unsigned long )(host->dma_addr));
+       if(ret < 0)
+                       dev_err(host->dev, "rk29_dma_devconfig error\n");
        dma_len = dma_map_sg(host->dev, data->sg, data->sg_len, 
                        (data->flags & MMC_DATA_READ)? DMA_FROM_DEVICE : DMA_TO_DEVICE);                                                                           
-       for (i = 0; i < dma_len; i++)                              
-       rk29_dma_enqueue(host->dma_info.chn, host, sg_dma_address(&data->sg[i]),sg_dma_len(&data->sg[i]));  // data->sg->dma_address, data->sg->length);                
+       for (i = 0; i < dma_len; i++) {                             
+       ret = rk29_dma_enqueue(host->dma_info.chn, host, sg_dma_address(&data->sg[i]),sg_dma_len(&data->sg[i]));  // data->sg->dma_address, data->sg->length);          
+               if(ret < 0)
+                       dev_err(host->dev, "rk29 dma enqueue error\n");
+       }
        rk29_sdmmc_write(host->regs, SDMMC_CTRL, (rk29_sdmmc_read(host->regs, SDMMC_CTRL))|SDMMC_CTRL_DMA_ENABLE);// enable dma
-       rk29_dma_ctrl(host->dma_info.chn, RK29_DMAOP_START);
+       ret = rk29_dma_ctrl(host->dma_info.chn, RK29_DMAOP_START);
+       if(ret < 0)
+                       dev_err(host->dev, "rk29_dma_ctrl start error\n");
        rk29_sdmmc_set_mrq_status(host, MRQ_START_DMA);
        return 0;
 }
@@ -768,11 +790,13 @@ static void rk29_sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
 {
        int timeout;
        struct rk29_sdmmc *host = mmc_priv(mmc);
+
        if(!mrq)
                dev_info(host->dev, "mrq = NULL!!!!!\n");
-       if(host->mrq) 
-               rk29_sdmmc_show_info(host);
-
+       if(host->mrq){
+                               dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
+                               rk29_sdmmc_show_info(host);
+                       }
        if((!rk29_sdmmc_test_mrq_status(host, MRQ_STOP_DMA) && 
                rk29_sdmmc_test_mrq_status(host, MRQ_START_DMA)) ||
                (rk29_sdmmc_test_mrq_status(host, MRQ_STOP_DMA) && 
@@ -946,6 +970,9 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv)
                                        dev_info(host->dev, "sending data, host->mrq = NULL\n");
                                        rk29_sdmmc_show_info(host);
                                }
+                               if(!rk29_sdmmc_test_mrq_status(host, MRQ_DMA_DONE) && 
+               rk29_sdmmc_test_mrq_status(host, MRQ_START_DMA))
+                       dev_info(host->dev, "dma is running...\n");
                                rk29_sdmmc_stop_dma(host);
                                if (host->mrq->data->stop)
                                        send_stop_cmd(host);
@@ -955,14 +982,16 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv)
                        prev_state = state = STATE_DATA_BUSY;
 
                case STATE_DATA_BUSY:
-                       if (!rk29_sdmmc_test_and_clear_pending(host,
-                                               EVENT_DATA_COMPLETE))
+                       if (!rk29_sdmmc_test_and_clear_pending(host,EVENT_DATA_COMPLETE) &&
+                               !(host->data_intsts & SDMMC_INT_SBE))
                                break;  
                        
                        rk29_sdmmc_set_completed(host, EVENT_DATA_COMPLETE);
                        intsts = host->data_intsts;
-                       if(!host->mrq)
+                       if(!host->mrq){
+                               dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
                                rk29_sdmmc_show_info(host);
+                       }
                        if(host->mrq->data) {
                                if (unlikely(intsts & RK29_SDMMC_DATA_ERROR_FLAGS)) {
                                        if (intsts & SDMMC_INT_DRTO) {
@@ -971,7 +1000,10 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv)
                                        } else if (intsts & SDMMC_INT_DCRC) {
                                                dev_err(host->dev,"data CRC error\n");
                                                host->mrq->data->error = -EILSEQ;
-                                       } else {
+                                       } else if (intsts & SDMMC_INT_SBE) {
+                                               dev_err(host->dev,"data start bit error\n");
+                                               host->mrq->data->error = -EILSEQ;
+                                       }else {
                                                dev_err(host->dev,"data FIFO error (status=%08x)\n",intsts);
                                                host->mrq->data->error = -EIO;
                                        }
@@ -995,8 +1027,10 @@ static void rk29_sdmmc_tasklet_func(unsigned long priv)
                        if (!rk29_sdmmc_test_and_clear_pending(host,
                                                EVENT_CMD_COMPLETE))
                                break;
-                       if(!host->mrq)
+                       if(!host->mrq){
+                               dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
                                rk29_sdmmc_show_info(host);
+                       }
                        if(host->mrq->stop)
                                rk29_sdmmc_command_complete(host, host->mrq->stop);
                        rk29_sdmmc_request_end(host);
@@ -1030,8 +1064,10 @@ static irqreturn_t rk29_sdmmc_isr(int irq, void *dev_id)
            host->cmd_intsts = intsts;
            smp_wmb();
            rk29_sdmmc_set_pending(host, EVENT_CMD_COMPLETE);
-               if(!host->mrq)
-                       rk29_sdmmc_show_info(host);
+               if(!host->mrq){
+                               dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
+                               rk29_sdmmc_show_info(host);
+                       }
                else
                        dev_info(host->dev, "[cmd%d] cmd error(intsts 0x%x, host->state %d, pending_events %ld)\n", 
                                host->mrq->cmd->opcode,intsts,host->state,host->pending_events);
@@ -1044,12 +1080,14 @@ static irqreturn_t rk29_sdmmc_isr(int irq, void *dev_id)
                host->data_intsts = intsts;
                smp_wmb();
                rk29_sdmmc_set_pending(host, EVENT_DATA_ERROR);
-               tasklet_schedule(&host->tasklet);
-               if(!host->mrq)
-                       rk29_sdmmc_show_info(host);
+               if(!host->mrq){
+                               dev_info(host->dev, "%s-> host->mrq = NULL\n", __func__);
+                               rk29_sdmmc_show_info(host);
+                       }
                else
                        dev_info(host->dev, "[cmd%d] data error(intsts 0x%x, host->state %d, pending_events %ld)\n", 
                                host->mrq->cmd->opcode, intsts,host->state,host->pending_events);
+               tasklet_schedule(&host->tasklet);
        }
 
        if(intsts & SDMMC_INT_DTO) {
@@ -1248,6 +1286,9 @@ static int rk29_sdmmc_probe(struct platform_device *pdev)
        host->div = 0;
        host->is_init = 1;
        host->is_sdio = rk29_sdmmc_is_sdio(pdata);
+
+       if(host->is_sdio)
+               sdio_host = host;
        host->get_wifi_cd = pdata->status;
 
        host->irq = platform_get_irq(pdev, 0);
@@ -1279,12 +1320,12 @@ static int rk29_sdmmc_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "rk29_dma_request error\n");
            goto err_iounmap; 
        }
-       ret = rk29_dma_config(host->dma_info.chn, 16);
-       /*
+       ret = rk29_dma_config(host->dma_info.chn, 4);
+
        if (ret < 0){
                dev_err(&pdev->dev, "rk29_dma_config error\n");
-           goto err_rk29_dma_free; 
-       }*/
+           //goto err_rk29_dma_free; 
+       }
        ret = rk29_dma_set_buffdone_fn(host->dma_info.chn, rk29_sdmmc_dma_complete);
        if (ret < 0){
                dev_err(&pdev->dev, "rk29_dma_set_buffdone_fn error\n");
index bc086604263959d059cc14bb32377b6b84398c64..200dac4de6444de32a7a206088983f7b33f336e0 100755 (executable)
@@ -258,7 +258,7 @@ static int anx7150_i2c_probe(struct i2c_client *client,const struct i2c_device_i
     dev_info(&client->dev, "anx7150 i2c probe ok\n");\r
     return 0;\r
 err_free_irq:\r
-       free_irq(anx->irq, NULL);\r
+       free_irq(anx->irq, anx);\r
 err_gpio_free:\r
        gpio_free(client->irq);\r
 err_hdmi_unregister:\r
@@ -272,13 +272,13 @@ static int __devexit anx7150_i2c_remove(struct i2c_client *client)
        struct anx7150_pdata *anx = (struct anx7150_pdata *)i2c_get_clientdata(client);\r
        struct hdmi *hdmi = anx->hdmi;\r
 \r
-       free_irq(anx->irq, NULL);\r
+       free_irq(anx->irq, anx);\r
        gpio_free(client->irq);\r
        hdmi_unregister(hdmi);\r
        anx = NULL;\r
     return 0;\r
 }\r
-\r
+#if 0\r
 static int anx7150_i2c_suspend(struct i2c_client *client, pm_message_t mesg)\r
 {\r
        struct anx7150_pdata *anx = (struct anx7150_pdata *)i2c_get_clientdata(client);\r
@@ -293,6 +293,7 @@ static int anx7150_i2c_resume(struct i2c_client *client)
        ret = hdmi_resume(anx->hdmi);\r
        return ret;\r
 }\r
+#endif\r
 static const struct i2c_device_id anx7150_id[] = {\r
        { "anx7150", 0 },\r
        { }\r
index dccb4a0b62c3d82dd8ea1562577a1acb3c468d6d..537be6412a465d6e8a06614674b3fa35b673d4f7 100755 (executable)
@@ -1171,21 +1171,21 @@ static int anx7150_initddc_read(struct i2c_client *client,
 }\r
 static int ANX7150_GetEDIDLength(struct i2c_client *client)\r
 {\r
-    u8 edid_data_length,i;\r
+    u8 edid_data_length;\r
        char c;\r
        int rc = 0;\r
 \r
     anx7150_rst_ddcchannel(client);\r
 \r
     rc = anx7150_initddc_read(client, 0xa0, 0x00, 0x7e, 0x01, 0x00);\r
-    mdelay(3);//FeiW - Analogix\r
+    /*mdelay(3);//FeiW - Analogix\r
     for(i=0;i<10;i++)\r
        {\r
                rc = anx7150_i2c_read_p0_reg(client, ANX7150_DDC_FIFOCNT_REG, &c);\r
                if(c!=0){\r
-                       return rc;\r
+                       break;\r
                }\r
-       }\r
+       }*/\r
        mdelay(10);\r
        rc = anx7150_i2c_read_p0_reg(client, ANX7150_DDC_FIFO_ACC_REG, &c);\r
        edid_data_length = c;\r
index fe0adfd66fed561ee799819e54a193d2933426d5..c516890c1e2b917e54571e1448fff47fc9587a7a 100755 (executable)
@@ -1,5 +1,5 @@
 #include <linux/hdmi-new.h>
-extern void wm8990_set_spk(bool on);
+extern void codec_set_spk(bool on);
 
 int hdmi_codec_set_audio_fs(unsigned char audio_fs)
 {
@@ -7,5 +7,5 @@ int hdmi_codec_set_audio_fs(unsigned char audio_fs)
 }
 void hdmi_set_spk(int on)
 {
-       wm8990_set_spk(!on);
-}
\ No newline at end of file
+       codec_set_spk(!on);
+}
index 34132c1692c11bd4ac4379ddc61b0280863ce26a..992d42b2ba25239e63d4fab47c06459df61a88dc 100755 (executable)
@@ -55,7 +55,7 @@ static void hdmi_changed_work(struct work_struct *work)
        else\r
                ret = hdmi->ops->remove(hdmi);\r
        if(ret < 0)\r
-               dev_warn(hdmi->dev, "hdmi changed error\n");\r
+               dev_dbg(hdmi->dev, "hdmi changed error\n");\r
        kobject_uevent(&hdmi->dev->kobj, KOBJ_CHANGE);\r
 }\r
 \r
index 8c3e49e3b59f2483b897097c62b05702478b93ff..a40bd02d9090a9e19024639d2606c16a584673ae 100755 (executable)
@@ -1172,21 +1172,22 @@ static int anx7150_initddc_read(struct i2c_client *client,
 }\r
 static int ANX7150_GetEDIDLength(struct i2c_client *client)\r
 {\r
-    u8 edid_data_length,i;\r
+    u8 edid_data_length;\r
        char c;\r
        int rc = 0;\r
 \r
     anx7150_rst_ddcchannel(client);\r
 \r
     rc = anx7150_initddc_read(client, 0xa0, 0x00, 0x7e, 0x01, 0x00);\r
-    msleep(3);//FeiW - Analogix\r
+    /*msleep(3);//FeiW - Analogix\r
     for(i=0;i<10;i++)\r
        {\r
                rc = anx7150_i2c_read_p0_reg(client, ANX7150_DDC_FIFOCNT_REG, &c);\r
                if(c!=0){\r
-                       return rc;\r
+                       break;\r
                }\r
        }\r
+       */\r
        msleep(10);\r
        rc = anx7150_i2c_read_p0_reg(client, ANX7150_DDC_FIFO_ACC_REG, &c);\r
        edid_data_length = c;\r
index d723a2e9179d3f4f29323dd6256f7e852525de84..cbd3dc5e8387aa04cfc4c9efc4e0b59eba075440 100755 (executable)
@@ -228,7 +228,7 @@ static void wm8900_reset(struct snd_soc_codec *codec)
               sizeof(codec->reg_cache));
 }
 
-void wm8990_set_spk(bool on)
+void codec_set_spk(bool on)
 {
        isSPKon = on;
        if (on) {
@@ -242,7 +242,7 @@ void wm8990_set_spk(bool on)
        }
 }
 
-EXPORT_SYMBOL_GPL(wm8990_set_spk);
+EXPORT_SYMBOL_GPL(codec_set_spk);
 
 static void wm8900_powerdown(void)
 {