diff options
Diffstat (limited to 'drivers/gpio/wm831x-gpio.c')
-rw-r--r-- | drivers/gpio/wm831x-gpio.c | 21 |
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 | ||
47 | static int wm831x_gpio_get(struct gpio_chip *chip, unsigned offset) | 50 | static 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 | } |