Re: [PATCH 1/1] pinctrl: stmfx: fix valid_mask init sequence

From: Amelie DELAUNAY
Date: Tue Nov 05 2019 - 10:14:34 EST




On 11/5/19 3:32 PM, Linus Walleij wrote:
On Mon, Nov 4, 2019 at 11:09 AM Amelie Delaunay <amelie.delaunay@xxxxxx> wrote:

With stmfx_pinctrl_gpio_init_valid_mask callback, gpio_valid_mask was used
to initialize gpiochip valid_mask for gpiolib. But gpio_valid_mask was not
yet initialized. gpio_valid_mask required gpio-ranges to be registered,
this is the case after gpiochip_add_data call. But init_valid_mask
callback is also called under gpiochip_add_data. gpio_valid_mask
initialization cannot be moved before gpiochip_add_data because
gpio-ranges are not registered.

Sorry but this doesn't add up, look at this call graph:

gpiochip_add_data()
 gpiochip_add_data_with_key()
ÂÂÂ gpiochip_alloc_valid_mask()
ÂÂÂ of_gpiochip_add()
ÂÂÂ of_gpiochip_add_pin_range()
ÂÂÂ gpiochip_init_valid_mask()

So the .initi_valid_mask() is clearly called *after*
of_gpiochip_add_pin_range() so this cannot be the real reason,
provided that the ranges come from the device tree. AFAICT that
is the case with the stmfx.

Can you check and see if the problem is something else?


stmfx_pinctrl_gpio_init_valid_mask uses pctl->gpio_valid_mask to initialize gpiochip valid_mask.

pctl->gpio_valid_mask is initialized in stmfx_pinctrl_gpio_function_enable depending on gpio ranges.

stmfx_pinctrl_gpio_function_enable is called after gpiochip_add_data because it requires gpio ranges to be registered.

So, in stmfx driver the call graph is

stmfx_pinctrl_probe
gpiochip_add_data()
gpiochip_add_data_with_key()
gpiochip_alloc_valid_mask()
of_gpiochip_add()
of_gpiochip_add_pin_range()
gpiochip_init_valid_mask()
stmfx_pinctrl_gpio_init_valid_mask (but pctl->gpio_valid_mask is not yet initialized so gpiochip valid_mask is wrong)
stmfx_pinctrl_gpio_function_enable (pctl->gpio_valid_mask is going to be initialized thanks to gpio ranges)

When consumer tries to take a pin (it is the case for the joystick on stm32mp157c-ev1), it gets the following issue:
[ 3.347391] irq: :soc:i2c@40013000:stmfx@42:stmfx-pin-controller didn't like hwirq-0x0 to VIRQ92 mapping (rc=-6)
[ 3.356418] irq: :soc:i2c@40013000:stmfx@42:stmfx-pin-controller didn't like hwirq-0x1 to VIRQ92 mapping (rc=-6)
[ 3.366512] irq: :soc:i2c@40013000:stmfx@42:stmfx-pin-controller didn't like hwirq-0x2 to VIRQ92 mapping (rc=-6)
[ 3.376671] irq: :soc:i2c@40013000:stmfx@42:stmfx-pin-controller didn't like hwirq-0x3 to VIRQ92 mapping (rc=-6)
[ 3.387169] irq: :soc:i2c@40013000:stmfx@42:stmfx-pin-controller didn't like hwirq-0x4 to VIRQ92 mapping (rc=-6)
[ 3.397065] gpio-keys joystick: Found button without gpio or irq
[ 3.403041] gpio-keys: probe of joystick failed with error -22

I can reword the commit message to make it clearer.

Regards,
Amelie