Commit bd5cc6ee authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'tty-6.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

Pull tty/serial driver fixes from Greg KH:
 "Here are some small tty and serial driver fixes for 6.2-rc5 that
  resolve a number of tiny reported issues and some new device ids. They
  include:

   - new device id for the exar serial driver

   - speakup tty driver bugfix

   - atmel serial driver baudrate fixup

   - stm32 serial driver bugfix and then revert as the bugfix broke the
     build. That will come back in a later pull request once it is all
     worked out properly.

   - amba-pl011 serial driver rs486 mode bugfix

   - qcom_geni serial driver bugfix

  Most of these have been in linux-next with no reported problems (well,
  other than the build breakage which generated the revert), the new
  device id passed 0-day testing"

* tag 'tty-6.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  serial: exar: Add support for Sealevel 7xxxC serial cards
  Revert "serial: stm32: Merge hard IRQ and threaded IRQ handling into single IRQ handler"
  tty: serial: qcom_geni: avoid duplicate struct member init
  serial: atmel: fix incorrect baudrate setup
  tty: fix possible null-ptr-defer in spk_ttyio_release
  serial: stm32: Merge hard IRQ and threaded IRQ handling into single IRQ handler
  serial: amba-pl011: fix high priority character transmission in rs486 mode
  serial: pch_uart: Pass correct sg to dma_unmap_sg()
  tty: serial: qcom-geni-serial: fix slab-out-of-bounds on RX FIFO buffer
