diff options
author | Francois Berder <Francois.Berder@imgtec.com> | 2016-10-25 08:24:13 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-10-27 10:42:31 -0400 |
commit | 03842c17397e14cb8bb1adc2015f5dce6c733ffe (patch) | |
tree | da2b5574afe85eac58b3d82ed73fac98b8ead2da /drivers/tty | |
parent | c03e1b8703a4a0c8bac7f6b65d8fcb539ec62d82 (diff) |
sc16is7xx: always write state when configuring GPIO as an output
The regmap_update first reads the IOState register and then triggers
a write if needed. However, GPIOS might be configured as an input so
the read to IOState on this GPIO is the current state which might
be random.
Signed-off-by: Francois Berder <Francois.Berder@imgtec.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/sc16is7xx.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c index 2675792a8f59..fb0672554123 100644 --- a/drivers/tty/serial/sc16is7xx.c +++ b/drivers/tty/serial/sc16is7xx.c | |||
@@ -1130,9 +1130,13 @@ static int sc16is7xx_gpio_direction_output(struct gpio_chip *chip, | |||
1130 | { | 1130 | { |
1131 | struct sc16is7xx_port *s = gpiochip_get_data(chip); | 1131 | struct sc16is7xx_port *s = gpiochip_get_data(chip); |
1132 | struct uart_port *port = &s->p[0].port; | 1132 | struct uart_port *port = &s->p[0].port; |
1133 | u8 state = sc16is7xx_port_read(port, SC16IS7XX_IOSTATE_REG); | ||
1133 | 1134 | ||
1134 | sc16is7xx_port_update(port, SC16IS7XX_IOSTATE_REG, BIT(offset), | 1135 | if (val) |
1135 | val ? BIT(offset) : 0); | 1136 | state |= BIT(offset); |
1137 | else | ||
1138 | state &= ~BIT(offset); | ||
1139 | sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state); | ||
1136 | sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset), | 1140 | sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset), |
1137 | BIT(offset)); | 1141 | BIT(offset)); |
1138 | 1142 | ||