Re: [REGRESSION] mux/gpio.c is not able to get any gpio pins

From: Peter Rosin
Date: Wed Jan 17 2018 - 05:39:29 EST


On 2018-01-17 10:35, Linus Walleij wrote:
> On Wed, Jan 17, 2018 at 12:57 AM, Peter Rosin <peda@xxxxxxxxxx> wrote:
>> On 2018-01-17 00:18, Linus Walleij wrote:
>
>>> I think gpiod_set_transitory() calls chip->set_config(chip, gpio, packed);
>>> which calls gpiochip_generic_config() which calls
>>> pinctrl_gpio_set_config() which calls
>>> pinctrl_get_device_gpio_range() which returns -EPROBE_DEFER;
>>> if it can't find a range to map the GPIO to pin control.
>>>
>>> Can you confirm this with e.g. debug prints in
>>> pinctrl_get_device_gpio_range() in drivers/pinctrl/core.c?
>>
>> Yep, a debug print hits, so that that seems to be the origin of
>> the -EPROBE_DEFER.
>
> OK we know where it comes from, good.
>
>>> To fix this, I think sx150x_probe() need to be rewritten
>>> to register the pin controller first, then the GPIO chip,
>>> so the range mapping is up and kicking when the chip gets
>>> initialized.
>>
>> I tried with:
>
> (solution that seems correct)

Which is more correct, to have the pinctrl_enable at the end of the
probe or directly after devm_pinctrl_register_and_init()?

> You should work on top of this change I think.
>
>> No disco. I also tried with the pinctrl_enable call last in the probe
>> but that was no different.
>
> This driver does not define a GPIO range for the GPIOchip though.
> (No gpiochip_add_ranges) so it is dependent on the DTS
> adding a gpio-ranges = <...>; entry.
>
> The only DTS in the kernel tree using this chip does not...

I'm using arch/arm/boot/dts/at91-nattis-2-natte-2.dts which
includes at91-natte.dtsi which has the node with the sx1502q
in question. This is in -next.

> The thing is that when the driver requests generic config by
> assigning gpiochip_generic_config() to .set_config() it
> agrees to define a range mapping, so it may be breaching this
> contract. The primary driver using this method is the Intel driver
> in driver/pinctrl/intel/*. and this uses gpiochip_add_pin_range()
> explicitly.
>
> I would first try to add the gpio range in the DTS. Then the
> GPIO core will add the range (the code is in drivers/gpio/gpiolib-of.c)
> and everything will be happy.

If I, in the above mentioned node, add

gpio-ranges = <&ioexp 0 0 8>;

it works.

> Another solution would be to do what Intel does and add a
> static GPIO range. Since the SX150x doesn't seem very
> configurable wrt pins-to-gpios mappings, this should be fine.

Adding the below on top of the previous pinctrl/gpiochip reshuffle
also works (with the dt change reverted, of course).

diff --git a/drivers/pinctrl/pinctrl-sx150x.c b/drivers/pinctrl/pinctrl-sx150x.c
index 049dd15e04ef..cbf58a10113d 100644
--- a/drivers/pinctrl/pinctrl-sx150x.c
+++ b/drivers/pinctrl/pinctrl-sx150x.c
@@ -1193,6 +1193,11 @@ static int sx150x_probe(struct i2c_client *client,
if (ret)
return ret;

+ ret = gpiochip_add_pin_range(&pctl->gpio, dev_name(dev),
+ 0, 0, pctl->data->npins);
+ if (ret)
+ return ret;
+
/* Add Interrupt support if an irq is specified */
if (client->irq > 0) {
pctl->irq_chip.name = devm_kstrdup(dev, client->name,

> Yet another solution would be to make a local .set_config() call
> that just calls the local function sx150x_pinconf_set()
> in some modified version and thus you break the dependence
> between the GPIO and pin controller.

Didn't try that, the above seems better anyway. I'll send
patches shortly, but please state where you want that pinctrl_enable
call; together with devm_pinctrl_register_and_init (or perhaps
just use plain old deprecated devm_pinctrl_register), or at the
end of the probe, after the gpio init block?

Cheers,
Peter