• Christian Lamparter's avatar
    pinctrl: msm: fix gpio-hog related boot issues · d5800cff
    Christian Lamparter authored
    commit a86caa9ba5d70696ceb35d1d39caa20d8b641387 upstream.
    
    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: 's avatarSven Eckelmann <sven.eckelmann@openmesh.com>
    Tested-by: Sven Eckelmann <sven.eckelmann@openmesh.com> [ipq4019]
    Reviewed-by: 's avatarBjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: 's avatarChristian Lamparter <chunkeey@gmail.com>
    Signed-off-by: 's avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: 's avatarAmit Pundir <amit.pundir@linaro.org>
    Signed-off-by: 's avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d5800cff
Name
Last commit
Last update
Documentation Loading commit data...
arch Loading commit data...
block Loading commit data...
certs Loading commit data...
crypto Loading commit data...
drivers Loading commit data...
firmware Loading commit data...
fs Loading commit data...
include Loading commit data...
init Loading commit data...
ipc Loading commit data...
kernel Loading commit data...
lib Loading commit data...
mm Loading commit data...
net Loading commit data...
samples Loading commit data...
scripts Loading commit data...
security Loading commit data...
sound Loading commit data...
tools Loading commit data...
usr Loading commit data...
virt Loading commit data...
.get_maintainer.ignore Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
Kbuild Loading commit data...
Kconfig Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README Loading commit data...
REPORTING-BUGS Loading commit data...