From: zwl Date: Tue, 6 May 2014 13:18:14 +0000 (+0800) Subject: rk3288 hdmi: add the judge about whether reading edid succeed X-Git-Tag: firefly_0821_release~5357 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0a784a9fdea0a886e2c67816cafe00a895b2039f;p=firefly-linux-kernel-4.4.55.git rk3288 hdmi: add the judge about whether reading edid succeed --- diff --git a/drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c b/drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c index f8f68c6cdedb..940a4bb892c8 100644 --- a/drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c +++ b/drivers/video/rockchip/hdmi/chips/rk3288/rk3288_hdmi_hw.c @@ -124,15 +124,10 @@ int rk3288_hdmi_read_edid(struct hdmi *hdmi_drv, int block, unsigned char *buff) { int i = 0, n = 0, index = 0, ret = -1, trytime = 2; int offset = (block % 2) * 0x80; - //int interrupt = 0; - //unsigned long flags; + int interrupt = 0; struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver); - return -1; hdmi_dbg(hdmi_drv->dev, "[%s] block %d\n", __FUNCTION__, block); - //spin_lock_irqsave(&hdmi_drv->irq_lock, flags); - hdmi_dev->i2cm_int = 0; - //spin_unlock_irqrestore(&hdmi_drv->irq_lock, flags); //Set DDC I2C CLK which devided from DDC_CLK to 100KHz. hdmi_writel(hdmi_dev, I2CM_SS_SCL_HCNT_0_ADDR, 0x7a); @@ -155,28 +150,28 @@ int rk3288_hdmi_read_edid(struct hdmi *hdmi_drv, int block, unsigned char *buff) hdmi_msk_reg(hdmi_dev, I2CM_OPERATION, m_I2CM_RD8, v_I2CM_RD8(1)); else hdmi_msk_reg(hdmi_dev, I2CM_OPERATION, m_I2CM_RD8_EXT, v_I2CM_RD8_EXT(1)); -#if 0 + i = 200; while(i--) { - //spin_lock_irqsave(&hdmi_drv->irq_lock, flags); - interrupt = hdmi_dev->i2cm_int; - hdmi_dev->i2cm_int = 0; - //spin_unlock_irqrestore(&hdmi_drv->irq_lock, flags); + msleep(1); + interrupt = hdmi_readl(hdmi_dev, IH_I2CM_STAT0); + if(interrupt) + hdmi_writel(hdmi_dev, IH_I2CM_STAT0, interrupt); + if(interrupt & (m_SCDC_READREQ | m_I2CM_DONE | m_I2CM_ERROR)) break; - msleep(5); + msleep(4); } - if((i == 0) || (interrupt & m_I2CM_ERROR)) { + if(((interrupt & m_I2CM_DONE == 0) && (interrupt & m_I2CM_ERROR)) + || (i == 0)) { hdmi_err(hdmi_drv->dev, "[%s] edid read error\n", __FUNCTION__); rk3288_hdmi_i2cm_reset(hdmi_dev); break; } -#endif - //if(interrupt & m_I2CM_DONE) - { - msleep(1); + + if(interrupt & m_I2CM_DONE) { for(index = 0; index < 8; index++) { buff[8 * n + index] = hdmi_readl(hdmi_dev, I2CM_READ_BUFF0 + index); }