We must be sure that the HDMI controller is powered on, while performing
the DDC transfer. Add corresponding runtime PM calls to
msm_hdmi_i2c_xfer().

Signed-off-by: Dmitry Baryshkov <dmitry.barysh...@linaro.org>
---
 drivers/gpu/drm/msm/hdmi/hdmi_i2c.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_i2c.c 
b/drivers/gpu/drm/msm/hdmi/hdmi_i2c.c
index de182c004843..9c78c6c528be 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi_i2c.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi_i2c.c
@@ -107,11 +107,15 @@ static int msm_hdmi_i2c_xfer(struct i2c_adapter *i2c,
        if (num == 0)
                return num;
 
+       ret = pm_runtime_resume_and_get(&hdmi->pdev->dev);
+       if (ret)
+               return ret;
+
        init_ddc(hdmi_i2c);
 
        ret = ddc_clear_irq(hdmi_i2c);
        if (ret)
-               return ret;
+               goto fail;
 
        for (i = 0; i < num; i++) {
                struct i2c_msg *p = &msgs[i];
@@ -169,7 +173,7 @@ static int msm_hdmi_i2c_xfer(struct i2c_adapter *i2c,
                                hdmi_read(hdmi, REG_HDMI_DDC_SW_STATUS),
                                hdmi_read(hdmi, REG_HDMI_DDC_HW_STATUS),
                                hdmi_read(hdmi, REG_HDMI_DDC_INT_CTRL));
-               return ret;
+               goto fail;
        }
 
        ddc_status = hdmi_read(hdmi, REG_HDMI_DDC_SW_STATUS);
@@ -202,7 +206,13 @@ static int msm_hdmi_i2c_xfer(struct i2c_adapter *i2c,
                }
        }
 
+       pm_runtime_put(&hdmi->pdev->dev);
+
        return i;
+
+fail:
+       pm_runtime_put(&hdmi->pdev->dev);
+       return ret;
 }
 
 static u32 msm_hdmi_i2c_func(struct i2c_adapter *adapter)
-- 
2.39.2

Reply via email to