pinctrl: tegra: Only set the gpio range if needed
authorTomeu Vizoso <tomeu.vizoso@collabora.com>
Tue, 14 Jul 2015 08:29:55 +0000 (10:29 +0200)
committerThierry Reding <treding@nvidia.com>
Thu, 13 Aug 2015 14:24:33 +0000 (16:24 +0200)
If the gpio DT node has the gpio-ranges property, the range will be
added by the gpio core and doesn't need to be added by the pinctrl
driver.

By having the gpio-ranges property, we have an explicit dependency from
the gpio node to the pinctrl node and we can stop using the deprecated
pinctrl_add_gpio_range() function.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Acked-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/pinctrl/pinctrl-tegra.c

index 0f982b829be1f83317a6fa6449efeb9e5de05461..0fd7fd2b0f72c23bd606ab0109e25c166dcdf0ee 100644 (file)
@@ -624,6 +624,22 @@ static struct pinctrl_desc tegra_pinctrl_desc = {
        .owner = THIS_MODULE,
 };
 
+static bool gpio_node_has_range(void)
+{
+       struct device_node *np;
+       bool has_prop = false;
+
+       np = of_find_compatible_node(NULL, NULL, "nvidia,tegra30-gpio");
+       if (!np)
+               return has_prop;
+
+       has_prop = of_find_property(np, "gpio-ranges", NULL);
+
+       of_node_put(np);
+
+       return has_prop;
+}
+
 int tegra_pinctrl_probe(struct platform_device *pdev,
                        const struct tegra_pinctrl_soc_data *soc_data)
 {
@@ -708,7 +724,8 @@ int tegra_pinctrl_probe(struct platform_device *pdev,
                return PTR_ERR(pmx->pctl);
        }
 
-       pinctrl_add_gpio_range(pmx->pctl, &tegra_pinctrl_gpio_range);
+       if (!gpio_node_has_range())
+               pinctrl_add_gpio_range(pmx->pctl, &tegra_pinctrl_gpio_range);
 
        platform_set_drvdata(pdev, pmx);