From 223762b9d81e205f2fb147ec512931604a71653d Mon Sep 17 00:00:00 2001 From: Nicolai Buchwitz Date: Sun, 26 Jul 2026 00:33:55 +0200 Subject: [PATCH] pinctrl: rp1: enable strict pinmux mode Pins claimed for a peripheral function can be taken over through the GPIO chardev, which rewrites FUNCSEL. On Pi 5 reading the USB overcurrent pin this way trips the overcurrent latch and disables all USB ports, and requesting GPIO 42 as output cuts VBUS entirely. Enable strict pinmux so GPIO requests on function pins are rejected. Implement function_is_gpio so pins muxed as GPIO, including hogs and legacy brcm,function maps, stay requestable. This matches the BCM2712 pinctrl-brcmstb driver. Link: https://github.com/raspberrypi/linux/issues/5870 Signed-off-by: Nicolai Buchwitz --- drivers/pinctrl/pinctrl-rp1.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/pinctrl/pinctrl-rp1.c b/drivers/pinctrl/pinctrl-rp1.c index 7e8f5f600ea495..60143d876ecf86 100644 --- a/drivers/pinctrl/pinctrl-rp1.c +++ b/drivers/pinctrl/pinctrl-rp1.c @@ -1333,6 +1333,12 @@ static int rp1_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, return 0; } +static bool rp1_pmx_function_is_gpio(struct pinctrl_dev *pctldev, + unsigned int selector) +{ + return selector == func_gpio; +} + static const struct pinmux_ops rp1_pmx_ops = { .free = rp1_pmx_free, .get_functions_count = rp1_pmx_get_functions_count, @@ -1341,6 +1347,8 @@ static const struct pinmux_ops rp1_pmx_ops = { .set_mux = rp1_pmx_set, .gpio_disable_free = rp1_pmx_gpio_disable_free, .gpio_set_direction = rp1_pmx_gpio_set_direction, + .function_is_gpio = rp1_pmx_function_is_gpio, + .strict = true, }; static void rp1_pull_config_set(struct rp1_pin_info *pin, unsigned int arg)