RE: [PATCH v5 2/2] i2c: core: support recovery for single-ended GPIOs
From: Jie I. Li (Nokia)
Date: Thu Jul 30 2026 - 03:31:29 EST
Hi Andi,
Thank you very much for resolving the conflict and merging the patch!
This is my first time contributing code to the Linux community, and seeing it finally merged means a lot to me. I truly appreciate your patience, help, and time in guiding me through this.
I will also keep the --in-reply-to note in mind for future submissions.
Best regards,
Jie Li
-----Original Message-----
From: Andi Shyti <andi.shyti@xxxxxxxxxx>
Sent: Wednesday, July 29, 2026 11:47 PM
To: Jie Li <lj29312931@xxxxxxxxx>
Cc: Bartosz Golaszewski <brgl@xxxxxxxxxx>; Linus Walleij <linusw@xxxxxxxxxx>; Wolfram Sang <wsa@xxxxxxxxxx>; Wolfram Sang <wsa+renesas@xxxxxxxxxxxxxxxxxxxx>; linux-gpio@xxxxxxxxxxxxxxx; linux-i2c@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; Jie I. Li (Nokia) <jie.i.li@xxxxxxxxx>
Subject: Re: [PATCH v5 2/2] i2c: core: support recovery for single-ended GPIOs
[You don't often get email from andi.shyti@xxxxxxxxxx. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
CAUTION: This is an external email. Please be very careful when clicking links or opening attachments. See the URL nok.it/ext for additional information.
Hi Jie,
On Mon, May 11, 2026 at 01:37:26PM +0200, Jie Li wrote:
> 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@xxxxxxxxx>
> Reviewed-by: Linus Walleij <linusw@xxxxxxxxxx>
> Acked-by: Wolfram Sang <wsa+renesas@xxxxxxxxxxxxxxxxxxxx>
Please do not send subsequent versions as --in-reply-to, it's difficult to track them.
> ---
> drivers/i2c/i2c-core-base.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> index 9c46147e3506..a3c33e804d47 100644
> --- a/drivers/i2c/i2c-core-base.c
> +++ b/drivers/i2c/i2c-core-base.c
> @@ -445,8 +445,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;
> - /* FIXME: add proper flag instead of '0' once available */
> - if (gpiod_get_direction(bri->sda_gpiod) == 0)
> + if (gpiod_get_direction(bri->sda_gpiod) == GPIO_LINE_DIRECTION_OUT ||
> + gpiod_is_single_ended(bri->sda_gpiod))
there was a little conflict here which I fixes and merged to i2c/i2c.
Thanks,
Andi