i2c: imx: retry on NAK
PATCH 1/1 i2c: imx: retry on NAK
From: Tim Harvey <tharvey-UMMOYl/[email protected]>
In case of busy i2c try again to get ACK.
Signed-off-by Tim Harvey <tharvey-UMMOYl/[email protected]>
Tested-by Luka Perkov <[email protected]>
--- drivers/i2c/busses/i2c-imx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-imx.c +3 -1
@@ -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: * the I2C register offset is different between SoCs,
@@ -298,7 +299,7 @@ static int i2c_imx_acked(struct imx_i2c_struct *i2c_imx) {if (imx_i2c_read_reg (i2c_imx,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__);
@@ -633,6 +634,7 @@ static int __init i2c_imx_probe(struct platform_device *pdev) 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;/* Get I2C clock */
Signature · 1 line
1.8.4
A message that is not in the archive (sent off-list or not yet received): 1378857490-30968-1-git-send-email-luka-p3rKhJxN3npAfugRpC6u6w@public.gmane.org
Quoted 6 lines · Luka Perkov
From: Tim Harvey <tharvey-UMMOYl/[email protected]>
In case of busy i2c try again to get ACK.
Signed-off-by Tim Harvey <tharvey-UMMOYl/[email protected]>Tested-by Luka Perkov <[email protected]>
-EAGAIN is for lost arbitration (see Documentation/i2c/fault-codes). In that case, the core will try again. NACK needs to be reported, so the caller can decide what to do in that case. -ENXIO would be the best response here.