pinctrl: xway: fix gpio-hog related boot issues
authorMartin Schiller <ms@dev.tdt.de>
Fri, 14 Dec 2018 07:48:25 +0000 (08:48 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2019 14:37:27 +0000 (15:37 +0100)
[ Upstream commit 9b4924da4711674e62d97d4f5360446cc78337af ]

This patch is based on commit a86caa9ba5d7 ("pinctrl: msm: fix gpio-hog
related boot issues").

It fixes the issue that the gpio ranges needs to be defined before
gpiochip_add().

Therefore, we also have to swap the order of registering the pinctrl
driver and registering the gpio chip.

You also have to add the "gpio-ranges" property to the pinctrl device
node to get it finally working.

Signed-off-by: Martin Schiller <ms@dev.tdt.de>
Acked-by: John Crispin <john@phrozen.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/pinctrl/pinctrl-xway.c

index f9e98a7d4f0ce088617a4bd4bf90511793809941..1b0c5958c56a7e61ecf1f7a740b2457e6354c933 100644 (file)
@@ -1748,14 +1748,6 @@ static int pinmux_xway_probe(struct platform_device *pdev)
        }
        xway_pctrl_desc.pins = xway_info.pads;
 
-       /* register the gpio chip */
-       xway_chip.parent = &pdev->dev;
-       ret = devm_gpiochip_add_data(&pdev->dev, &xway_chip, NULL);
-       if (ret) {
-               dev_err(&pdev->dev, "Failed to register gpio chip\n");
-               return ret;
-       }
-
        /* setup the data needed by pinctrl */
        xway_pctrl_desc.name    = dev_name(&pdev->dev);
        xway_pctrl_desc.npins   = xway_chip.ngpio;
@@ -1777,10 +1769,33 @@ static int pinmux_xway_probe(struct platform_device *pdev)
                return ret;
        }
 
-       /* finish with registering the gpio range in pinctrl */
-       xway_gpio_range.npins = xway_chip.ngpio;
-       xway_gpio_range.base = xway_chip.base;
-       pinctrl_add_gpio_range(xway_info.pctrl, &xway_gpio_range);
+       /* register the gpio chip */
+       xway_chip.parent = &pdev->dev;
+       xway_chip.owner = THIS_MODULE;
+       xway_chip.of_node = pdev->dev.of_node;
+       ret = devm_gpiochip_add_data(&pdev->dev, &xway_chip, NULL);
+       if (ret) {
+               dev_err(&pdev->dev, "Failed to register gpio chip\n");
+               return ret;
+       }
+
+       /*
+        * For DeviceTree-supported systems, the gpio core checks the
+        * pinctrl's device node for the "gpio-ranges" property.
+        * If it is present, it takes care of adding the pin ranges
+        * for the driver. In this case the driver can skip ahead.
+        *
+        * In order to remain compatible with older, existing DeviceTree
+        * files which don't set the "gpio-ranges" property or systems that
+        * utilize ACPI the driver has to call gpiochip_add_pin_range().
+        */
+       if (!of_property_read_bool(pdev->dev.of_node, "gpio-ranges")) {
+               /* finish with registering the gpio range in pinctrl */
+               xway_gpio_range.npins = xway_chip.ngpio;
+               xway_gpio_range.base = xway_chip.base;
+               pinctrl_add_gpio_range(xway_info.pctrl, &xway_gpio_range);
+       }
+
        dev_info(&pdev->dev, "Init done\n");
        return 0;
 }