From c7547b6464d4fd46bf603eaef6628137633f96e1 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 3 Sep 2023 14:43:58 +0200 Subject: [PATCH] 4.14-stable patches added patches: serial-sc16is7xx-fix-bug-when-first-setting-gpio-direction.patch --- ...ug-when-first-setting-gpio-direction.patch | 59 +++++++++++++++++++ queue-4.14/series | 1 + 2 files changed, 60 insertions(+) create mode 100644 queue-4.14/serial-sc16is7xx-fix-bug-when-first-setting-gpio-direction.patch diff --git a/queue-4.14/serial-sc16is7xx-fix-bug-when-first-setting-gpio-direction.patch b/queue-4.14/serial-sc16is7xx-fix-bug-when-first-setting-gpio-direction.patch new file mode 100644 index 00000000000..663324ddec7 --- /dev/null +++ b/queue-4.14/serial-sc16is7xx-fix-bug-when-first-setting-gpio-direction.patch @@ -0,0 +1,59 @@ +From 9baeea723c0fb9c3ba9a336369f758ed9bc6831d Mon Sep 17 00:00:00 2001 +From: Hugo Villeneuve +Date: Mon, 7 Aug 2023 17:45:55 -0400 +Subject: serial: sc16is7xx: fix bug when first setting GPIO direction + +From: Hugo Villeneuve + +commit 9baeea723c0fb9c3ba9a336369f758ed9bc6831d upstream. + +When configuring a pin as an output pin with a value of logic 0, we +end up as having a value of logic 1 on the output pin. Setting a +logic 0 a second time (or more) after that will correctly output a +logic 0 on the output pin. + +By default, all GPIO pins are configured as inputs. When we enter +sc16is7xx_gpio_direction_output() for the first time, we first set the +desired value in IOSTATE, and then we configure the pin as an output. +The datasheet states that writing to IOSTATE register will trigger a +transfer of the value to the I/O pin configured as output, so if the +pin is configured as an input, nothing will be transferred. + +Therefore, set the direction first in IODIR, and then set the desired +value in IOSTATE. + +This is what is done in NXP application note AN10587. + +Fixes: dfeae619d781 ("serial: sc16is7xx") +Cc: stable@vger.kernel.org +Signed-off-by: Hugo Villeneuve +Reviewed-by: Lech Perczak +Tested-by: Lech Perczak +Link: https://lore.kernel.org/r/20230807214556.540627-6-hugo@hugovil.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/sc16is7xx.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +--- a/drivers/tty/serial/sc16is7xx.c ++++ b/drivers/tty/serial/sc16is7xx.c +@@ -1171,9 +1171,18 @@ static int sc16is7xx_gpio_direction_outp + state |= BIT(offset); + else + state &= ~BIT(offset); +- sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state); ++ ++ /* ++ * If we write IOSTATE first, and then IODIR, the output value is not ++ * transferred to the corresponding I/O pin. ++ * The datasheet states that each register bit will be transferred to ++ * the corresponding I/O pin programmed as output when writing to ++ * IOSTATE. Therefore, configure direction first with IODIR, and then ++ * set value after with IOSTATE. ++ */ + sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset), + BIT(offset)); ++ sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state); + + return 0; + } diff --git a/queue-4.14/series b/queue-4.14/series index f66aa9af863..b298b883662 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -6,3 +6,4 @@ usb-serial-option-add-quectel-em05g-variant-0x030e.patch usb-serial-option-add-foxconn-t99w368-t99w373-product.patch hid-wacom-remove-the-battery-when-the-ekr-is-off.patch bluetooth-btsdio-fix-use-after-free-bug-in-btsdio_remove-due-to-race-condition.patch +serial-sc16is7xx-fix-bug-when-first-setting-gpio-direction.patch -- 2.47.3