435bb14e8d79036c4c03b91a48f92ff8aab8ebe6
[openwrt/staging/mkresin.git] /
1 From 97db2ca4485dc7b10b8382832befe607ade59a6b Mon Sep 17 00:00:00 2001
2 From: Dong Aisheng <aisheng.dong@nxp.com>
3 Date: Sat, 26 Jan 2019 17:51:59 +0800
4 Subject: [PATCH] i2c: imx: fix system hang due to access i2c registers without
5 clock
6
7 Currently, i2c_imx_bus_busy in i2c_imx_xfer is called before
8 pm_runtime_get which means the clocks are still not enabled.
9 This will cause a hang on IMX as IMX requires accessing registers
10 with clocks.
11
12 So let's change the order to ensure the clocks are enabled before
13 accessing registers. This is also a more safe way to access registers,
14 suppose shouldn't affect other platforms.
15
16 Fixes: 4a6ebf1c125c ("i2c: imx: add workaround for erratum ERR010027")
17 Reviewed-by: Biwen Li <biwen.li@nxp.com>
18 Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
19 ---
20 drivers/i2c/busses/i2c-imx.c | 9 ++++-----
21 1 file changed, 4 insertions(+), 5 deletions(-)
22
23 --- a/drivers/i2c/busses/i2c-imx.c
24 +++ b/drivers/i2c/busses/i2c-imx.c
25 @@ -1094,12 +1094,15 @@ static int i2c_imx_xfer(struct i2c_adapt
26
27 dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__);
28
29 -
30 if (!pm_runtime_enabled(i2c_imx->adapter.dev.parent)) {
31 pm_runtime_enable(i2c_imx->adapter.dev.parent);
32 enable_runtime_pm = true;
33 }
34
35 + result = pm_runtime_get_sync(i2c_imx->adapter.dev.parent);
36 + if (result < 0)
37 + goto out;
38 +
39 /*
40 * workround for ERR010027: ensure that the I2C BUS is idle
41 * before switching to master mode and attempting a Start cycle
42 @@ -1113,10 +1116,6 @@ static int i2c_imx_xfer(struct i2c_adapt
43 goto out;
44 }
45
46 - result = pm_runtime_get_sync(i2c_imx->adapter.dev.parent);
47 - if (result < 0)
48 - goto out;
49 -
50 /* Start I2C transfer */
51 result = i2c_imx_start(i2c_imx);
52 if (result) {