From 0a784a9fdea0a886e2c67816cafe00a895b2039f Mon Sep 17 00:00:00 2001 From: zwl Date: Tue, 6 May 2014 21:18:14 +0800 Subject: [PATCH] rk3288 hdmi: add the judge about whether reading edid succeed --- .../hdmi/chips/rk3288/rk3288_hdmi_hw.c | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) 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); } -- 2.34.1