mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	TTY/Serial driver fixes for 6.0-rc7
Here are some small, and late, serial driver fixes for 6.0-rc7 to
 resolve some reported problems.
 
 Included in here are:
 	- tegra icount accounting fixes, including a framework function
 	  that other drivers will be converted over to using in 6.1-rc1.
 	- fsl_lpuart reset bugfix
 	- 8250 omap 485 bugfix
 	- sifive serial clock bugfix
 
 The last 3 patches have not shown up in linux-next due to them being
 added to my tree only 2 days ago, but they are tiny and self-contained
 and the developers say they resolve issues that they have with 6.0-rc.
 The other 3 have been in linux-next for a while with no reported issues.
 
 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 -----BEGIN PGP SIGNATURE-----
 
 iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYy6+Tg8cZ3JlZ0Brcm9h
 aC5jb20ACgkQMUfUDdst+yl31wCfSm1SDCziRBj3FuNX4nA7STcn/Q4AnAoyI/wW
 pjm7ZbpcxH8N3CzTAO/n
 =JRNq
 -----END PGP SIGNATURE-----
Merge tag 'tty-6.0-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty/serial driver fixes from Greg KH:
 "Here are some small, and late, serial driver fixes for 6.0-rc7 to
  resolve some reported problems.
  Included in here are:
   - tegra icount accounting fixes, including a framework function that
     other drivers will be converted over to using in 6.1-rc1.
   - fsl_lpuart reset bugfix
   - 8250 omap 485 bugfix
   - sifive serial clock bugfix
  The last three patches have not shown up in linux-next due to them
  being added to my tree only 2 days ago, but they are tiny and
  self-contained and the developers say they resolve issues that they
  have with 6.0-rc. The other three have been in linux-next for a while
  with no reported issues"
* tag 'tty-6.0-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  serial: sifive: enable clocks for UART when probed
  serial: 8250: omap: Use serial8250_em485_supported
  serial: fsl_lpuart: Reset prior to registration
  serial: tegra-tcu: Use uart_xmit_advance(), fixes icount.tx accounting
  serial: tegra: Use uart_xmit_advance(), fixes icount.tx accounting
  serial: Create uart_xmit_advance()
			
			
This commit is contained in:
		
						commit
						7e2cd21e02
					
				
					 6 changed files with 27 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -1334,6 +1334,7 @@ static int omap8250_probe(struct platform_device *pdev)
 | 
			
		|||
	up.port.throttle = omap_8250_throttle;
 | 
			
		||||
	up.port.unthrottle = omap_8250_unthrottle;
 | 
			
		||||
	up.port.rs485_config = serial8250_em485_config;
 | 
			
		||||
	up.port.rs485_supported = serial8250_em485_supported;
 | 
			
		||||
	up.rs485_start_tx = serial8250_em485_start_tx;
 | 
			
		||||
	up.rs485_stop_tx = serial8250_em485_stop_tx;
 | 
			
		||||
	up.port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_8250_CONSOLE);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2724,14 +2724,15 @@ static int lpuart_probe(struct platform_device *pdev)
 | 
			
		|||
		lpuart_reg.cons = LPUART_CONSOLE;
 | 
			
		||||
		handler = lpuart_int;
 | 
			
		||||
	}
 | 
			
		||||
	ret = uart_add_one_port(&lpuart_reg, &sport->port);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		goto failed_attach_port;
 | 
			
		||||
 | 
			
		||||
	ret = lpuart_global_reset(sport);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		goto failed_reset;
 | 
			
		||||
 | 
			
		||||
	ret = uart_add_one_port(&lpuart_reg, &sport->port);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		goto failed_attach_port;
 | 
			
		||||
 | 
			
		||||
	ret = uart_get_rs485_mode(&sport->port);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		goto failed_get_rs485;
 | 
			
		||||
| 
						 | 
				
			
			@ -2747,9 +2748,9 @@ static int lpuart_probe(struct platform_device *pdev)
 | 
			
		|||
 | 
			
		||||
failed_irq_request:
 | 
			
		||||
failed_get_rs485:
 | 
			
		||||
