]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pinctrl: meson: amlogic-a4: fix deadlock issue
authorXianwei Zhao <xianwei.zhao@amlogic.com>
Wed, 22 Apr 2026 11:44:13 +0000 (11:44 +0000)
committerLinus Walleij <linusw@kernel.org>
Tue, 28 Apr 2026 09:50:13 +0000 (11:50 +0200)
Accessing the pinconf-pins sysfs node may deadlock.

pinconf_pins_show() holds pctldev->mutex, and the platform driver
calls pinctrl_find_gpio_range_from_pin(), which tries to acquire
the same mutex again, leading to a deadlock.

Use pinctrl_find_gpio_range_from_pin_nolock() to fix this issue.

Fixes: 6e9be3abb78c ("pinctrl: Add driver support for Amlogic SoCs")
Signed-off-by: Xianwei Zhao <xianwei.zhao@amlogic.com>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Linus Walleij <linusw@kernel.org>
drivers/pinctrl/meson/pinctrl-amlogic-a4.c

index e2293a872dcb7ff4ae3609504bee4398caf6cfa3..35d27626a336b774d5e7462a1cfa1f2a7924e068 100644 (file)
@@ -292,7 +292,7 @@ static int aml_calc_reg_and_bit(struct pinctrl_gpio_range *range,
 static int aml_pinconf_get_pull(struct aml_pinctrl *info, unsigned int pin)
 {
        struct pinctrl_gpio_range *range =
-                        pinctrl_find_gpio_range_from_pin(info->pctl, pin);
+                        pinctrl_find_gpio_range_from_pin_nolock(info->pctl, pin);
        struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
        unsigned int reg, bit, val;
        int ret, conf;
@@ -326,7 +326,7 @@ static int aml_pinconf_get_drive_strength(struct aml_pinctrl *info,
                                          u16 *drive_strength_ua)
 {
        struct pinctrl_gpio_range *range =
-                        pinctrl_find_gpio_range_from_pin(info->pctl, pin);
+                        pinctrl_find_gpio_range_from_pin_nolock(info->pctl, pin);
        struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
        unsigned int reg, bit;
        unsigned int val;
@@ -365,7 +365,7 @@ static int aml_pinconf_get_gpio_bit(struct aml_pinctrl *info,
                                    unsigned int reg_type)
 {
        struct pinctrl_gpio_range *range =
-                        pinctrl_find_gpio_range_from_pin(info->pctl, pin);
+                        pinctrl_find_gpio_range_from_pin_nolock(info->pctl, pin);
        struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
        unsigned int reg, bit, val;
        int ret;