]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
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)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 17 Dec 2018 22:11:18 +0000 (23:11 +0100)
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>
drivers/pinctrl/pinctrl-xway.c

index 93f8bd04e7fe69ab92bb48c2715aa24371d315c3..ae74b260b014bddd2700b4edca00f44c99d3e84a 100644 (file)
@@ -1746,14 +1746,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;
@@ -1775,10 +1767,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;
 }