failed_reset:
 | 
			
		||||
	uart_remove_one_port(&lpuart_reg, &sport->port);
 | 
			
		||||
failed_attach_port:
 | 
			
		||||
failed_reset:
 | 
			
		||||
	lpuart_disable_clks(sport);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -525,7 +525,7 @@ static void tegra_uart_tx_dma_complete(void *args)
 | 
			
		|||
	count = tup->tx_bytes_requested - state.residue;
 | 
			
		||||
	async_tx_ack(tup->tx_dma_desc);
 | 
			
		||||
	spin_lock_irqsave(&tup->uport.lock, flags);
 | 
			
		||||
	xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1);
 | 
			
		||||
	uart_xmit_advance(&tup->uport, count);
 | 
			
		||||
	tup->tx_in_progress = 0;
 | 
			
		||||
	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
 | 
			
		||||
		uart_write_wakeup(&tup->uport);
 | 
			
		||||
| 
						 | 
				
			
			@ -613,7 +613,6 @@ static unsigned int tegra_uart_tx_empty(struct uart_port *u)
 | 
			
		|||
static void tegra_uart_stop_tx(struct uart_port *u)
 | 
			
		||||
{
 | 
			
		||||
	struct tegra_uart_port *tup = to_tegra_uport(u);
 | 
			
		||||
	struct circ_buf *xmit = &tup->uport.state->xmit;
 | 
			
		||||
	struct dma_tx_state state;
 | 
			
		||||
	unsigned int count;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -624,7 +623,7 @@ static void tegra_uart_stop_tx(struct uart_port *u)
 | 
			
		|||
	dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);
 | 
			
		||||
	count = tup->tx_bytes_requested - state.residue;
 | 
			
		||||
	async_tx_ack(tup->tx_dma_desc);
 | 
			
		||||
	xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1);
 | 
			
		||||
	uart_xmit_advance(&tup->uport, count);
 | 
			
		||||
	tup->tx_in_progress = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -945,7 +945,7 @@ static int sifive_serial_probe(struct platform_device *pdev)
 | 
			
		|||
		return PTR_ERR(base);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	clk = devm_clk_get(&pdev->dev, NULL);
 | 
			
		||||
	clk = devm_clk_get_enabled(&pdev->dev, NULL);
 | 
			
		||||
	if (IS_ERR(clk)) {
 | 
			
		||||
		dev_err(&pdev->dev, "unable to find controller clock\n");
 | 
			
		||||
		return PTR_ERR(clk);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,7 +101,7 @@ static void tegra_tcu_uart_start_tx(struct uart_port *port)
 | 
			
		|||
			break;
 | 
			
		||||
 | 
			
		||||
		tegra_tcu_write(tcu, &xmit->buf[xmit->tail], count);
 | 
			
		||||
		xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1);
 | 
			
		||||
		uart_xmit_advance(port, count);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	uart_write_wakeup(port);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -624,6 +624,23 @@ struct uart_state {
 | 
			
		|||
/* number of characters left in xmit buffer before we ask for more */
 | 
			
		||||
#define WAKEUP_CHARS		256
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * uart_xmit_advance - Advance xmit buffer and account Tx'ed chars
 | 
			
		||||
 * @up: uart_port structure describing the port
 | 
			
		||||
 * @chars: number of characters sent
 | 
			
		||||
 *
 | 
			
		||||
 * This function advances the tail of circular xmit buffer by the number of
 | 
			
		||||
 * @chars transmitted and handles accounting of transmitted bytes (into
 | 
			
		||||
 * @up's icount.tx).
 | 
			
		||||
 */
 | 
			
		||||
static inline void uart_xmit_advance(struct uart_port *up, unsigned int chars)
 | 
			
		||||
{
 | 
			
		||||
	struct circ_buf *xmit = &up->state->xmit;
 | 
			
		||||
 | 
			
		||||
	xmit->tail = (xmit->tail + chars) & (UART_XMIT_SIZE - 1);
 | 
			
		||||
	up->icount.tx += chars;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct module;
 | 
			
		||||
struct tty_driver;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue