aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/wm831x-gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpio/wm831x-gpio.c')
-rw-r--r--drivers/gpio/wm831x-gpio.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/gpio/wm831x-gpio.c b/drivers/gpio/wm831x-gpio.c
index 2554180534a1..5b8dc098d80f 100644
--- a/drivers/gpio/wm831x-gpio.c
+++ b/drivers/gpio/wm831x-gpio.c
@@ -38,10 +38,13 @@ static int wm831x_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
38{ 38{
39 struct wm831x_gpio *wm831x_gpio = to_wm831x_gpio(chip); 39 struct wm831x_gpio *wm831x_gpio = to_wm831x_gpio(chip);
40 struct wm831x *wm831x = wm831x_gpio->wm831x; 40 struct wm831x *wm831x = wm831x_gpio->wm831x;
41 int val = WM831X_GPN_DIR;
42
43 if (wm831x->has_gpio_ena)
44 val |= WM831X_GPN_TRI;
41 45
42 return wm831x_set_bits(wm831x, WM831X_GPIO1_CONTROL + offset, 46 return wm831x_set_bits(wm831x, WM831X_GPIO1_CONTROL + offset,
43 WM831X_GPN_DIR | WM831X_GPN_TRI, 47 WM831X_GPN_DIR | WM831X_GPN_TRI, val);
44 WM831X_GPN_DIR);
45} 48}
46 49
47static int wm831x_gpio_get(struct gpio_chip *chip, unsigned offset) 50static int wm831x_gpio_get(struct gpio_chip *chip, unsigned offset)
@@ -74,10 +77,14 @@ static int wm831x_gpio_direction_out(struct gpio_chip *chip,
74{ 77{
75 struct wm831x_gpio *wm831x_gpio = to_wm831x_gpio(chip); 78 struct wm831x_gpio *wm831x_gpio = to_wm831x_gpio(chip);
76 struct wm831x *wm831x = wm831x_gpio->wm831x; 79 struct wm831x *wm831x = wm831x_gpio->wm831x;
80 int val = 0;
77 int ret; 81 int ret;
78 82
83 if (wm831x->has_gpio_ena)
84 val |= WM831X_GPN_TRI;
85
79 ret = wm831x_set_bits(wm831x, WM831X_GPIO1_CONTROL + offset, 86 ret = wm831x_set_bits(wm831x, WM831X_GPIO1_CONTROL + offset,
80 WM831X_GPN_DIR | WM831X_GPN_TRI, 0); 87 WM831X_GPN_DIR | WM831X_GPN_TRI, val);
81 if (ret < 0) 88 if (ret < 0)
82 return ret; 89 return ret;
83 90
@@ -103,7 +110,7 @@ static void wm831x_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
103{ 110{
104 struct wm831x_gpio *wm831x_gpio = to_wm831x_gpio(chip); 111 struct wm831x_gpio *wm831x_gpio = to_wm831x_gpio(chip);
105 struct wm831x *wm831x = wm831x_gpio->wm831x; 112 struct wm831x *wm831x = wm831x_gpio->wm831x;
106 int i; 113 int i, tristated;
107 114
108 for (i = 0; i < chip->ngpio; i++) { 115 for (i = 0; i < chip->ngpio; i++) {
109 int gpio = i + chip->base; 116 int gpio = i + chip->base;
@@ -170,6 +177,10 @@ static void wm831x_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
170 break; 177 break;
171 } 178 }
172 179
180 tristated = reg & WM831X_GPN_TRI;
181 if (wm831x->has_gpio_ena)
182 tristated = !tristated;
183
173 seq_printf(s, " %s %s %s %s%s\n" 184 seq_printf(s, " %s %s %s %s%s\n"
174 " %s%s (0x%4x)\n", 185 " %s%s (0x%4x)\n",
175 reg & WM831X_GPN_DIR ? "in" : "out", 186 reg & WM831X_GPN_DIR ? "in" : "out",
@@ -178,7 +189,7 @@ static void wm831x_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
178 powerdomain, 189 powerdomain,
179 reg & WM831X_GPN_POL ? "" : " inverted", 190 reg & WM831X_GPN_POL ? "" : " inverted",
180 reg & WM831X_GPN_OD ? "open-drain" : "CMOS", 191 reg & WM831X_GPN_OD ? "open-drain" : "CMOS",
181 reg & WM831X_GPN_TRI ? " tristated" : "", 192 tristated ? " tristated" : "",
182 reg); 193 reg);
183 } 194 }
184} 195}