Commit f90c6bdb authored by Linus Walleij's avatar Linus Walleij

gpio: f7188x: use the new open drain callback

The F7188x chips supports setting the pins in open drain mode.
Activate the new .set_single_ended() callback.

Cc: Peter Hung <hpeter@gmail.com>
Cc: Andreas Bofjall <andreas@gazonk.org>
Cc: Simon Guinot <simon.guinot@sequanux.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 148c8642
...@@ -130,6 +130,9 @@ static int f7188x_gpio_get(struct gpio_chip *chip, unsigned offset); ...@@ -130,6 +130,9 @@ static int f7188x_gpio_get(struct gpio_chip *chip, unsigned offset);
static int f7188x_gpio_direction_out(struct gpio_chip *chip, static int f7188x_gpio_direction_out(struct gpio_chip *chip,
unsigned offset, int value); unsigned offset, int value);
static void f7188x_gpio_set(struct gpio_chip *chip, unsigned offset, int value); static void f7188x_gpio_set(struct gpio_chip *chip, unsigned offset, int value);
static int f7188x_gpio_set_single_ended(struct gpio_chip *gc,
unsigned offset,
enum single_ended_mode mode);
#define F7188X_GPIO_BANK(_base, _ngpio, _regbase) \ #define F7188X_GPIO_BANK(_base, _ngpio, _regbase) \
{ \ { \
...@@ -140,6 +143,7 @@ static void f7188x_gpio_set(struct gpio_chip *chip, unsigned offset, int value); ...@@ -140,6 +143,7 @@ static void f7188x_gpio_set(struct gpio_chip *chip, unsigned offset, int value);
.get = f7188x_gpio_get, \ .get = f7188x_gpio_get, \
.direction_output = f7188x_gpio_direction_out, \ .direction_output = f7188x_gpio_direction_out, \
.set = f7188x_gpio_set, \ .set = f7188x_gpio_set, \
.set_single_ended = f7188x_gpio_set_single_ended, \
.base = _base, \ .base = _base, \
.ngpio = _ngpio, \ .ngpio = _ngpio, \
.can_sleep = true, \ .can_sleep = true, \
...@@ -301,6 +305,35 @@ static void f7188x_gpio_set(struct gpio_chip *chip, unsigned offset, int value) ...@@ -301,6 +305,35 @@ static void f7188x_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
superio_exit(sio->addr); superio_exit(sio->addr);
} }
static int f7188x_gpio_set_single_ended(struct gpio_chip *chip,
unsigned offset,
enum single_ended_mode mode)
{
int err;
struct f7188x_gpio_bank *bank = gpiochip_get_data(chip);
struct f7188x_sio *sio = bank->data->sio;
u8 data;
if (mode != LINE_MODE_OPEN_DRAIN &&
mode != LINE_MODE_PUSH_PULL)
return -ENOTSUPP;
err = superio_enter(sio->addr);
if (err)
return err;
superio_select(sio->addr, SIO_LD_GPIO);
data = superio_inb(sio->addr, gpio_out_mode(bank->regbase));
if (mode == LINE_MODE_OPEN_DRAIN)
data &= ~BIT(offset);
else
data |= BIT(offset);
superio_outb(sio->addr, gpio_data_mode(bank->regbase), data);
superio_exit(sio->addr);
return 0;
}
/* /*
* Platform device and driver. * Platform device and driver.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment