afd4bf08bc
Manually merged: layerscape/808-i2c-0011-i2c-imx-support-slave-mode-for-imx-I2C-driver.patch layerscape/808-i2c-0012-i2c-imx-correct-code-of-errata-A-010650-for-layersca.patch Remaining modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, ath79/generic, bcm27xx/bcm2711, x86/64 [*], ramips/mt7621 [*], ath79/tiny [*], ipq40xx [*], octeon [*], realtek [*] Run-tested: ipq806x/R7800, ramips/mt7621 [*], octeon [*], realtek [*] No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> Tested-by: Stijn Segers <foss@volatilesystems.org> [*]
53 lines
1.7 KiB
Diff
53 lines
1.7 KiB
Diff
From 97db2ca4485dc7b10b8382832befe607ade59a6b Mon Sep 17 00:00:00 2001
|
|
From: Dong Aisheng <aisheng.dong@nxp.com>
|
|
Date: Sat, 26 Jan 2019 17:51:59 +0800
|
|
Subject: [PATCH] i2c: imx: fix system hang due to access i2c registers without
|
|
clock
|
|
|
|
Currently, i2c_imx_bus_busy in i2c_imx_xfer is called before
|
|
pm_runtime_get which means the clocks are still not enabled.
|
|
This will cause a hang on IMX as IMX requires accessing registers
|
|
with clocks.
|
|
|
|
So let's change the order to ensure the clocks are enabled before
|
|
accessing registers. This is also a more safe way to access registers,
|
|
suppose shouldn't affect other platforms.
|
|
|
|
Fixes: 4a6ebf1c125c ("i2c: imx: add workaround for erratum ERR010027")
|
|
Reviewed-by: Biwen Li <biwen.li@nxp.com>
|
|
Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
|
|
---
|
|
drivers/i2c/busses/i2c-imx.c | 9 ++++-----
|
|
1 file changed, 4 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/i2c/busses/i2c-imx.c
|
|
+++ b/drivers/i2c/busses/i2c-imx.c
|
|
@@ -1094,12 +1094,15 @@ static int i2c_imx_xfer(struct i2c_adapt
|
|
|
|
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;
|
|
+
|
|
/*
|
|
* workround for ERR010027: ensure that the I2C BUS is idle
|
|
* before switching to master mode and attempting a Start cycle
|
|
@@ -1113,10 +1116,6 @@ static int i2c_imx_xfer(struct i2c_adapt
|
|
goto out;
|
|
}
|
|
|
|
- result = pm_runtime_get_sync(i2c_imx->adapter.dev.parent);
|
|
- if (result < 0)
|
|
- goto out;
|
|
-
|
|
/* Start I2C transfer */
|
|
result = i2c_imx_start(i2c_imx);
|
|
if (result) {
|