parents e67da288 14ee78d5
...@@ -354,6 +354,9 @@ void spk_ttyio_release(struct spk_synth *in_synth) ...@@ -354,6 +354,9 @@ void spk_ttyio_release(struct spk_synth *in_synth)
{ {
struct tty_struct *tty = in_synth->dev; struct tty_struct *tty = in_synth->dev;
if (tty == NULL)
return;
tty_lock(tty); tty_lock(tty);
if (tty->ops->close) if (tty->ops->close)
......
...@@ -43,6 +43,12 @@ ...@@ -43,6 +43,12 @@
#define PCI_DEVICE_ID_EXAR_XR17V4358 0x4358 #define PCI_DEVICE_ID_EXAR_XR17V4358 0x4358
#define PCI_DEVICE_ID_EXAR_XR17V8358 0x8358 #define PCI_DEVICE_ID_EXAR_XR17V8358 0x8358
#define PCI_DEVICE_ID_SEALEVEL_710xC 0x1001
#define PCI_DEVICE_ID_SEALEVEL_720xC 0x1002
#define PCI_DEVICE_ID_SEALEVEL_740xC 0x1004
#define PCI_DEVICE_ID_SEALEVEL_780xC 0x1008
#define PCI_DEVICE_ID_SEALEVEL_716xC 0x1010
#define UART_EXAR_INT0 0x80 #define UART_EXAR_INT0 0x80
#define UART_EXAR_8XMODE 0x88 /* 8X sampling rate select */ #define UART_EXAR_8XMODE 0x88 /* 8X sampling rate select */
#define UART_EXAR_SLEEP 0x8b /* Sleep mode */ #define UART_EXAR_SLEEP 0x8b /* Sleep mode */
...@@ -638,6 +644,8 @@ exar_pci_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) ...@@ -638,6 +644,8 @@ exar_pci_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
nr_ports = BIT(((pcidev->device & 0x38) >> 3) - 1); nr_ports = BIT(((pcidev->device & 0x38) >> 3) - 1);
else if (board->num_ports) else if (board->num_ports)
nr_ports = board->num_ports; nr_ports = board->num_ports;
else if (pcidev->vendor == PCI_VENDOR_ID_SEALEVEL)
nr_ports = pcidev->device & 0xff;
else else
nr_ports = pcidev->device & 0x0f; nr_ports = pcidev->device & 0x0f;
...@@ -864,6 +872,12 @@ static const struct pci_device_id exar_pci_tbl[] = { ...@@ -864,6 +872,12 @@ static const struct pci_device_id exar_pci_tbl[] = {
EXAR_DEVICE(COMMTECH, 4224PCI335, pbn_fastcom335_4), EXAR_DEVICE(COMMTECH, 4224PCI335, pbn_fastcom335_4),
EXAR_DEVICE(COMMTECH, 2324PCI335, pbn_fastcom335_4), EXAR_DEVICE(COMMTECH, 2324PCI335, pbn_fastcom335_4),
EXAR_DEVICE(COMMTECH, 2328PCI335, pbn_fastcom335_8), EXAR_DEVICE(COMMTECH, 2328PCI335, pbn_fastcom335_8),
EXAR_DEVICE(SEALEVEL, 710xC, pbn_exar_XR17V35x),
EXAR_DEVICE(SEALEVEL, 720xC, pbn_exar_XR17V35x),
EXAR_DEVICE(SEALEVEL, 740xC, pbn_exar_XR17V35x),
EXAR_DEVICE(SEALEVEL, 780xC, pbn_exar_XR17V35x),
EXAR_DEVICE(SEALEVEL, 716xC, pbn_exar_XR17V35x),
{ 0, } { 0, }
}; };
MODULE_DEVICE_TABLE(pci, exar_pci_tbl); MODULE_DEVICE_TABLE(pci, exar_pci_tbl);
......
...@@ -1466,6 +1466,10 @@ static bool pl011_tx_chars(struct uart_amba_port *uap, bool from_irq) ...@@ -1466,6 +1466,10 @@ static bool pl011_tx_chars(struct uart_amba_port *uap, bool from_irq)
struct circ_buf *xmit = &uap->port.state->xmit; struct circ_buf *xmit = &uap->port.state->xmit;
int count = uap->fifosize >> 1; int count = uap->fifosize >> 1;
if ((uap->port.rs485.flags & SER_RS485_ENABLED) &&
!uap->rs485_tx_started)
pl011_rs485_tx_start(uap);
if (uap->port.x_char) { if (uap->port.x_char) {
if (!pl011_tx_char(uap, uap->port.x_char, from_irq)) if (!pl011_tx_char(uap, uap->port.x_char, from_irq))
return true; return true;
...@@ -1477,10 +1481,6 @@ static bool pl011_tx_chars(struct uart_amba_port *uap, bool from_irq) ...@@ -1477,10 +1481,6 @@ static bool pl011_tx_chars(struct uart_amba_port *uap, bool from_irq)
return false; return false;
} }
if ((uap->port.rs485.flags & SER_RS485_ENABLED) &&
!uap->rs485_tx_started)
pl011_rs485_tx_start(uap);
/* If we are using DMA mode, try to send some characters. */ /* If we are using DMA mode, try to send some characters. */
if (pl011_dma_tx_irq(uap)) if (pl011_dma_tx_irq(uap))
return true; return true;
......
...@@ -2657,13 +2657,7 @@ static void __init atmel_console_get_options(struct uart_port *port, int *baud, ...@@ -2657,13 +2657,7 @@ static void __init atmel_console_get_options(struct uart_port *port, int *baud,
else if (mr == ATMEL_US_PAR_ODD) else if (mr == ATMEL_US_PAR_ODD)
*parity = 'o'; *parity = 'o';
/* *baud = port->uartclk / (16 * quot);
* The serial core only rounds down when matching this to a
* supported baud rate. Make sure we don't end up slightly
* lower than one of those, as it would make us fall through
* to a much lower baud rate than we really want.
*/
*baud = port->uartclk / (16 * (quot - 1));
} }
static int __init atmel_console_setup(struct console *co, char *options) static int __init atmel_console_setup(struct console *co, char *options)
......
...@@ -749,7 +749,7 @@ static void pch_dma_tx_complete(void *arg) ...@@ -749,7 +749,7 @@ static void pch_dma_tx_complete(void *arg)
uart_xmit_advance(port, sg_dma_len(sg)); uart_xmit_advance(port, sg_dma_len(sg));
async_tx_ack(priv->desc_tx); async_tx_ack(priv->desc_tx);
dma_unmap_sg(port->dev, sg, priv->orig_nent, DMA_TO_DEVICE); dma_unmap_sg(port->dev, priv->sg_tx_p, priv->orig_nent, DMA_TO_DEVICE);
priv->tx_dma_use = 0; priv->tx_dma_use = 0;
priv->nent = 0; priv->nent = 0;
priv->orig_nent = 0; priv->orig_nent = 0;
......
...@@ -864,9 +864,10 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev) ...@@ -864,9 +864,10 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void get_tx_fifo_size(struct qcom_geni_serial_port *port) static int setup_fifos(struct qcom_geni_serial_port *port)
{ {
struct uart_port *uport; struct uart_port *uport;
u32 old_rx_fifo_depth = port->rx_fifo_depth;
uport = &port->uport; uport = &port->uport;
port->tx_fifo_depth = geni_se_get_tx_fifo_depth(&port->se); port->tx_fifo_depth = geni_se_get_tx_fifo_depth(&port->se);
...@@ -874,6 +875,16 @@ static void get_tx_fifo_size(struct qcom_geni_serial_port *port) ...@@ -874,6 +875,16 @@ static void get_tx_fifo_size(struct qcom_geni_serial_port *port)
port->rx_fifo_depth = geni_se_get_rx_fifo_depth(&port->se); port->rx_fifo_depth = geni_se_get_rx_fifo_depth(&port->se);
uport->fifosize = uport->fifosize =
(port->tx_fifo_depth * port->tx_fifo_width) / BITS_PER_BYTE; (port->tx_fifo_depth * port->tx_fifo_width) / BITS_PER_BYTE;
if (port->rx_fifo && (old_rx_fifo_depth != port->rx_fifo_depth) && port->rx_fifo_depth) {
port->rx_fifo = devm_krealloc(uport->dev, port->rx_fifo,
port->rx_fifo_depth * sizeof(u32),
GFP_KERNEL);
if (!port->rx_fifo)
return -ENOMEM;
}
return 0;
} }
...@@ -888,6 +899,7 @@ static int qcom_geni_serial_port_setup(struct uart_port *uport) ...@@ -888,6 +899,7 @@ static int qcom_geni_serial_port_setup(struct uart_port *uport)
u32 rxstale = DEFAULT_BITS_PER_CHAR * STALE_TIMEOUT; u32 rxstale = DEFAULT_BITS_PER_CHAR * STALE_TIMEOUT;
u32 proto; u32 proto;
u32 pin_swap; u32 pin_swap;
int ret;
proto = geni_se_read_proto(&port->se); proto = geni_se_read_proto(&port->se);
if (proto != GENI_SE_UART) { if (proto != GENI_SE_UART) {
...@@ -897,7 +909,9 @@ static int qcom_geni_serial_port_setup(struct uart_port *uport) ...@@ -897,7 +909,9 @@ static int qcom_geni_serial_port_setup(struct uart_port *uport)
qcom_geni_serial_stop_rx(uport); qcom_geni_serial_stop_rx(uport);
get_tx_fifo_size(port); ret = setup_fifos(port);
if (ret)
return ret;
writel(rxstale, uport->membase + SE_UART_RX_STALE_CNT); writel(rxstale, uport->membase + SE_UART_RX_STALE_CNT);
...@@ -1516,7 +1530,7 @@ static int qcom_geni_serial_remove(struct platform_device *pdev) ...@@ -1516,7 +1530,7 @@ static int qcom_geni_serial_remove(struct platform_device *pdev)
return 0; return 0;
} }
static int __maybe_unused qcom_geni_serial_sys_suspend(struct device *dev) static int qcom_geni_serial_sys_suspend(struct device *dev)
{ {
struct qcom_geni_serial_port *port = dev_get_drvdata(dev); struct qcom_geni_serial_port *port = dev_get_drvdata(dev);
struct uart_port *uport = &port->uport; struct uart_port *uport = &port->uport;
...@@ -1533,7 +1547,7 @@ static int __maybe_unused qcom_geni_serial_sys_suspend(struct device *dev) ...@@ -1533,7 +1547,7 @@ static int __maybe_unused qcom_geni_serial_sys_suspend(struct device *dev)
return uart_suspend_port(private_data->drv, uport); return uart_suspend_port(private_data->drv, uport);
} }
static int __maybe_unused qcom_geni_serial_sys_resume(struct device *dev) static int qcom_geni_serial_sys_resume(struct device *dev)
{ {
int ret; int ret;
struct qcom_geni_serial_port *port = dev_get_drvdata(dev); struct qcom_geni_serial_port *port = dev_get_drvdata(dev);
...@@ -1581,10 +1595,12 @@ static int qcom_geni_serial_sys_hib_resume(struct device *dev) ...@@ -1581,10 +1595,12 @@ static int qcom_geni_serial_sys_hib_resume(struct device *dev)
} }
static const struct dev_pm_ops qcom_geni_serial_pm_ops = { static const struct dev_pm_ops qcom_geni_serial_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(qcom_geni_serial_sys_suspend, .suspend = pm_sleep_ptr(qcom_geni_serial_sys_suspend),
qcom_geni_serial_sys_resume) .resume = pm_sleep_ptr(qcom_geni_serial_sys_resume),
.restore = qcom_geni_serial_sys_hib_resume, .freeze = pm_sleep_ptr(qcom_geni_serial_sys_suspend),
.thaw = qcom_geni_serial_sys_hib_resume, .poweroff = pm_sleep_ptr(qcom_geni_serial_sys_suspend),
.restore = pm_sleep_ptr(qcom_geni_serial_sys_hib_resume),
.thaw = pm_sleep_ptr(qcom_geni_serial_sys_hib_resume),
}; };
static const struct of_device_id qcom_geni_serial_match_table[] = { static const struct of_device_id qcom_geni_serial_match_table[] = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment