tty: make tty_get_{char,frame}_size available
authorJiri Slaby <jslaby@suse.cz>
Thu, 10 Jun 2021 09:02:44 +0000 (11:02 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 15 Jun 2021 12:03:26 +0000 (14:03 +0200)
Many tty drivers contain code to compute bits count depending on termios
cflags. So extract this code from serial core to two separate tty helper
functions:
* tty_get_char_size -- only size of a character, without flags,
* tty_get_frame_size -- complete size of a frame including flags.

In the next patch, calls to these new functions replace many copies of
this code.

Note that we accept only cflag as a parameter. That's because some
callers like pch_uart_startup or sunsab_console_setup don't have at hand
termios which we could pass around.

Cc: Joe Perches <joe@perches.com>
Cc: Johan Hovold <johan@kernel.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20210610090247.2593-1-jslaby@suse.cz
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_core.c
drivers/tty/tty_ioctl.c
include/linux/tty.h

index 642e24d..69092de 100644 (file)
@@ -334,39 +334,15 @@ void
 uart_update_timeout(struct uart_port *port, unsigned int cflag,
                    unsigned int baud)
 {
-       unsigned int bits;
+       unsigned int size;
 
-       /* byte size and parity */
-       switch (cflag & CSIZE) {
-       case CS5:
-               bits = 7;
-               break;
-       case CS6:
-               bits = 8;
-               break;
-       case CS7:
-               bits = 9;
-               break;
-       default:
-               bits = 10;
-               break; /* CS8 */
-       }
-
-       if (cflag & CSTOPB)
-               bits++;
-       if (cflag & PARENB)
-               bits++;
-
-       /*
-        * The total number of bits to be transmitted in the fifo.
-        */
-       bits = bits * port->fifosize;
+       size = tty_get_frame_size(cflag) * port->fifosize;
 
        /*
         * Figure the timeout to send the above number of bits.
         * Add .02 seconds of slop
         */
-       port->timeout = (HZ * bits) / baud + HZ/50;
+       port->timeout = (HZ * size) / baud + HZ/50;
 }
 
 EXPORT_SYMBOL(uart_update_timeout);
index 75885d5..507a25d 100644 (file)
@@ -280,6 +280,51 @@ int tty_termios_hw_change(const struct ktermios *a, const struct ktermios *b)
 EXPORT_SYMBOL(tty_termios_hw_change);
 
 /**
+ *     tty_get_char_size       -       get size of a character
+ *     @cflag: termios cflag value
+ *
+ *     Get the size (in bits) of a character depending on @cflag's %CSIZE
+ *     setting.
+ */
+unsigned char tty_get_char_size(unsigned int cflag)
+{
+       switch (cflag & CSIZE) {
+       case CS5:
+               return 5;
+       case CS6:
+               return 6;
+       case CS7:
+               return 7;
+       case CS8:
+       default:
+               return 8;
+       }
+}
+EXPORT_SYMBOL_GPL(tty_get_char_size);
+
+/**
+ *     tty_get_frame_size      -       get size of a frame
+ *     @cflag: termios cflag value
+ *
+ *     Get the size (in bits) of a frame depending on @cflag's %CSIZE, %CSTOPB,
+ *     and %PARENB setting. The result is a sum of character size, start and
+ *     stop bits -- one bit each -- second stop bit (if set), and parity bit
+ *     (if set).
+ */
+unsigned char tty_get_frame_size(unsigned int cflag)
+{
+       unsigned char bits = 2 + tty_get_char_size(cflag);
+
+       if (cflag & CSTOPB)
+               bits++;
+       if (cflag & PARENB)
+               bits++;
+
+       return bits;
+}
+EXPORT_SYMBOL_GPL(tty_get_frame_size);
+
+/**
  *     tty_set_termios         -       update termios values
  *     @tty: tty to update
  *     @new_termios: desired new value
index 4c0c7ca..19dc109 100644 (file)
@@ -495,6 +495,9 @@ static inline speed_t tty_get_baud_rate(struct tty_struct *tty)
        return tty_termios_baud_rate(&tty->termios);
 }
 
+unsigned char tty_get_char_size(unsigned int cflag);
+unsigned char tty_get_frame_size(unsigned int cflag);
+
 extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old);
 extern int tty_termios_hw_change(const struct ktermios *a, const struct ktermios *b);
 extern int tty_set_termios(struct tty_struct *tty, struct ktermios *kt);