[PATCH v6] i2c: designware: Add support for recovery when GPIO need pinctrl.

Yann Sionneau posted 1 patch 2 years, 3 months ago
drivers/i2c/busses/i2c-designware-master.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
[PATCH v6] i2c: designware: Add support for recovery when GPIO need pinctrl.
Posted by Yann Sionneau 2 years, 3 months ago
Currently if the SoC needs pinctrl to switch the SCL and SDA from the I2C
function to GPIO function, the recovery won't work.

scl-gpio = <>;
sda-gpio = <>;

Are not enough for some SoCs to have a working recovery.
Some need:

scl-gpio = <>;
sda-gpio = <>;
pinctrl-names = "default", "recovery";
pinctrl-0 = <&i2c_pins_hw>;
pinctrl-1 = <&i2c_pins_gpio>;

The driver was not filling rinfo->pinctrl with the device node
pinctrl data which is needed by generic recovery code.

Signed-off-by: Yann Sionneau <ysionneau@kalray.eu>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
V5 -> V6:
* Put a proper commit msg subject

V4 -> V5:
* put back `else if`
* reword the commit msg Subject to add the `i2c: designware: ` tag
* Add the missing `Reviewed-by: Andy Shevchenko` tag

V3 -> V4:
* Replace `else if` by simply `if`.

V2 -> V3:
* put back 'if (!rinfo->pinctrl)' test since devm_pinctrl_get()
can return NULL if CONFIG_PINCTRL is not set.
* print an error msg when devm_pinctrl_get() returns an error that
is not -EPROBE_DEFER.
* print a dbg msg if devm_pinctrl_get() return NULL. 

V1 -> V2:
* remove the unnecessary 'if (!rinfo->pinctrl)' test
* test if return is -EPROBE_DEFER, in that case, return it.
* Reword the commit message according to review

 drivers/i2c/busses/i2c-designware-master.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c
index b720fcc5c10a..30b2de829a32 100644
--- a/drivers/i2c/busses/i2c-designware-master.c
+++ b/drivers/i2c/busses/i2c-designware-master.c
@@ -17,6 +17,7 @@
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/module.h>
+#include <linux/pinctrl/consumer.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
@@ -855,6 +856,17 @@ static int i2c_dw_init_recovery_info(struct dw_i2c_dev *dev)
 		return PTR_ERR(gpio);
 	rinfo->sda_gpiod = gpio;
 
+	rinfo->pinctrl = devm_pinctrl_get(dev->dev);
+	if (IS_ERR(rinfo->pinctrl)) {
+		if (PTR_ERR(rinfo->pinctrl) == -EPROBE_DEFER)
+			return PTR_ERR(rinfo->pinctrl);
+
+		rinfo->pinctrl = NULL;
+		dev_err(dev->dev, "getting pinctrl info failed: bus recovery might not work\n");
+	} else if (!rinfo->pinctrl) {
+		dev_dbg(dev->dev, "pinctrl is disabled, bus recovery might not work\n");
+	}
+
 	rinfo->recover_bus = i2c_generic_scl_recovery;
 	rinfo->prepare_recovery = i2c_dw_prepare_recovery;
 	rinfo->unprepare_recovery = i2c_dw_unprepare_recovery;
-- 
2.17.1
Re: [PATCH v6] i2c: designware: Add support for recovery when GPIO need pinctrl.
Posted by Wolfram Sang 2 years, 3 months ago
On Tue, Aug 22, 2023 at 04:34:37PM +0200, Yann Sionneau wrote:
> Currently if the SoC needs pinctrl to switch the SCL and SDA from the I2C
> function to GPIO function, the recovery won't work.
> 
> scl-gpio = <>;
> sda-gpio = <>;
> 
> Are not enough for some SoCs to have a working recovery.
> Some need:
> 
> scl-gpio = <>;
> sda-gpio = <>;
> pinctrl-names = "default", "recovery";
> pinctrl-0 = <&i2c_pins_hw>;
> pinctrl-1 = <&i2c_pins_gpio>;
> 
> The driver was not filling rinfo->pinctrl with the device node
> pinctrl data which is needed by generic recovery code.
> 
> Signed-off-by: Yann Sionneau <ysionneau@kalray.eu>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

Applied to for-next, thanks!

Re: [PATCH v6] i2c: designware: Add support for recovery when GPIO need pinctrl.
Posted by Andi Shyti 2 years, 3 months ago
Hi Yann,

[...]

> +	rinfo->pinctrl = devm_pinctrl_get(dev->dev);
> +	if (IS_ERR(rinfo->pinctrl)) {
> +		if (PTR_ERR(rinfo->pinctrl) == -EPROBE_DEFER)
> +			return PTR_ERR(rinfo->pinctrl);
> +
> +		rinfo->pinctrl = NULL;
> +		dev_err(dev->dev, "getting pinctrl info failed: bus recovery might not work\n");

I'd still have preferred a dev_warn() here... but it's OK.

> +	} else if (!rinfo->pinctrl) {
> +		dev_dbg(dev->dev, "pinctrl is disabled, bus recovery might not work\n");
> +	}

thanks for following up,

Reviewed-by: Andi Shyti <andi.shyti@kernel.org> 

Thanks,
Andi
Re: [PATCH v6] i2c: designware: Add support for recovery when GPIO need pinctrl.
Posted by Andy Shevchenko 2 years, 3 months ago
On Tue, Aug 22, 2023 at 04:34:37PM +0200, Yann Sionneau wrote:
> Currently if the SoC needs pinctrl to switch the SCL and SDA from the I2C
> function to GPIO function, the recovery won't work.
> 
> scl-gpio = <>;
> sda-gpio = <>;
> 
> Are not enough for some SoCs to have a working recovery.
> Some need:
> 
> scl-gpio = <>;
> sda-gpio = <>;
> pinctrl-names = "default", "recovery";
> pinctrl-0 = <&i2c_pins_hw>;
> pinctrl-1 = <&i2c_pins_gpio>;
> 
> The driver was not filling rinfo->pinctrl with the device node
> pinctrl data which is needed by generic recovery code.

Now looks pretty much good enough (yet the period is not needed in the Subject,
but it's fine for your newbie submission — no need to resend or make a new
version). Thank you!

-- 
With Best Regards,
Andy Shevchenko


Re: [PATCH v6] i2c: designware: Add support for recovery when GPIO need pinctrl.
Posted by Jarkko Nikula 2 years, 3 months ago
On 8/22/23 17:43, Andy Shevchenko wrote:
> On Tue, Aug 22, 2023 at 04:34:37PM +0200, Yann Sionneau wrote:
>> Currently if the SoC needs pinctrl to switch the SCL and SDA from the I2C
>> function to GPIO function, the recovery won't work.
>>
>> scl-gpio = <>;
>> sda-gpio = <>;
>>
>> Are not enough for some SoCs to have a working recovery.
>> Some need:
>>
>> scl-gpio = <>;
>> sda-gpio = <>;
>> pinctrl-names = "default", "recovery";
>> pinctrl-0 = <&i2c_pins_hw>;
>> pinctrl-1 = <&i2c_pins_gpio>;
>>
>> The driver was not filling rinfo->pinctrl with the device node
>> pinctrl data which is needed by generic recovery code.
> 
> Now looks pretty much good enough (yet the period is not needed in the Subject,
> but it's fine for your newbie submission — no need to resend or make a new
> version). Thank you!
> 
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>