From: kfx Date: Wed, 18 May 2011 03:06:12 +0000 (+0800) Subject: update sdmmc driver and hdmi driver X-Git-Tag: firefly_0821_release~10318 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=58061064d144c035673d8532b03bf8fd7d82d7a2;p=firefly-linux-kernel-4.4.55.git update sdmmc driver and hdmi driver --- diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 2ca15e69acf4..25c4e94a5056 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -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"); diff --git a/drivers/video/hdmi/hdmi-new/chips/anx7150.c b/drivers/video/hdmi/hdmi-new/chips/anx7150.c index bc0866042639..200dac4de644 100755 --- a/drivers/video/hdmi/hdmi-new/chips/anx7150.c +++ b/drivers/video/hdmi/hdmi-new/chips/anx7150.c @@ -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"); return 0; err_free_irq: - free_irq(anx->irq, NULL); + free_irq(anx->irq, anx); err_gpio_free: gpio_free(client->irq); err_hdmi_unregister: @@ -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); struct hdmi *hdmi = anx->hdmi; - free_irq(anx->irq, NULL); + free_irq(anx->irq, anx); gpio_free(client->irq); hdmi_unregister(hdmi); anx = NULL; return 0; } - +#if 0 static int anx7150_i2c_suspend(struct i2c_client *client, pm_message_t mesg) { struct anx7150_pdata *anx = (struct anx7150_pdata *)i2c_get_clientdata(client); @@ -293,6 +293,7 @@ static int anx7150_i2c_resume(struct i2c_client *client) ret = hdmi_resume(anx->hdmi); return ret; } +#endif static const struct i2c_device_id anx7150_id[] = { { "anx7150", 0 }, { } diff --git a/drivers/video/hdmi/hdmi-new/chips/anx7150_hw.c b/drivers/video/hdmi/hdmi-new/chips/anx7150_hw.c index dccb4a0b62c3..537be6412a46 100755 --- a/drivers/video/hdmi/hdmi-new/chips/anx7150_hw.c +++ b/drivers/video/hdmi/hdmi-new/chips/anx7150_hw.c @@ -1171,21 +1171,21 @@ static int anx7150_initddc_read(struct i2c_client *client, } static int ANX7150_GetEDIDLength(struct i2c_client *client) { - u8 edid_data_length,i; + u8 edid_data_length; char c; int rc = 0; anx7150_rst_ddcchannel(client); rc = anx7150_initddc_read(client, 0xa0, 0x00, 0x7e, 0x01, 0x00); - mdelay(3);//FeiW - Analogix + /*mdelay(3);//FeiW - Analogix for(i=0;i<10;i++) { rc = anx7150_i2c_read_p0_reg(client, ANX7150_DDC_FIFOCNT_REG, &c); if(c!=0){ - return rc; + break; } - } + }*/ mdelay(10); rc = anx7150_i2c_read_p0_reg(client, ANX7150_DDC_FIFO_ACC_REG, &c); edid_data_length = c; diff --git a/drivers/video/hdmi/hdmi-new/hdmi-codec.c b/drivers/video/hdmi/hdmi-new/hdmi-codec.c index fe0adfd66fed..c516890c1e2b 100755 --- a/drivers/video/hdmi/hdmi-new/hdmi-codec.c +++ b/drivers/video/hdmi/hdmi-new/hdmi-codec.c @@ -1,5 +1,5 @@ #include -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); +} diff --git a/drivers/video/hdmi/hdmi-new/hdmi-core.c b/drivers/video/hdmi/hdmi-new/hdmi-core.c index 34132c1692c1..992d42b2ba25 100755 --- a/drivers/video/hdmi/hdmi-new/hdmi-core.c +++ b/drivers/video/hdmi/hdmi-new/hdmi-core.c @@ -55,7 +55,7 @@ static void hdmi_changed_work(struct work_struct *work) else ret = hdmi->ops->remove(hdmi); if(ret < 0) - dev_warn(hdmi->dev, "hdmi changed error\n"); + dev_dbg(hdmi->dev, "hdmi changed error\n"); kobject_uevent(&hdmi->dev->kobj, KOBJ_CHANGE); } diff --git a/drivers/video/hdmi/hdmi-old/chips/anx7150_hw.c b/drivers/video/hdmi/hdmi-old/chips/anx7150_hw.c index 8c3e49e3b59f..a40bd02d9090 100755 --- a/drivers/video/hdmi/hdmi-old/chips/anx7150_hw.c +++ b/drivers/video/hdmi/hdmi-old/chips/anx7150_hw.c @@ -1172,21 +1172,22 @@ static int anx7150_initddc_read(struct i2c_client *client, } static int ANX7150_GetEDIDLength(struct i2c_client *client) { - u8 edid_data_length,i; + u8 edid_data_length; char c; int rc = 0; anx7150_rst_ddcchannel(client); rc = anx7150_initddc_read(client, 0xa0, 0x00, 0x7e, 0x01, 0x00); - msleep(3);//FeiW - Analogix + /*msleep(3);//FeiW - Analogix for(i=0;i<10;i++) { rc = anx7150_i2c_read_p0_reg(client, ANX7150_DDC_FIFOCNT_REG, &c); if(c!=0){ - return rc; + break; } } + */ msleep(10); rc = anx7150_i2c_read_p0_reg(client, ANX7150_DDC_FIFO_ACC_REG, &c); edid_data_length = c; diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c index d723a2e9179d..cbd3dc5e8387 100755 --- a/sound/soc/codecs/wm8900.c +++ b/sound/soc/codecs/wm8900.c @@ -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) {