| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | From 4a76bb8458cbe93309314c58f276087569b2fc48 Mon Sep 17 00:00:00 2001 |
| 2 | From: Gao Pan <pandy.gao@nxp.com> |
| 3 | Date: Fri, 18 Aug 2017 18:35:11 +0800 |
| 4 | Subject: [PATCH] MLK-16203 enable runtime pm of i2c temporary when do system |
| 5 | suspend |
| 6 | |
| 7 | When we do system suspend, the runtime pm will be disabled, but we need |
| 8 | to control the PMIC to power on/off the regulator, if the runtime pm is |
| 9 | disabled, if will failed to request runtime wakeup. So data transfer will |
| 10 | failed. |
| 11 | |
| 12 | Signed-off-by: Bai Ping <ping.bai@nxp.com> |
| 13 | Signed-off-by: Gao Pan <pandy.gao@nxp.com> |
| 14 | Signed-off-by: Vipul Kumar <vipul_kumar@mentor.com> |
| 15 | (cherry picked from commit 93adab71408f1f162015e77715dd04ce2301d673) |
| 16 | --- |
| 17 | drivers/i2c/busses/i2c-imx.c | 12 +++++++++++- |
| 18 | 1 file changed, 11 insertions(+), 1 deletion(-) |
| 19 | |
| 20 | --- a/drivers/i2c/busses/i2c-imx.c |
| 21 | +++ b/drivers/i2c/busses/i2c-imx.c |
| 22 | @@ -924,10 +924,17 @@ static int i2c_imx_xfer(struct i2c_adapt |
| 23 | unsigned int i, temp; |
| 24 | int result; |
| 25 | bool is_lastmsg = false; |
| 26 | + bool enable_runtime_pm = false; |
| 27 | struct imx_i2c_struct *i2c_imx = i2c_get_adapdata(adapter); |
| 28 | |
| 29 | dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); |
| 30 | |
| 31 | + |
| 32 | + if (!pm_runtime_enabled(i2c_imx->adapter.dev.parent)) { |
| 33 | + pm_runtime_enable(i2c_imx->adapter.dev.parent); |
| 34 | + enable_runtime_pm = true; |
| 35 | + } |
| 36 | + |
| 37 | result = pm_runtime_get_sync(i2c_imx->adapter.dev.parent); |
| 38 | if (result < 0) |
| 39 | goto out; |
| 40 | @@ -999,6 +1006,9 @@ fail0: |
| 41 | pm_runtime_put_autosuspend(i2c_imx->adapter.dev.parent); |
| 42 | |
| 43 | out: |
| 44 | + if (enable_runtime_pm) |
| 45 | + pm_runtime_disable(i2c_imx->adapter.dev.parent); |
| 46 | + |
| 47 | dev_dbg(&i2c_imx->adapter.dev, "<%s> exit with: %s: %d\n", __func__, |
| 48 | (result < 0) ? "error" : "success msg", |
| 49 | (result < 0) ? result : num); |
| 50 | @@ -1289,7 +1299,7 @@ static int i2c_imx_resume(struct device |
| 51 | } |
| 52 | |
| 53 | static const struct dev_pm_ops i2c_imx_pm_ops = { |
| 54 | - SET_SYSTEM_SLEEP_PM_OPS(i2c_imx_suspend, i2c_imx_resume) |
| 55 | + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(i2c_imx_suspend, i2c_imx_resume) |
| 56 | SET_RUNTIME_PM_OPS(i2c_imx_runtime_suspend, |
| 57 | i2c_imx_runtime_resume, NULL) |
| 58 | }; |