Commit ae75d1ae authored by Linus Torvalds's avatar Linus Torvalds

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
parents dedaff2f c6325179
...@@ -9,7 +9,6 @@ Optional properties: ...@@ -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 { ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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, ...@@ -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) { } ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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
......
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