[PATCH] i2c: rockchip: De-initialize the bus after start bit failure

From: Ondrej Jirman megi@xff.cz
Failure can happen when i2c is used without initializing pinctrl properly, which U-Boot happily allows in SPL. Without this fix, further I2C access would fail, even after proper pinctrl initialization.
Signed-off-by: Ondrej Jirman megi@xff.cz Cc: Heiko Schocher hs@denx.de --- drivers/i2c/rk_i2c.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/i2c/rk_i2c.c b/drivers/i2c/rk_i2c.c index f8fac45b6ca0..9927af94a80b 100644 --- a/drivers/i2c/rk_i2c.c +++ b/drivers/i2c/rk_i2c.c @@ -342,7 +342,7 @@ static int rockchip_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs) { struct rk_i2c *i2c = dev_get_priv(bus); - int ret; + int ret = 0;
debug("i2c_xfer: %d messages\n", nmsgs); for (; nmsgs > 0; nmsgs--, msg++) { @@ -356,14 +356,15 @@ static int rockchip_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, } if (ret) { debug("i2c_write: error sending\n"); - return -EREMOTEIO; + ret = -EREMOTEIO; + break; } }
rk_i2c_send_stop_bit(i2c); rk_i2c_disable(i2c);
- return 0; + return ret; }
int rockchip_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)

On 2023/5/25 20:18, Ondřej Jirman wrote:
From: Ondrej Jirman megi@xff.cz
Failure can happen when i2c is used without initializing pinctrl properly, which U-Boot happily allows in SPL. Without this fix, further I2C access would fail, even after proper pinctrl initialization.
Signed-off-by: Ondrej Jirman megi@xff.cz Cc: Heiko Schocher hs@denx.de
Reviewed-by: Kever Yang kever.yang@rock-chips.com
Thanks, - Kever
drivers/i2c/rk_i2c.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/i2c/rk_i2c.c b/drivers/i2c/rk_i2c.c index f8fac45b6ca0..9927af94a80b 100644 --- a/drivers/i2c/rk_i2c.c +++ b/drivers/i2c/rk_i2c.c @@ -342,7 +342,7 @@ static int rockchip_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs) { struct rk_i2c *i2c = dev_get_priv(bus);
- int ret;
int ret = 0;
debug("i2c_xfer: %d messages\n", nmsgs); for (; nmsgs > 0; nmsgs--, msg++) {
@@ -356,14 +356,15 @@ static int rockchip_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, } if (ret) { debug("i2c_write: error sending\n");
return -EREMOTEIO;
ret = -EREMOTEIO;
break;
} }
rk_i2c_send_stop_bit(i2c); rk_i2c_disable(i2c);
- return 0;
return ret; }
int rockchip_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)

Hello Jirman,
On 25.05.23 14:18, Ondřej Jirman wrote:
From: Ondrej Jirman megi@xff.cz
Failure can happen when i2c is used without initializing pinctrl properly, which U-Boot happily allows in SPL. Without this fix, further I2C access would fail, even after proper pinctrl initialization.
Signed-off-by: Ondrej Jirman megi@xff.cz Cc: Heiko Schocher hs@denx.de
drivers/i2c/rk_i2c.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
Reviewed-by: Heiko Schocher hs@denx.de
@kever: Patch is delegated to you on patchwork, for me it is fine, if you pick it up. If you do not plan to pick it up, please delegate it to me.
Thanks!
bye, Heiko

Hello Ondrej,
On 25.05.23 14:18, Ondřej Jirman wrote:
From: Ondrej Jirman megi@xff.cz
Failure can happen when i2c is used without initializing pinctrl properly, which U-Boot happily allows in SPL. Without this fix, further I2C access would fail, even after proper pinctrl initialization.
Signed-off-by: Ondrej Jirman megi@xff.cz Cc: Heiko Schocher hs@denx.de
drivers/i2c/rk_i2c.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
Applied to u-boot-i2c.git master
Thanks!
bye, Heiko
participants (3)
-
Heiko Schocher
-
Kever Yang
-
Ondřej Jirman