tty: make tty_get_{char,frame}_size available
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>
This commit is contained in:
Родитель
fb524360f5
Коммит
654ee49b7e
|
@ -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);
|
||||
|
|
|
@ -279,6 +279,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
|
||||
|
|
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче