TTY/Serial fixes for 4.13-rc2
Here are some small tty and serial driver fixes for 4.13-rc2. Nothing huge at all, a revert of a patch that turned out to break things, a fix up for a new tty ioctl we added in 4.13-rc1 to get the uapi definition correct, and a few minor serial driver fixes for reported issues. All of these have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCWXMebA8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yn9MgCdGsIEQlTvTeG4QikxUPB7dkEJQacAoLWOKJzQ A65mBAeOfiJztczi8uo4 =KEXp -----END PGP SIGNATURE----- Merge tag 'tty-4.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty/serial fixes from Greg KH: "Here are some small tty and serial driver fixes for 4.13-rc2. Nothing huge at all, a revert of a patch that turned out to break things, a fix up for a new tty ioctl we added in 4.13-rc1 to get the uapi definition correct, and a few minor serial driver fixes for reported issues. All of these have been in linux-next for a while with no reported issues" * tag 'tty-4.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: tty: Fix TIOCGPTPEER ioctl definition tty: hide unused pty_get_peer function tty: serial: lpuart: Fix the logic for detecting the 32-bit type UART serial: imx: Prevent TX buffer PIO write when a DMA has been started Revert "serial: imx-serial - move DMA buffer configuration to DT" serial: sh-sci: Uninitialized variables in sysfs files serial: st-asc: Potential error pointer dereference
This commit is contained in:
commit
ae75d1aefe
|
@ -9,7 +9,6 @@ Optional properties:
|
||||||
- fsl,irda-mode : Indicate the uart supports irda mode
|
- fsl,irda-mode : Indicate the uart supports irda mode
|
||||||
- fsl,dte-mode : Indicate the uart works in DTE mode. The uart works
|
- fsl,dte-mode : Indicate the uart works in DTE mode. The uart works
|
||||||
in DCE mode by default.
|
in DCE mode by default.
|
||||||
- fsl,dma-size : Indicate the size of the DMA buffer and its periods
|
|
||||||
|
|
||||||
Please check Documentation/devicetree/bindings/serial/serial.txt
|
Please check Documentation/devicetree/bindings/serial/serial.txt
|
||||||
for the complete list of generic properties.
|
for the complete list of generic properties.
|
||||||
|
@ -29,5 +28,4 @@ uart1: serial@73fbc000 {
|
||||||
interrupts = <31>;
|
interrupts = <31>;
|
||||||
uart-has-rtscts;
|
uart-has-rtscts;
|
||||||
fsl,dte-mode;
|
fsl,dte-mode;
|
||||||
fsl,dma-size = <1024 4>;
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -100,7 +100,7 @@
|
||||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||||
|
|
||||||
#define TIOCSERCONFIG 0x5453
|
#define TIOCSERCONFIG 0x5453
|
||||||
#define TIOCSERGWILD 0x5454
|
#define TIOCSERGWILD 0x5454
|
||||||
|
|
|
@ -91,7 +91,7 @@
|
||||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||||
|
|
||||||
/* I hope the range from 0x5480 on is free ... */
|
/* I hope the range from 0x5480 on is free ... */
|
||||||
#define TIOCSCTTY 0x5480 /* become controlling tty */
|
#define TIOCSCTTY 0x5480 /* become controlling tty */
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||||
|
|
||||||
#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */
|
#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */
|
||||||
#define FIOCLEX 0x5451
|
#define FIOCLEX 0x5451
|
||||||
|
|
|
@ -100,7 +100,7 @@
|
||||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||||
|
|
||||||
#define TIOCSERCONFIG 0x5453
|
#define TIOCSERCONFIG 0x5453
|
||||||
#define TIOCSERGWILD 0x5454
|
#define TIOCSERGWILD 0x5454
|
||||||
|
|
|
@ -93,7 +93,7 @@
|
||||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||||
|
|
||||||
#define TIOCSERCONFIG _IO('T', 83) /* 0x5453 */
|
#define TIOCSERCONFIG _IO('T', 83) /* 0x5453 */
|
||||||
#define TIOCSERGWILD _IOR('T', 84, int) /* 0x5454 */
|
#define TIOCSERGWILD _IOR('T', 84, int) /* 0x5454 */
|
||||||
|
|
|
@ -88,7 +88,7 @@
|
||||||
#define TIOCGPTN _IOR('t', 134, unsigned int) /* Get Pty Number */
|
#define TIOCGPTN _IOR('t', 134, unsigned int) /* Get Pty Number */
|
||||||
#define TIOCSPTLCK _IOW('t', 135, int) /* Lock/unlock PTY */
|
#define TIOCSPTLCK _IOW('t', 135, int) /* Lock/unlock PTY */
|
||||||
#define TIOCSIG _IOW('t', 136, int) /* Generate signal on Pty slave */
|
#define TIOCSIG _IOW('t', 136, int) /* Generate signal on Pty slave */
|
||||||
#define TIOCGPTPEER _IOR('t', 137, int) /* Safely open the slave */
|
#define TIOCGPTPEER _IO('t', 137) /* Safely open the slave */
|
||||||
|
|
||||||
/* Little f */
|
/* Little f */
|
||||||
#define FIOCLEX _IO('f', 1)
|
#define FIOCLEX _IO('f', 1)
|
||||||
|
|
|
@ -105,7 +105,7 @@
|
||||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||||
|
|
||||||
#define TIOCSERCONFIG _IO('T', 83)
|
#define TIOCSERCONFIG _IO('T', 83)
|
||||||
#define TIOCSERGWILD _IOR('T', 84, int)
|
#define TIOCSERGWILD _IOR('T', 84, int)
|
||||||
|
|
|
@ -448,48 +448,6 @@ static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* pty_open_peer - open the peer of a pty
|
|
||||||
* @tty: the peer of the pty being opened
|
|
||||||
*
|
|
||||||
* Open the cached dentry in tty->link, providing a safe way for userspace
|
|
||||||
* to get the slave end of a pty (where they have the master fd and cannot
|
|
||||||
* access or trust the mount namespace /dev/pts was mounted inside).
|
|
||||||
*/
|
|
||||||
static struct file *pty_open_peer(struct tty_struct *tty, int flags)
|
|
||||||
{
|
|
||||||
if (tty->driver->subtype != PTY_TYPE_MASTER)
|
|
||||||
return ERR_PTR(-EIO);
|
|
||||||
return dentry_open(tty->link->driver_data, flags, current_cred());
|
|
||||||
}
|
|
||||||
|
|
||||||
static int pty_get_peer(struct tty_struct *tty, int flags)
|
|
||||||
{
|
|
||||||
int fd = -1;
|
|
||||||
struct file *filp = NULL;
|
|
||||||
int retval = -EINVAL;
|
|
||||||
|
|
||||||
fd = get_unused_fd_flags(0);
|
|
||||||
if (fd < 0) {
|
|
||||||
retval = fd;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
filp = pty_open_peer(tty, flags);
|
|
||||||
if (IS_ERR(filp)) {
|
|
||||||
retval = PTR_ERR(filp);
|
|
||||||
goto err_put;
|
|
||||||
}
|
|
||||||
|
|
||||||
fd_install(fd, filp);
|
|
||||||
return fd;
|
|
||||||
|
|
||||||
err_put:
|
|
||||||
put_unused_fd(fd);
|
|
||||||
err:
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pty_cleanup(struct tty_struct *tty)
|
static void pty_cleanup(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
tty_port_put(tty->port);
|
tty_port_put(tty->port);
|
||||||
|
@ -646,9 +604,50 @@ static inline void legacy_pty_init(void) { }
|
||||||
|
|
||||||
/* Unix98 devices */
|
/* Unix98 devices */
|
||||||
#ifdef CONFIG_UNIX98_PTYS
|
#ifdef CONFIG_UNIX98_PTYS
|
||||||
|
|
||||||
static struct cdev ptmx_cdev;
|
static struct cdev ptmx_cdev;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* pty_open_peer - open the peer of a pty
|
||||||
|
* @tty: the peer of the pty being opened
|
||||||
|
*
|
||||||
|
* Open the cached dentry in tty->link, providing a safe way for userspace
|
||||||
|
* to get the slave end of a pty (where they have the master fd and cannot
|
||||||
|
* access or trust the mount namespace /dev/pts was mounted inside).
|
||||||
|
*/
|
||||||
|
static struct file *pty_open_peer(struct tty_struct *tty, int flags)
|
||||||
|
{
|
||||||
|
if (tty->driver->subtype != PTY_TYPE_MASTER)
|
||||||
|
return ERR_PTR(-EIO);
|
||||||
|
return dentry_open(tty->link->driver_data, flags, current_cred());
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pty_get_peer(struct tty_struct *tty, int flags)
|
||||||
|
{
|
||||||
|
int fd = -1;
|
||||||
|
struct file *filp = NULL;
|
||||||
|
int retval = -EINVAL;
|
||||||
|
|
||||||
|
fd = get_unused_fd_flags(0);
|
||||||
|
if (fd < 0) {
|
||||||
|
retval = fd;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
filp = pty_open_peer(tty, flags);
|
||||||
|
if (IS_ERR(filp)) {
|
||||||
|
retval = PTR_ERR(filp);
|
||||||
|
goto err_put;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd_install(fd, filp);
|
||||||
|
return fd;
|
||||||
|
|
||||||
|
err_put:
|
||||||
|
put_unused_fd(fd);
|
||||||
|
err:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
static int pty_unix98_ioctl(struct tty_struct *tty,
|
static int pty_unix98_ioctl(struct tty_struct *tty,
|
||||||
unsigned int cmd, unsigned long arg)
|
unsigned int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -619,6 +619,12 @@ static unsigned int lpuart32_tx_empty(struct uart_port *port)
|
||||||
TIOCSER_TEMT : 0;
|
TIOCSER_TEMT : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool lpuart_is_32(struct lpuart_port *sport)
|
||||||
|
{
|
||||||
|
return sport->port.iotype == UPIO_MEM32 ||
|
||||||
|
sport->port.iotype == UPIO_MEM32BE;
|
||||||
|
}
|
||||||
|
|
||||||
static irqreturn_t lpuart_txint(int irq, void *dev_id)
|
static irqreturn_t lpuart_txint(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
struct lpuart_port *sport = dev_id;
|
struct lpuart_port *sport = dev_id;
|
||||||
|
@ -627,7 +633,7 @@ static irqreturn_t lpuart_txint(int irq, void *dev_id)
|
||||||
|
|
||||||
spin_lock_irqsave(&sport->port.lock, flags);
|
spin_lock_irqsave(&sport->port.lock, flags);
|
||||||
if (sport->port.x_char) {
|
if (sport->port.x_char) {
|
||||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
if (lpuart_is_32(sport))
|
||||||
lpuart32_write(&sport->port, sport->port.x_char, UARTDATA);
|
lpuart32_write(&sport->port, sport->port.x_char, UARTDATA);
|
||||||
else
|
else
|
||||||
writeb(sport->port.x_char, sport->port.membase + UARTDR);
|
writeb(sport->port.x_char, sport->port.membase + UARTDR);
|
||||||
|
@ -635,14 +641,14 @@ static irqreturn_t lpuart_txint(int irq, void *dev_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) {
|
if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) {
|
||||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
if (lpuart_is_32(sport))
|
||||||
lpuart32_stop_tx(&sport->port);
|
lpuart32_stop_tx(&sport->port);
|
||||||
else
|
else
|
||||||
lpuart_stop_tx(&sport->port);
|
lpuart_stop_tx(&sport->port);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
if (lpuart_is_32(sport))
|
||||||
lpuart32_transmit_buffer(sport);
|
lpuart32_transmit_buffer(sport);
|
||||||
else
|
else
|
||||||
lpuart_transmit_buffer(sport);
|
lpuart_transmit_buffer(sport);
|
||||||
|
@ -1978,12 +1984,12 @@ static int __init lpuart_console_setup(struct console *co, char *options)
|
||||||
if (options)
|
if (options)
|
||||||
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
||||||
else
|
else
|
||||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
if (lpuart_is_32(sport))
|
||||||
lpuart32_console_get_options(sport, &baud, &parity, &bits);
|
lpuart32_console_get_options(sport, &baud, &parity, &bits);
|
||||||
else
|
else
|
||||||
lpuart_console_get_options(sport, &baud, &parity, &bits);
|
lpuart_console_get_options(sport, &baud, &parity, &bits);
|
||||||
|
|
||||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
if (lpuart_is_32(sport))
|
||||||
lpuart32_setup_watermark(sport);
|
lpuart32_setup_watermark(sport);
|
||||||
else
|
else
|
||||||
lpuart_setup_watermark(sport);
|
lpuart_setup_watermark(sport);
|
||||||
|
@ -2118,7 +2124,7 @@ static int lpuart_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
sport->port.irq = ret;
|
sport->port.irq = ret;
|
||||||
sport->port.iotype = sdata->iotype;
|
sport->port.iotype = sdata->iotype;
|
||||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
if (lpuart_is_32(sport))
|
||||||
sport->port.ops = &lpuart32_pops;
|
sport->port.ops = &lpuart32_pops;
|
||||||
else
|
else
|
||||||
sport->port.ops = &lpuart_pops;
|
sport->port.ops = &lpuart_pops;
|
||||||
|
@ -2145,7 +2151,7 @@ static int lpuart_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
platform_set_drvdata(pdev, &sport->port);
|
platform_set_drvdata(pdev, &sport->port);
|
||||||
|
|
||||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE))
|
if (lpuart_is_32(sport))
|
||||||
lpuart_reg.cons = LPUART32_CONSOLE;
|
lpuart_reg.cons = LPUART32_CONSOLE;
|
||||||
else
|
else
|
||||||
lpuart_reg.cons = LPUART_CONSOLE;
|
lpuart_reg.cons = LPUART_CONSOLE;
|
||||||
|
@ -2198,7 +2204,7 @@ static int lpuart_suspend(struct device *dev)
|
||||||
struct lpuart_port *sport = dev_get_drvdata(dev);
|
struct lpuart_port *sport = dev_get_drvdata(dev);
|
||||||
unsigned long temp;
|
unsigned long temp;
|
||||||
|
|
||||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE)) {
|
if (lpuart_is_32(sport)) {
|
||||||
/* disable Rx/Tx and interrupts */
|
/* disable Rx/Tx and interrupts */
|
||||||
temp = lpuart32_read(&sport->port, UARTCTRL);
|
temp = lpuart32_read(&sport->port, UARTCTRL);
|
||||||
temp &= ~(UARTCTRL_TE | UARTCTRL_TIE | UARTCTRL_TCIE);
|
temp &= ~(UARTCTRL_TE | UARTCTRL_TIE | UARTCTRL_TCIE);
|
||||||
|
@ -2249,7 +2255,7 @@ static int lpuart_resume(struct device *dev)
|
||||||
if (sport->port.suspended && !sport->port.irq_wake)
|
if (sport->port.suspended && !sport->port.irq_wake)
|
||||||
clk_prepare_enable(sport->clk);
|
clk_prepare_enable(sport->clk);
|
||||||
|
|
||||||
if (sport->port.iotype & (UPIO_MEM32 | UPIO_MEM32BE)) {
|
if (lpuart_is_32(sport)) {
|
||||||
lpuart32_setup_watermark(sport);
|
lpuart32_setup_watermark(sport);
|
||||||
temp = lpuart32_read(&sport->port, UARTCTRL);
|
temp = lpuart32_read(&sport->port, UARTCTRL);
|
||||||
temp |= (UARTCTRL_RIE | UARTCTRL_TIE | UARTCTRL_RE |
|
temp |= (UARTCTRL_RIE | UARTCTRL_TIE | UARTCTRL_RE |
|
||||||
|
|
|
@ -186,11 +186,6 @@
|
||||||
|
|
||||||
#define UART_NR 8
|
#define UART_NR 8
|
||||||
|
|
||||||
/* RX DMA buffer periods */
|
|
||||||
#define RX_DMA_PERIODS 4
|
|
||||||
#define RX_BUF_SIZE (PAGE_SIZE)
|
|
||||||
|
|
||||||
|
|
||||||
/* i.MX21 type uart runs on all i.mx except i.MX1 and i.MX6q */
|
/* i.MX21 type uart runs on all i.mx except i.MX1 and i.MX6q */
|
||||||
enum imx_uart_type {
|
enum imx_uart_type {
|
||||||
IMX1_UART,
|
IMX1_UART,
|
||||||
|
@ -226,7 +221,6 @@ struct imx_port {
|
||||||
struct dma_chan *dma_chan_rx, *dma_chan_tx;
|
struct dma_chan *dma_chan_rx, *dma_chan_tx;
|
||||||
struct scatterlist rx_sgl, tx_sgl[2];
|
struct scatterlist rx_sgl, tx_sgl[2];
|
||||||
void *rx_buf;
|
void *rx_buf;
|
||||||
unsigned int rx_buf_size;
|
|
||||||
struct circ_buf rx_ring;
|
struct circ_buf rx_ring;
|
||||||
unsigned int rx_periods;
|
unsigned int rx_periods;
|
||||||
dma_cookie_t rx_cookie;
|
dma_cookie_t rx_cookie;
|
||||||
|
@ -464,7 +458,7 @@ static inline void imx_transmit_buffer(struct imx_port *sport)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!uart_circ_empty(xmit) &&
|
while (!uart_circ_empty(xmit) && !sport->dma_is_txing &&
|
||||||
!(readl(sport->port.membase + uts_reg(sport)) & UTS_TXFULL)) {
|
!(readl(sport->port.membase + uts_reg(sport)) & UTS_TXFULL)) {
|
||||||
/* send xmit->buf[xmit->tail]
|
/* send xmit->buf[xmit->tail]
|
||||||
* out the port here */
|
* out the port here */
|
||||||
|
@ -967,6 +961,8 @@ static void imx_timeout(unsigned long data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define RX_BUF_SIZE (PAGE_SIZE)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are two kinds of RX DMA interrupts(such as in the MX6Q):
|
* There are two kinds of RX DMA interrupts(such as in the MX6Q):
|
||||||
* [1] the RX DMA buffer is full.
|
* [1] the RX DMA buffer is full.
|
||||||
|
@ -1049,6 +1045,9 @@ static void dma_rx_callback(void *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* RX DMA buffer periods */
|
||||||
|
#define RX_DMA_PERIODS 4
|
||||||
|
|
||||||
static int start_rx_dma(struct imx_port *sport)
|
static int start_rx_dma(struct imx_port *sport)
|
||||||
{
|
{
|
||||||
struct scatterlist *sgl = &sport->rx_sgl;
|
struct scatterlist *sgl = &sport->rx_sgl;
|
||||||
|
@ -1059,8 +1058,9 @@ static int start_rx_dma(struct imx_port *sport)
|
||||||
|
|
||||||
sport->rx_ring.head = 0;
|
sport->rx_ring.head = 0;
|
||||||
sport->rx_ring.tail = 0;
|
sport->rx_ring.tail = 0;
|
||||||
|
sport->rx_periods = RX_DMA_PERIODS;
|
||||||
|
|
||||||
sg_init_one(sgl, sport->rx_buf, sport->rx_buf_size);
|
sg_init_one(sgl, sport->rx_buf, RX_BUF_SIZE);
|
||||||
ret = dma_map_sg(dev, sgl, 1, DMA_FROM_DEVICE);
|
ret = dma_map_sg(dev, sgl, 1, DMA_FROM_DEVICE);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
dev_err(dev, "DMA mapping error for RX.\n");
|
dev_err(dev, "DMA mapping error for RX.\n");
|
||||||
|
@ -1171,7 +1171,7 @@ static int imx_uart_dma_init(struct imx_port *sport)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
sport->rx_buf = kzalloc(sport->rx_buf_size, GFP_KERNEL);
|
sport->rx_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!sport->rx_buf) {
|
if (!sport->rx_buf) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -2036,7 +2036,6 @@ static int serial_imx_probe_dt(struct imx_port *sport,
|
||||||
{
|
{
|
||||||
struct device_node *np = pdev->dev.of_node;
|
struct device_node *np = pdev->dev.of_node;
|
||||||
int ret;
|
int ret;
|
||||||
u32 dma_buf_size[2];
|
|
||||||
|
|
||||||
sport->devdata = of_device_get_match_data(&pdev->dev);
|
sport->devdata = of_device_get_match_data(&pdev->dev);
|
||||||
if (!sport->devdata)
|
if (!sport->devdata)
|
||||||
|
@ -2060,14 +2059,6 @@ static int serial_imx_probe_dt(struct imx_port *sport,
|
||||||
if (of_get_property(np, "rts-gpios", NULL))
|
if (of_get_property(np, "rts-gpios", NULL))
|
||||||
sport->have_rtsgpio = 1;
|
sport->have_rtsgpio = 1;
|
||||||
|
|
||||||
if (!of_property_read_u32_array(np, "fsl,dma-size", dma_buf_size, 2)) {
|
|
||||||
sport->rx_buf_size = dma_buf_size[0] * dma_buf_size[1];
|
|
||||||
sport->rx_periods = dma_buf_size[1];
|
|
||||||
} else {
|
|
||||||
sport->rx_buf_size = RX_BUF_SIZE;
|
|
||||||
sport->rx_periods = RX_DMA_PERIODS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -1085,10 +1085,12 @@ static ssize_t rx_trigger_store(struct device *dev,
|
||||||
{
|
{
|
||||||
struct uart_port *port = dev_get_drvdata(dev);
|
struct uart_port *port = dev_get_drvdata(dev);
|
||||||
struct sci_port *sci = to_sci_port(port);
|
struct sci_port *sci = to_sci_port(port);
|
||||||
|
int ret;
|
||||||
long r;
|
long r;
|
||||||
|
|
||||||
if (kstrtol(buf, 0, &r) == -EINVAL)
|
ret = kstrtol(buf, 0, &r);
|
||||||
return -EINVAL;
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
sci->rx_trigger = scif_set_rtrg(port, r);
|
sci->rx_trigger = scif_set_rtrg(port, r);
|
||||||
if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
|
if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
|
||||||
|
@ -1116,10 +1118,12 @@ static ssize_t rx_fifo_timeout_store(struct device *dev,
|
||||||
{
|
{
|
||||||
struct uart_port *port = dev_get_drvdata(dev);
|
struct uart_port *port = dev_get_drvdata(dev);
|
||||||
struct sci_port *sci = to_sci_port(port);
|
struct sci_port *sci = to_sci_port(port);
|
||||||
|
int ret;
|
||||||
long r;
|
long r;
|
||||||
|
|
||||||
if (kstrtol(buf, 0, &r) == -EINVAL)
|
ret = kstrtol(buf, 0, &r);
|
||||||
return -EINVAL;
|
if (ret)
|
||||||
|
return ret;
|
||||||
sci->rx_fifo_timeout = r;
|
sci->rx_fifo_timeout = r;
|
||||||
scif_set_rtrg(port, 1);
|
scif_set_rtrg(port, 1);
|
||||||
if (r > 0)
|
if (r > 0)
|
||||||
|
|
|
@ -758,6 +758,7 @@ static int asc_init_port(struct asc_port *ascport,
|
||||||
if (IS_ERR(ascport->pinctrl)) {
|
if (IS_ERR(ascport->pinctrl)) {
|
||||||
ret = PTR_ERR(ascport->pinctrl);
|
ret = PTR_ERR(ascport->pinctrl);
|
||||||
dev_err(&pdev->dev, "Failed to get Pinctrl: %d\n", ret);
|
dev_err(&pdev->dev, "Failed to get Pinctrl: %d\n", ret);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ascport->states[DEFAULT] =
|
ascport->states[DEFAULT] =
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
|
||||||
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
|
||||||
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
|
||||||
#define TIOCGPTPEER _IOR('T', 0x41, int) /* Safely open the slave */
|
#define TIOCGPTPEER _IO('T', 0x41) /* Safely open the slave */
|
||||||
|
|
||||||
#define FIONCLEX 0x5450
|
#define FIONCLEX 0x5450
|
||||||
#define FIOCLEX 0x5451
|
#define FIOCLEX 0x5451
|
||||||
|
|
Loading…
Reference in New Issue