]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/commitdiff
gpio: tegra: call pinctrl direction apis for direction input/output
authorSuresh Mangipudi <smangipudi@nvidia.com>
Tue, 17 Jan 2017 11:57:09 +0000 (17:27 +0530)
committermobile promotions <svcmobile_promotions@nvidia.com>
Fri, 20 Jan 2017 12:43:52 +0000 (04:43 -0800)
Set the pins in different direction based on client request from gpio.
This will help to non-tristate the pin on gpio output mode or enable
input on gpio input mode without any explicit condition.

Bug 200270587

Based on
ca7d841ee gpio: tegra: call pinctrl direction apis for direction input/output

Change-Id: I23205a56b62c67585025551cb929b06928bcc344
Signed-off-by: Suresh Mangipudi <smangipudi@nvidia.com>
Reviewed-on: http://git-master/r/1286774
Reviewed-by: David Yu (Engrg-SW) <davyu@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
drivers/gpio/gpio-tegra.c

index 8d018df9044f5cbd4c6c2c387fd7b093fcac0298..ebe001d8e91b02e1bfca135fefaec443852b9c62 100644 (file)
@@ -143,14 +143,14 @@ static void tegra_gpio_disable(struct tegra_gpio_info *tgi, int gpio)
 
 static int tegra_gpio_request(struct gpio_chip *chip, unsigned offset)
 {
-       return pinctrl_request_gpio(offset);
+       return pinctrl_request_gpio(chip->base + offset);
 }
 
 static void tegra_gpio_free(struct gpio_chip *chip, unsigned offset)
 {
        struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
 
-       pinctrl_free_gpio(offset);
+       pinctrl_free_gpio(chip->base + offset);
        tegra_gpio_disable(tgi, offset);
 }
 
@@ -175,22 +175,38 @@ static int tegra_gpio_get(struct gpio_chip *chip, unsigned offset)
 
 static int tegra_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 {
+       int ret;
        struct tegra_gpio_info *tgi = gpiochip_get_data(chip);
 
        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, unsigned offset,
                                        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, unsigned offset)