]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/commitdiff
Kernel: In case of busy i2c try again to get ACK on imx platforms.
authorStefan Schantl <stefan.schantl@ipfire.org>
Thu, 19 Dec 2013 20:26:15 +0000 (21:26 +0100)
committerStefan Schantl <stefan.schantl@ipfire.org>
Thu, 19 Dec 2013 20:26:15 +0000 (21:26 +0100)
lfs/linux
src/patches/kernel/wandboard/imx/0001-i2c-imx-retry-on-NAK.patch [new file with mode: 0644]

index b787aac470fa32fd4d46ccd57d6ad16b76412d78..182143cdc949e28366ce07445d9ea4027bf8b47c 100644 (file)
--- a/lfs/linux
+++ b/lfs/linux
@@ -171,6 +171,8 @@ ifeq "$(KCFG)" "-multi"
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/wandboard/dts/0002-ARM-dts-imx6qdl-wandboard-add-gpio-lines-to-wandboar.patch
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/wandboard/dts/0003-ARM-dts-imx6qdl-wandboard-Add-support-for-i2c1.patch
 
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/wandboard/imx/0001-i2c-imx-retry-on-NAK.patch
+
        # Patchset for Compulab Utilite.
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/utilite/linux-3.10-compulab-utilite-support.patch
 endif
diff --git a/src/patches/kernel/wandboard/imx/0001-i2c-imx-retry-on-NAK.patch b/src/patches/kernel/wandboard/imx/0001-i2c-imx-retry-on-NAK.patch
new file mode 100644 (file)
index 0000000..e876c6e
--- /dev/null
@@ -0,0 +1,38 @@
+From: Tim Harvey <tharvey@gateworks.com>
+Subject: [PATCH] i2c: imx: retry on NAK
+
+In case of busy i2c try again to get ACK.
+
+Signed-off-by: Tim Harvey <tharvey@gateworks.com>
+Tested-by: Luka Perkov <luka@openwrt.org>
+---
+ drivers/i2c/busses/i2c-imx.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/i2c/busses/i2c-imx.c
++++ b/drivers/i2c/busses/i2c-imx.c
+@@ -62,6 +62,7 @@
+ /* Default value */
+ #define IMX_I2C_BIT_RATE      100000  /* 100kHz */
++#define IMX_I2C_MAX_RETRIES   3       /* number of retries to attempt */
+ /* IMX I2C registers */
+ #define IMX_I2C_IADR  0x00    /* i2c slave address */
+@@ -198,7 +199,7 @@ static int i2c_imx_acked(struct imx_i2c_
+ {
+       if (readb(i2c_imx->base + IMX_I2C_I2SR) & I2SR_RXAK) {
+               dev_dbg(&i2c_imx->adapter.dev, "<%s> No ACK\n", __func__);
+-              return -EIO;  /* No ACK */
++              return -EAGAIN; /* try again */
+       }
+       dev_dbg(&i2c_imx->adapter.dev, "<%s> ACK received\n", __func__);
+@@ -533,6 +534,7 @@ static int __init i2c_imx_probe(struct p
+       i2c_imx->adapter.dev.parent     = &pdev->dev;
+       i2c_imx->adapter.nr             = pdev->id;
+       i2c_imx->adapter.dev.of_node    = pdev->dev.of_node;
++      i2c_imx->adapter.retries        = IMX_I2C_MAX_RETRIES;
+       i2c_imx->base                   = base;
+       pinctrl = devm_pinctrl_get_select_default(&pdev->dev);