mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 23:13:38 -04:00
Merge tag 'tty-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial driver updates from Greg KH:
"Here is the "big" set of tty/serial driver changes for 6.2-rc1.
As in previous kernel releases, nothing big here at all, just some
small incremental serial/tty layer cleanups and some individual driver
additions and fixes. Highlights are:
- serial helper macros from Jiri Slaby to reduce the amount of
duplicated code in serial drivers
- api cleanups and consolidations from Ilpo Järvinen in lots of
serial drivers
- the usual set of n_gsm fixes from Daniel Starke as that code gets
exercised more
- TIOCSTI is finally able to be disabled if requested (security
hardening feature from Kees Cook)
- fsl_lpuart driver fixes and features added
- other small serial driver additions and fixes
All of these have been in linux-next for a while with no reported
problems"
* tag 'tty-6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (97 commits)
serial: atmel: don't stop the transmitter when doing PIO
serial: atmel: cleanup atmel_start+stop_tx()
tty: serial: fsl_lpuart: switch to new dmaengine_terminate_* API
serial: sunsab: Fix error handling in sunsab_init()
serial: altera_uart: fix locking in polling mode
serial: pch: Fix PCI device refcount leak in pch_request_dma()
tty: serial: fsl_lpuart: Use pm_ptr() to avoid need to make pm __maybe_unused
tty: serial: fsl_lpuart: Add runtime pm support
tty: serial: fsl_lpuart: enable wakeup source for lpuart
serdev: Replace poll loop by readx_poll_timeout() macro
tty: synclink_gt: unwind actions in error path of net device open
serial: stm32: move dma_request_chan() before clk_prepare_enable()
dt-bindings: serial: xlnx,opb-uartlite: Drop 'contains' from 'xlnx,use-parity'
serial: pl011: Do not clear RX FIFO & RX interrupt in unthrottle.
serial: amba-pl011: avoid SBSA UART accessing DMACR register
tty: serial: altera_jtaguart: remove struct altera_jtaguart
tty: serial: altera_jtaguart: use uart_port::read_status_mask
tty: serial: altera_jtaguart: remove unused altera_jtaguart::sigs
tty: serial: altera_jtaguart: remove flag from altera_jtaguart_rx_chars()
n_tty: Rename tail to old_tail in n_tty_read()
...
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/termios.h>
|
||||
#include <linux/delay.h>
|
||||
@@ -279,18 +280,10 @@ static inline bool serdev_device_get_cts(struct serdev_device *serdev)
|
||||
|
||||
static inline int serdev_device_wait_for_cts(struct serdev_device *serdev, bool state, int timeout_ms)
|
||||
{
|
||||
unsigned long timeout;
|
||||
bool signal;
|
||||
|
||||
timeout = jiffies + msecs_to_jiffies(timeout_ms);
|
||||
while (time_is_after_jiffies(timeout)) {
|
||||
signal = serdev_device_get_cts(serdev);
|
||||
if (signal == state)
|
||||
return 0;
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
|
||||
return -ETIMEDOUT;
|
||||
return readx_poll_timeout(serdev_device_get_cts, serdev, signal, signal == state,
|
||||
2000, timeout_ms * 1000);
|
||||
}
|
||||
|
||||
static inline int serdev_device_set_rts(struct serdev_device *serdev, bool enable)
|
||||
|
||||
@@ -664,6 +664,86 @@ struct uart_driver {
|
||||
|
||||
void uart_write_wakeup(struct uart_port *port);
|
||||
|
||||
#define __uart_port_tx(uport, ch, tx_ready, put_char, tx_done, for_test, \
|
||||
for_post) \
|
||||
({ \
|
||||
struct uart_port *__port = (uport); \
|
||||
struct circ_buf *xmit = &__port->state->xmit; \
|
||||
unsigned int pending; \
|
||||
\
|
||||
for (; (for_test) && (tx_ready); (for_post), __port->icount.tx++) { \
|
||||
if (__port->x_char) { \
|
||||
(ch) = __port->x_char; \
|
||||
(put_char); \
|
||||
__port->x_char = 0; \
|
||||
continue; \
|
||||
} \
|
||||
\
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(__port)) \
|
||||
break; \
|
||||
\
|
||||
(ch) = xmit->buf[xmit->tail]; \
|
||||
(put_char); \
|
||||
xmit->tail = (xmit->tail + 1) % UART_XMIT_SIZE; \
|
||||
} \
|
||||
\
|
||||
(tx_done); \
|
||||
\
|
||||
pending = uart_circ_chars_pending(xmit); \
|
||||
if (pending < WAKEUP_CHARS) { \
|
||||
uart_write_wakeup(__port); \
|
||||
\
|
||||
if (pending == 0) \
|
||||
__port->ops->stop_tx(__port); \
|
||||
} \
|
||||
\
|
||||
pending; \
|
||||
})
|
||||
|
||||
/**
|
||||
* uart_port_tx_limited -- transmit helper for uart_port with count limiting
|
||||
* @port: uart port
|
||||
* @ch: variable to store a character to be written to the HW
|
||||
* @count: a limit of characters to send
|
||||
* @tx_ready: can HW accept more data function
|
||||
* @put_char: function to write a character
|
||||
* @tx_done: function to call after the loop is done
|
||||
*
|
||||
* This helper transmits characters from the xmit buffer to the hardware using
|
||||
* @put_char(). It does so until @count characters are sent and while @tx_ready
|
||||
* evaluates to true.
|
||||
*
|
||||
* Returns: the number of characters in the xmit buffer when done.
|
||||
*
|
||||
* The expression in macro parameters shall be designed as follows:
|
||||
* * **tx_ready:** should evaluate to true if the HW can accept more data to
|
||||
* be sent. This parameter can be %true, which means the HW is always ready.
|
||||
* * **put_char:** shall write @ch to the device of @port.
|
||||
* * **tx_done:** when the write loop is done, this can perform arbitrary
|
||||
* action before potential invocation of ops->stop_tx() happens. If the
|
||||
* driver does not need to do anything, use e.g. ({}).
|
||||
*
|
||||
* For all of them, @port->lock is held, interrupts are locally disabled and
|
||||
* the expressions must not sleep.
|
||||
*/
|
||||
#define uart_port_tx_limited(port, ch, count, tx_ready, put_char, tx_done) ({ \
|
||||
unsigned int __count = (count); \
|
||||
__uart_port_tx(port, ch, tx_ready, put_char, tx_done, __count, \
|
||||
__count--); \
|
||||
})
|
||||
|
||||
/**
|
||||
* uart_port_tx -- transmit helper for uart_port
|
||||
* @port: uart port
|
||||
* @ch: variable to store a character to be written to the HW
|
||||
* @tx_ready: can HW accept more data function
|
||||
* @put_char: function to write a character
|
||||
*
|
||||
* See uart_port_tx_limited() for more details.
|
||||
*/
|
||||
#define uart_port_tx(port, ch, tx_ready, put_char) \
|
||||
__uart_port_tx(port, ch, tx_ready, put_char, ({}), true, ({}))
|
||||
|
||||
/*
|
||||
* Baud rate helpers.
|
||||
*/
|
||||
|
||||
@@ -17,14 +17,11 @@ struct tty_buffer {
|
||||
int commit;
|
||||
int lookahead; /* Lazy update on recv, can become less than "read" */
|
||||
int read;
|
||||
int flags;
|
||||
bool flags;
|
||||
/* Data points here */
|
||||
unsigned long data[];
|
||||
};
|
||||
|
||||
/* Values for .flags field of tty_buffer */
|
||||
#define TTYB_NORMAL 1 /* buffer has no flags buffer */
|
||||
|
||||
static inline unsigned char *char_buf_ptr(struct tty_buffer *b, int ofs)
|
||||
{
|
||||
return ((unsigned char *)b->data) + ofs;
|
||||
|
||||
@@ -25,9 +25,9 @@ static inline int tty_insert_flip_char(struct tty_port *port,
|
||||
struct tty_buffer *tb = port->buf.tail;
|
||||
int change;
|
||||
|
||||
change = (tb->flags & TTYB_NORMAL) && (flag != TTY_NORMAL);
|
||||
change = !tb->flags && (flag != TTY_NORMAL);
|
||||
if (!change && tb->used < tb->size) {
|
||||
if (~tb->flags & TTYB_NORMAL)
|
||||
if (tb->flags)
|
||||
*flag_buf_ptr(tb, tb->used) = flag;
|
||||
*char_buf_ptr(tb, tb->used++) = ch;
|
||||
return 1;
|
||||
|
||||
Reference in New Issue
Block a user