gpio: tegra: Fix offset of pinctrl calls
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 19 Feb 2019 20:32:02 +0000 (21:32 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 19 Feb 2019 20:48:20 +0000 (21:48 +0100)
This patch hunk is a lightly modified version of a diff found
in a Tegra code dump from a product tree. It makes a lot of
sense because this is what most drivers do.

Cc: Thierry Reding <treding@nvidia.com>
Cc: Stefan Agner <stefan@agner.ch>
Cc: Dmitry Osipenko <digetx@gmail.com>
Cc: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-tegra.c

index 02f6db9..1ececf2 100644 (file)
@@ -2,6 +2,7 @@
  * arch/arm/mach-tegra/gpio.c
  *
  * Copyright (c) 2010 Google, Inc
+ * Copyright (c) 2011-2016, NVIDIA CORPORATION.  All rights reserved.
  *
  * Author:
  *     Erik Gilling <konkers@google.com>
@@ -141,14 +142,14 @@ static void tegra_gpio_disable(struct tegra_gpio_info *tgi, unsigned int gpio)
 
 static int tegra_gpio_request(struct gpio_chip *chip, unsigned int offset)
 {
-       return pinctrl_gpio_request(offset);
+       return pinctrl_gpio_request(chip->base + offset);
 }
 
 static void tegra_gpio_free(struct gpio_chip *chip, unsigned int offset)
 {
        struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
 
-       pinctrl_gpio_free(offset);
+       pinctrl_gpio_free(chip->base + offset);
        tegra_gpio_disable(tgi, offset);
 }
 
@@ -176,10 +177,18 @@ static int tegra_gpio_direction_input(struct gpio_chip *chip,
                                      unsigned int offset)
 {
        struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
+       int ret;
 
        tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, offset), offset, 0);
        tegra_gpio_enable(tgi, offset);
-       return 0;
+
+       ret = pinctrl_gpio_direction_input(chip->base + offset);
+       if (ret < 0)
+               dev_err(tgi->dev,
+                       "Failed to set pinctrl input direction of GPIO %d: %d",
+                        chip->base + offset, ret);
+
+       return ret;
 }
 
 static int tegra_gpio_direction_output(struct gpio_chip *chip,
@@ -187,11 +196,19 @@ static int tegra_gpio_direction_output(struct gpio_chip *chip,
                                       int value)
 {
        struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
+       int ret;
 
        tegra_gpio_set(chip, offset, value);
        tegra_gpio_mask_write(tgi, GPIO_MSK_OE(tgi, offset), offset, 1);
        tegra_gpio_enable(tgi, offset);
-       return 0;
+
+       ret = pinctrl_gpio_direction_output(chip->base + offset);
+       if (ret < 0)
+               dev_err(tgi->dev,
+                       "Failed to set pinctrl output direction of GPIO %d: %d",
+                        chip->base + offset, ret);
+
+       return ret;
 }
 
 static int tegra_gpio_get_direction(struct gpio_chip *chip,