Skip to content

Commit a86caa9

Browse files
chunkeeylinusw
authored andcommitted
pinctrl: msm: fix gpio-hog related boot issues
Sven Eckelmann reported an issue with the current IPQ4019 pinctrl. Setting up any gpio-hog in the device-tree for his device would "kill the bootup completely": | [ 0.477838] msm_serial 78af000.serial: could not find pctldev for node /soc/pinctrl@1000000/serial_pinmux, deferring probe | [ 0.499828] spi_qup 78b5000.spi: could not find pctldev for node /soc/pinctrl@1000000/spi_0_pinmux, deferring probe | [ 1.298883] requesting hog GPIO enable USB2 power (chip 1000000.pinctrl, offset 58) failed, -517 | [ 1.299609] gpiochip_add_data: GPIOs 0..99 (1000000.pinctrl) failed to register | [ 1.308589] ipq4019-pinctrl 1000000.pinctrl: Failed register gpiochip | [ 1.316586] msm_serial 78af000.serial: could not find pctldev for node /soc/pinctrl@1000000/serial_pinmux, deferring probe | [ 1.322415] spi_qup 78b5000.spi: could not find pctldev for node /soc/pinctrl@1000000/spi_0_pinmux, deferri This was also verified on a RT-AC58U (IPQ4018) which would no longer boot, if a gpio-hog was specified. (Tried forcing the USB LED PIN (GPIO0) to high.). The problem is that Pinctrl+GPIO registration is currently peformed in the following order in pinctrl-msm.c: 1. pinctrl_register() 2. gpiochip_add() 3. gpiochip_add_pin_range() The actual error code -517 == -EPROBE_DEFER is coming from pinctrl_get_device_gpio_range(), which is called through: gpiochip_add of_gpiochip_add of_gpiochip_scan_gpios gpiod_hog gpiochip_request_own_desc __gpiod_request chip->request gpiochip_generic_request pinctrl_gpio_request pinctrl_get_device_gpio_range pinctrl_get_device_gpio_range() is unable to find any valid pin ranges, since nothing has been added to the pinctrldev_list yet. so the range can't be found, and the operation fails with -EPROBE_DEFER. This patch fixes the issue by adding the "gpio-ranges" property to the pinctrl device node of all upstream Qcom SoC. The pin ranges are then added by the gpio core. In order to remain compatible with older, existing DTs (and ACPI) a check for the "gpio-ranges" property has been added to msm_gpio_init(). This prevents the driver of adding the same entry to the pinctrldev_list twice. Reported-by: Sven Eckelmann <[email protected]> Tested-by: Sven Eckelmann <[email protected]> [ipq4019] Reviewed-by: Bjorn Andersson <[email protected]> Signed-off-by: Christian Lamparter <[email protected]> Signed-off-by: Linus Walleij <[email protected]>
1 parent 21432a8 commit a86caa9

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

drivers/pinctrl/qcom/pinctrl-msm.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -901,11 +901,24 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
901901
return ret;
902902
}
903903

904-
ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev), 0, 0, chip->ngpio);
905-
if (ret) {
906-
dev_err(pctrl->dev, "Failed to add pin range\n");
907-
gpiochip_remove(&pctrl->chip);
908-
return ret;
904+
/*
905+
* For DeviceTree-supported systems, the gpio core checks the
906+
* pinctrl's device node for the "gpio-ranges" property.
907+
* If it is present, it takes care of adding the pin ranges
908+
* for the driver. In this case the driver can skip ahead.
909+
*
910+
* In order to remain compatible with older, existing DeviceTree
911+
* files which don't set the "gpio-ranges" property or systems that
912+
* utilize ACPI the driver has to call gpiochip_add_pin_range().
913+
*/
914+
if (!of_property_read_bool(pctrl->dev->of_node, "gpio-ranges")) {
915+
ret = gpiochip_add_pin_range(&pctrl->chip,
916+
dev_name(pctrl->dev), 0, 0, chip->ngpio);
917+
if (ret) {
918+
dev_err(pctrl->dev, "Failed to add pin range\n");
919+
gpiochip_remove(&pctrl->chip);
920+
return ret;
921+
}
909922
}
910923

911924
ret = gpiochip_irqchip_add(chip,

0 commit comments

Comments
 (0)