mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
i2c: core: support recovery for single-ended GPIOs
Currently, i2c_init_recovery() only assigns the set_sda/set_scl hooks if gpiod_get_direction() returns GPIO_LINE_DIRECTION_OUT. This logic fails on certain SoC controllers where open-drain lines in a high-impedance state are physically reported as inputs. This leads to a "deadlock" where the I2C core refuses to assign the recovery hooks because it incorrectly assumes the pins are input-only, even though they are fully capable of driving the bus low for recovery. Update the recovery initialization to use the new gpiod_is_single_ended() helper. If a GPIO is configured as open-drain or open-source in the firmware, it is safe to assume it can be used for bus recovery, even if the current hardware direction is reported as input. Signed-off-by: Jie Li <jie.i.li@nokia.com> Reviewed-by: Linus Walleij <linusw@kernel.org> Acked-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Signed-off-by: Andi Shyti <andi.shyti@kernel.org> Link: https://lore.kernel.org/r/20260511113726.49041-3-jie.i.li@nokia.com
This commit is contained in:
parent
87e713f200
commit
18ca2ce160
|
|
@ -446,7 +446,8 @@ static int i2c_init_recovery(struct i2c_adapter *adap)
|
|||
bri->set_scl = set_scl_gpio_value;
|
||||
if (bri->sda_gpiod) {
|
||||
bri->get_sda = get_sda_gpio_value;
|
||||
if (gpiod_get_direction(bri->sda_gpiod) == GPIO_LINE_DIRECTION_OUT)
|
||||
if (gpiod_get_direction(bri->sda_gpiod) == GPIO_LINE_DIRECTION_OUT ||
|
||||
gpiod_is_single_ended(bri->sda_gpiod))
|
||||
bri->set_sda = set_sda_gpio_value;
|
||||
}
|
||||
} else if (bri->recover_bus == i2c_generic_scl_recovery) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user