MLK-16203 enable runtime pm of i2c temporary when do system suspend
authorGao Pan <pandy.gao@nxp.com>
Fri, 18 Aug 2017 10:35:11 +0000 (18:35 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:36:41 +0000 (15:36 -0500)
When we do system suspend, the runtime pm will be disabled, but we need
to control the PMIC to power on/off the regulator, if the runtime pm is
disabled, if will failed to request runtime wakeup. So data transfer will
failed.

Signed-off-by: Bai Ping <ping.bai@nxp.com>
Signed-off-by: Gao Pan <pandy.gao@nxp.com>
drivers/i2c/busses/i2c-imx.c

index b396bdb..6b70a5e 100644 (file)
@@ -885,10 +885,17 @@ static int i2c_imx_xfer(struct i2c_adapter *adapter,
        unsigned int i, temp;
        int result;
        bool is_lastmsg = false;
+       bool enable_runtime_pm = false;
        struct imx_i2c_struct *i2c_imx = i2c_get_adapdata(adapter);
 
        dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__);
 
+
+       if (!pm_runtime_enabled(i2c_imx->adapter.dev.parent)) {
+               pm_runtime_enable(i2c_imx->adapter.dev.parent);
+               enable_runtime_pm = true;
+       }
+
        result = pm_runtime_get_sync(i2c_imx->adapter.dev.parent);
        if (result < 0)
                goto out;
@@ -960,6 +967,9 @@ fail0:
        pm_runtime_put_autosuspend(i2c_imx->adapter.dev.parent);
 
 out:
+       if (enable_runtime_pm)
+               pm_runtime_disable(i2c_imx->adapter.dev.parent);
+
        dev_dbg(&i2c_imx->adapter.dev, "<%s> exit with: %s: %d\n", __func__,
                (result < 0) ? "error" : "success msg",
                        (result < 0) ? result : num);
@@ -1240,7 +1250,7 @@ static int i2c_imx_resume(struct device *dev)
 }
 
 static const struct dev_pm_ops i2c_imx_pm_ops = {
-       SET_SYSTEM_SLEEP_PM_OPS(i2c_imx_suspend, i2c_imx_resume)
+       SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(i2c_imx_suspend, i2c_imx_resume)
        SET_RUNTIME_PM_OPS(i2c_imx_runtime_suspend,
                           i2c_imx_runtime_resume, NULL)
 };