sc16is7xx: Update status lines in single call
authorLech Perczak <l.perczak@camlintechnologies.com>
Mon, 21 Feb 2022 10:56:14 +0000 (11:56 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Feb 2022 09:24:27 +0000 (10:24 +0100)
RTS, DTR and LOOP bits can be updated in a single MCR register update.
This reduces the number of (slow) SPI/I2C bus transactions.

Signed-off-by: Lech Perczak <l.perczak@camlintechnologies.com>
Signed-off-by: Tomasz Moń <tomasz.mon@camlingroup.com>
Link: https://lore.kernel.org/r/20220221105618.3503470-3-tomasz.mon@camlingroup.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/sc16is7xx.c

index 3a808b2..a2873ac 100644 (file)
@@ -784,19 +784,24 @@ static void sc16is7xx_reg_proc(struct kthread_work *ws)
        spin_unlock_irqrestore(&one->port.lock, irqflags);
 
        if (config.flags & SC16IS7XX_RECONF_MD) {
+               u8 mcr = 0;
+
+               /* Device ignores RTS setting when hardware flow is enabled */
+               if (one->port.mctrl & TIOCM_RTS)
+                       mcr |= SC16IS7XX_MCR_RTS_BIT;
+
+               if (one->port.mctrl & TIOCM_DTR)
+                       mcr |= SC16IS7XX_MCR_DTR_BIT;
+
+               if (one->port.mctrl & TIOCM_LOOP)
+                       mcr |= SC16IS7XX_MCR_LOOP_BIT;
                sc16is7xx_port_update(&one->port, SC16IS7XX_MCR_REG,
+                                     SC16IS7XX_MCR_RTS_BIT |
+                                     SC16IS7XX_MCR_DTR_BIT |
                                      SC16IS7XX_MCR_LOOP_BIT,
-                                     (one->port.mctrl & TIOCM_LOOP) ?
-                                     SC16IS7XX_MCR_LOOP_BIT : 0);
-               sc16is7xx_port_update(&one->port, SC16IS7XX_MCR_REG,
-                                     SC16IS7XX_MCR_RTS_BIT,
-                                     (one->port.mctrl & TIOCM_RTS) ?
-                                     SC16IS7XX_MCR_RTS_BIT : 0);
-               sc16is7xx_port_update(&one->port, SC16IS7XX_MCR_REG,
-                                     SC16IS7XX_MCR_DTR_BIT,
-                                     (one->port.mctrl & TIOCM_DTR) ?
-                                     SC16IS7XX_MCR_DTR_BIT : 0);
+                                     mcr);
        }
+
        if (config.flags & SC16IS7XX_RECONF_IER)
                sc16is7xx_port_update(&one->port, SC16IS7XX_IER_REG,
                                      config.ier_clear, 0);