| From 1f772932eb41d00e0656ce4d1c5b66a67ee314ef Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 14 Dec 2018 08:48:25 +0100 |
| Subject: pinctrl: xway: fix gpio-hog related boot issues |
| |
| From: Martin Schiller <ms@dev.tdt.de> |
| |
| [ 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 | 39 +++++++++++++++++++++++----------- |
| 1 file changed, 27 insertions(+), 12 deletions(-) |
| |
| diff --git a/drivers/pinctrl/pinctrl-xway.c b/drivers/pinctrl/pinctrl-xway.c |
| index 93f8bd04e7fe6..ae74b260b014b 100644 |
| --- a/drivers/pinctrl/pinctrl-xway.c |
| +++ b/drivers/pinctrl/pinctrl-xway.c |
| @@ -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; |
| } |
| -- |
| 2.20.1 |
| |