Message ID | 20250513-pinctrl-msm-fix-v2-1-249999af0fc1@oss.qualcomm.com |
---|---|
State | New |
Headers | show |
Series | pinctrl: qcom: several fixes for the pinctrl-msm code | expand |
On Tue, May 13, 2025 at 8:39 PM Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> wrote: > On Qualcomm platforms if the board uses GPIO hogs msm_pinmux_request() > calls gpiochip_line_is_valid(). After commit 8015443e24e7 ("gpio: Hide > valid_mask from direct assignments") gpiochip_line_is_valid() uses > gc->gpiodev, which is NULL when GPIO hog pins are being processed. > Thus after this commit using GPIO hogs causes the following crash. In > order to fix this, verify that gc->gpiodev is not NULL. > > Note: it is not possible to reorder calls (e.g. by calling > msm_gpio_init() before pinctrl registration or by splitting > pinctrl_register() into _and_init() and pinctrl_enable() and calling the > latter function after msm_gpio_init()) because GPIO chip registration > would fail with EPROBE_DEFER if pinctrl is not enabled at the time of > registration. > > pc : gpiochip_line_is_valid+0x4/0x28 > lr : msm_pinmux_request+0x24/0x40 > sp : ffff8000808eb870 > x29: ffff8000808eb870 x28: 0000000000000000 x27: 0000000000000000 > x26: 0000000000000000 x25: ffff726240f9d040 x24: 0000000000000000 > x23: ffff7262438c0510 x22: 0000000000000080 x21: ffff726243ea7000 > x20: ffffab13f2c4e698 x19: 0000000000000080 x18: 00000000ffffffff > x17: ffff726242ba6000 x16: 0000000000000100 x15: 0000000000000028 > x14: 0000000000000000 x13: 0000000000002948 x12: 0000000000000003 > x11: 0000000000000078 x10: 0000000000002948 x9 : ffffab13f50eb5e8 > x8 : 0000000003ecb21b x7 : 000000000000002d x6 : 0000000000000b68 > x5 : 0000007fffffffff x4 : ffffab13f52f84a8 x3 : ffff8000808eb804 > x2 : ffffab13f1de8190 x1 : 0000000000000080 x0 : 0000000000000000 > Call trace: > gpiochip_line_is_valid+0x4/0x28 (P) > pin_request+0x208/0x2c0 > pinmux_enable_setting+0xa0/0x2e0 > pinctrl_commit_state+0x150/0x26c > pinctrl_enable+0x6c/0x2a4 > pinctrl_register+0x3c/0xb0 > devm_pinctrl_register+0x58/0xa0 > msm_pinctrl_probe+0x2a8/0x584 > sdm845_pinctrl_probe+0x20/0x88 > platform_probe+0x68/0xc0 > really_probe+0xbc/0x298 > __driver_probe_device+0x78/0x12c > driver_probe_device+0x3c/0x160 > __device_attach_driver+0xb8/0x138 > bus_for_each_drv+0x84/0xe0 > __device_attach+0x9c/0x188 > device_initial_probe+0x14/0x20 > bus_probe_device+0xac/0xb0 > deferred_probe_work_func+0x8c/0xc8 > process_one_work+0x208/0x5e8 > worker_thread+0x1b4/0x35c > kthread+0x144/0x220 > ret_from_fork+0x10/0x20 > Code: b5fffba0 17fffff2 9432ec27 f9400400 (f9428800) > > Fixes: 8015443e24e7 ("gpio: Hide valid_mask from direct assignments") > Reported-by: Doug Anderson <dianders@chromium.org> > Closes: https://lore.kernel.org/r/CAD=FV=Vg8_ZOLgLoC4WhFPzhVsxXFC19NrF38W6cW_W_3nFjbw@mail.gmail.com > Tested-by: Douglas Anderson <dianders@chromium.org> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> (...) > + /* > + * hog pins are requested before registering GPIO chip > + */ > + if (!gc->gpiodev) > + return true; LGTM, Bartosz if it's fine with you as well can you ACK this and I'll stick the patches in fixes and get it to Torvalds pronto. Yours, Linus Walleij
On 13/05/2025 21:38, Dmitry Baryshkov wrote: > On Qualcomm platforms if the board uses GPIO hogs msm_pinmux_request() > calls gpiochip_line_is_valid(). After commit 8015443e24e7 ("gpio: Hide > valid_mask from direct assignments") gpiochip_line_is_valid() uses > gc->gpiodev, which is NULL when GPIO hog pins are being processed. > Thus after this commit using GPIO hogs causes the following crash. In > order to fix this, verify that gc->gpiodev is not NULL. > > Note: it is not possible to reorder calls (e.g. by calling > msm_gpio_init() before pinctrl registration or by splitting > pinctrl_register() into _and_init() and pinctrl_enable() and calling the > latter function after msm_gpio_init()) because GPIO chip registration > would fail with EPROBE_DEFER if pinctrl is not enabled at the time of > registration. > > pc : gpiochip_line_is_valid+0x4/0x28 > lr : msm_pinmux_request+0x24/0x40 > sp : ffff8000808eb870 > x29: ffff8000808eb870 x28: 0000000000000000 x27: 0000000000000000 > x26: 0000000000000000 x25: ffff726240f9d040 x24: 0000000000000000 > x23: ffff7262438c0510 x22: 0000000000000080 x21: ffff726243ea7000 > x20: ffffab13f2c4e698 x19: 0000000000000080 x18: 00000000ffffffff > x17: ffff726242ba6000 x16: 0000000000000100 x15: 0000000000000028 > x14: 0000000000000000 x13: 0000000000002948 x12: 0000000000000003 > x11: 0000000000000078 x10: 0000000000002948 x9 : ffffab13f50eb5e8 > x8 : 0000000003ecb21b x7 : 000000000000002d x6 : 0000000000000b68 > x5 : 0000007fffffffff x4 : ffffab13f52f84a8 x3 : ffff8000808eb804 > x2 : ffffab13f1de8190 x1 : 0000000000000080 x0 : 0000000000000000 > Call trace: > gpiochip_line_is_valid+0x4/0x28 (P) > pin_request+0x208/0x2c0 > pinmux_enable_setting+0xa0/0x2e0 > pinctrl_commit_state+0x150/0x26c > pinctrl_enable+0x6c/0x2a4 > pinctrl_register+0x3c/0xb0 > devm_pinctrl_register+0x58/0xa0 > msm_pinctrl_probe+0x2a8/0x584 > sdm845_pinctrl_probe+0x20/0x88 > platform_probe+0x68/0xc0 > really_probe+0xbc/0x298 > __driver_probe_device+0x78/0x12c > driver_probe_device+0x3c/0x160 > __device_attach_driver+0xb8/0x138 > bus_for_each_drv+0x84/0xe0 > __device_attach+0x9c/0x188 > device_initial_probe+0x14/0x20 > bus_probe_device+0xac/0xb0 > deferred_probe_work_func+0x8c/0xc8 > process_one_work+0x208/0x5e8 > worker_thread+0x1b4/0x35c > kthread+0x144/0x220 > ret_from_fork+0x10/0x20 > Code: b5fffba0 17fffff2 9432ec27 f9400400 (f9428800) > > Fixes: 8015443e24e7 ("gpio: Hide valid_mask from direct assignments") > Reported-by: Doug Anderson <dianders@chromium.org> > Closes: https://lore.kernel.org/r/CAD=FV=Vg8_ZOLgLoC4WhFPzhVsxXFC19NrF38W6cW_W_3nFjbw@mail.gmail.com > Tested-by: Douglas Anderson <dianders@chromium.org> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Reviewed-by: Matti Vaittinen <mazziesaccount@gmail.com> > --- > drivers/gpio/gpiolib.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > index c787c9310e85af4c22ffc9bb8e791931fd056c89..250d47f77e2bc678b83f51958ca1bcc4db42928f 100644 > --- a/drivers/gpio/gpiolib.c > +++ b/drivers/gpio/gpiolib.c > @@ -784,6 +784,12 @@ EXPORT_SYMBOL_GPL(gpiochip_query_valid_mask); > bool gpiochip_line_is_valid(const struct gpio_chip *gc, > unsigned int offset) > { > + /* > + * hog pins are requested before registering GPIO chip > + */ > + if (!gc->gpiodev) > + return true; > + > /* No mask means all valid */ > if (likely(!gc->gpiodev->valid_mask)) > return true; >
On Wed, 14 May 2025 00:18:41 +0200, Linus Walleij <linus.walleij@linaro.org> said: > On Tue, May 13, 2025 at 8:39 PM Dmitry Baryshkov > <dmitry.baryshkov@oss.qualcomm.com> wrote: > >> On Qualcomm platforms if the board uses GPIO hogs msm_pinmux_request() >> calls gpiochip_line_is_valid(). After commit 8015443e24e7 ("gpio: Hide >> valid_mask from direct assignments") gpiochip_line_is_valid() uses >> gc->gpiodev, which is NULL when GPIO hog pins are being processed. >> Thus after this commit using GPIO hogs causes the following crash. In >> order to fix this, verify that gc->gpiodev is not NULL. >> >> Note: it is not possible to reorder calls (e.g. by calling >> msm_gpio_init() before pinctrl registration or by splitting >> pinctrl_register() into _and_init() and pinctrl_enable() and calling the >> latter function after msm_gpio_init()) because GPIO chip registration >> would fail with EPROBE_DEFER if pinctrl is not enabled at the time of >> registration. >> >> pc : gpiochip_line_is_valid+0x4/0x28 >> lr : msm_pinmux_request+0x24/0x40 >> sp : ffff8000808eb870 >> x29: ffff8000808eb870 x28: 0000000000000000 x27: 0000000000000000 >> x26: 0000000000000000 x25: ffff726240f9d040 x24: 0000000000000000 >> x23: ffff7262438c0510 x22: 0000000000000080 x21: ffff726243ea7000 >> x20: ffffab13f2c4e698 x19: 0000000000000080 x18: 00000000ffffffff >> x17: ffff726242ba6000 x16: 0000000000000100 x15: 0000000000000028 >> x14: 0000000000000000 x13: 0000000000002948 x12: 0000000000000003 >> x11: 0000000000000078 x10: 0000000000002948 x9 : ffffab13f50eb5e8 >> x8 : 0000000003ecb21b x7 : 000000000000002d x6 : 0000000000000b68 >> x5 : 0000007fffffffff x4 : ffffab13f52f84a8 x3 : ffff8000808eb804 >> x2 : ffffab13f1de8190 x1 : 0000000000000080 x0 : 0000000000000000 >> Call trace: >> gpiochip_line_is_valid+0x4/0x28 (P) >> pin_request+0x208/0x2c0 >> pinmux_enable_setting+0xa0/0x2e0 >> pinctrl_commit_state+0x150/0x26c >> pinctrl_enable+0x6c/0x2a4 >> pinctrl_register+0x3c/0xb0 >> devm_pinctrl_register+0x58/0xa0 >> msm_pinctrl_probe+0x2a8/0x584 >> sdm845_pinctrl_probe+0x20/0x88 >> platform_probe+0x68/0xc0 >> really_probe+0xbc/0x298 >> __driver_probe_device+0x78/0x12c >> driver_probe_device+0x3c/0x160 >> __device_attach_driver+0xb8/0x138 >> bus_for_each_drv+0x84/0xe0 >> __device_attach+0x9c/0x188 >> device_initial_probe+0x14/0x20 >> bus_probe_device+0xac/0xb0 >> deferred_probe_work_func+0x8c/0xc8 >> process_one_work+0x208/0x5e8 >> worker_thread+0x1b4/0x35c >> kthread+0x144/0x220 >> ret_from_fork+0x10/0x20 >> Code: b5fffba0 17fffff2 9432ec27 f9400400 (f9428800) >> >> Fixes: 8015443e24e7 ("gpio: Hide valid_mask from direct assignments") >> Reported-by: Doug Anderson <dianders@chromium.org> >> Closes: https://lore.kernel.org/r/CAD=FV=Vg8_ZOLgLoC4WhFPzhVsxXFC19NrF38W6cW_W_3nFjbw@mail.gmail.com >> Tested-by: Douglas Anderson <dianders@chromium.org> >> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> > > (...) >> + /* >> + * hog pins are requested before registering GPIO chip >> + */ >> + if (!gc->gpiodev) >> + return true; > > LGTM, Bartosz if it's fine with you as well can you ACK this and I'll > stick the patches in fixes and get it to Torvalds pronto. > > Yours, > Linus Walleij > Sure, Acked-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Hi, On Tue, May 13, 2025 at 11:39 AM Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> wrote: > > On Qualcomm platforms if the board uses GPIO hogs msm_pinmux_request() > calls gpiochip_line_is_valid(). After commit 8015443e24e7 ("gpio: Hide > valid_mask from direct assignments") gpiochip_line_is_valid() uses > gc->gpiodev, which is NULL when GPIO hog pins are being processed. > Thus after this commit using GPIO hogs causes the following crash. In > order to fix this, verify that gc->gpiodev is not NULL. > > Note: it is not possible to reorder calls (e.g. by calling > msm_gpio_init() before pinctrl registration or by splitting > pinctrl_register() into _and_init() and pinctrl_enable() and calling the > latter function after msm_gpio_init()) because GPIO chip registration > would fail with EPROBE_DEFER if pinctrl is not enabled at the time of > registration. > > pc : gpiochip_line_is_valid+0x4/0x28 > lr : msm_pinmux_request+0x24/0x40 > sp : ffff8000808eb870 > x29: ffff8000808eb870 x28: 0000000000000000 x27: 0000000000000000 > x26: 0000000000000000 x25: ffff726240f9d040 x24: 0000000000000000 > x23: ffff7262438c0510 x22: 0000000000000080 x21: ffff726243ea7000 > x20: ffffab13f2c4e698 x19: 0000000000000080 x18: 00000000ffffffff > x17: ffff726242ba6000 x16: 0000000000000100 x15: 0000000000000028 > x14: 0000000000000000 x13: 0000000000002948 x12: 0000000000000003 > x11: 0000000000000078 x10: 0000000000002948 x9 : ffffab13f50eb5e8 > x8 : 0000000003ecb21b x7 : 000000000000002d x6 : 0000000000000b68 > x5 : 0000007fffffffff x4 : ffffab13f52f84a8 x3 : ffff8000808eb804 > x2 : ffffab13f1de8190 x1 : 0000000000000080 x0 : 0000000000000000 > Call trace: > gpiochip_line_is_valid+0x4/0x28 (P) > pin_request+0x208/0x2c0 > pinmux_enable_setting+0xa0/0x2e0 > pinctrl_commit_state+0x150/0x26c > pinctrl_enable+0x6c/0x2a4 > pinctrl_register+0x3c/0xb0 > devm_pinctrl_register+0x58/0xa0 > msm_pinctrl_probe+0x2a8/0x584 > sdm845_pinctrl_probe+0x20/0x88 > platform_probe+0x68/0xc0 > really_probe+0xbc/0x298 > __driver_probe_device+0x78/0x12c > driver_probe_device+0x3c/0x160 > __device_attach_driver+0xb8/0x138 > bus_for_each_drv+0x84/0xe0 > __device_attach+0x9c/0x188 > device_initial_probe+0x14/0x20 > bus_probe_device+0xac/0xb0 > deferred_probe_work_func+0x8c/0xc8 > process_one_work+0x208/0x5e8 > worker_thread+0x1b4/0x35c > kthread+0x144/0x220 > ret_from_fork+0x10/0x20 > Code: b5fffba0 17fffff2 9432ec27 f9400400 (f9428800) > > Fixes: 8015443e24e7 ("gpio: Hide valid_mask from direct assignments") > Reported-by: Doug Anderson <dianders@chromium.org> > Closes: https://lore.kernel.org/r/CAD=FV=Vg8_ZOLgLoC4WhFPzhVsxXFC19NrF38W6cW_W_3nFjbw@mail.gmail.com > Tested-by: Douglas Anderson <dianders@chromium.org> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> > --- > drivers/gpio/gpiolib.c | 6 ++++++ > 1 file changed, 6 insertions(+) FWIW since it's changed slightly from the last version, I re-tested just to be sure. Still works for me. Thanks! -Doug
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index c787c9310e85af4c22ffc9bb8e791931fd056c89..250d47f77e2bc678b83f51958ca1bcc4db42928f 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -784,6 +784,12 @@ EXPORT_SYMBOL_GPL(gpiochip_query_valid_mask); bool gpiochip_line_is_valid(const struct gpio_chip *gc, unsigned int offset) { + /* + * hog pins are requested before registering GPIO chip + */ + if (!gc->gpiodev) + return true; + /* No mask means all valid */ if (likely(!gc->gpiodev->valid_mask)) return true;