diff options
author | Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> | 2014-11-06 03:22:56 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-11-06 17:59:22 -0500 |
commit | 13bd3e6fa177883914fa64b609651e56d58eea65 (patch) | |
tree | b274d50dc5dfb3ac39c526051faca5186e1976c1 | |
parent | 2fc0184dae7be565e4ad47c720e6014cd5543a21 (diff) |
serial/atmel: Use the rs485 functions on serial_core
In order to unify all the rs485 ioctl handling.
Use the implementation of TIOC[GS]RS485 ioctl handling on serial_core.
Reviewed-by: Alan Cox <alan@linux.intel.com>
Cc: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/tty/serial/atmel_serial.c | 79 |
1 files changed, 24 insertions, 55 deletions
diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index b1d61dc3fc1b..80c4bfcff3fa 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c | |||
@@ -167,7 +167,6 @@ struct atmel_uart_port { | |||
167 | 167 | ||
168 | struct circ_buf rx_ring; | 168 | struct circ_buf rx_ring; |
169 | 169 | ||
170 | struct serial_rs485 rs485; /* rs485 settings */ | ||
171 | struct mctrl_gpios *gpios; | 170 | struct mctrl_gpios *gpios; |
172 | int gpio_irq[UART_GPIO_MAX]; | 171 | int gpio_irq[UART_GPIO_MAX]; |
173 | unsigned int tx_done_mask; | 172 | unsigned int tx_done_mask; |
@@ -290,7 +289,8 @@ static unsigned int atmel_get_lines_status(struct uart_port *port) | |||
290 | } | 289 | } |
291 | 290 | ||
292 | /* Enable or disable the rs485 support */ | 291 | /* Enable or disable the rs485 support */ |
293 | void atmel_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf) | 292 | static int atmel_config_rs485(struct uart_port *port, |
293 | struct serial_rs485 *rs485conf) | ||
294 | { | 294 | { |
295 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); | 295 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); |
296 | unsigned int mode; | 296 | unsigned int mode; |
@@ -306,7 +306,7 @@ void atmel_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf) | |||
306 | /* Resetting serial mode to RS232 (0x0) */ | 306 | /* Resetting serial mode to RS232 (0x0) */ |
307 | mode &= ~ATMEL_US_USMODE; | 307 | mode &= ~ATMEL_US_USMODE; |
308 | 308 | ||
309 | atmel_port->rs485 = *rs485conf; | 309 | port->rs485 = *rs485conf; |
310 | 310 | ||
311 | if (rs485conf->flags & SER_RS485_ENABLED) { | 311 | if (rs485conf->flags & SER_RS485_ENABLED) { |
312 | dev_dbg(port->dev, "Setting UART to RS485\n"); | 312 | dev_dbg(port->dev, "Setting UART to RS485\n"); |
@@ -329,6 +329,7 @@ void atmel_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf) | |||
329 | 329 | ||
330 | spin_unlock_irqrestore(&port->lock, flags); | 330 | spin_unlock_irqrestore(&port->lock, flags); |
331 | 331 | ||
332 | return 0; | ||
332 | } | 333 | } |
333 | 334 | ||
334 | /* | 335 | /* |
@@ -372,11 +373,10 @@ static void atmel_set_mctrl(struct uart_port *port, u_int mctrl) | |||
372 | /* Resetting serial mode to RS232 (0x0) */ | 373 | /* Resetting serial mode to RS232 (0x0) */ |
373 | mode &= ~ATMEL_US_USMODE; | 374 | mode &= ~ATMEL_US_USMODE; |
374 | 375 | ||
375 | if (atmel_port->rs485.flags & SER_RS485_ENABLED) { | 376 | if (port->rs485.flags & SER_RS485_ENABLED) { |
376 | dev_dbg(port->dev, "Setting UART to RS485\n"); | 377 | dev_dbg(port->dev, "Setting UART to RS485\n"); |
377 | if ((atmel_port->rs485.delay_rts_after_send) > 0) | 378 | if ((port->rs485.delay_rts_after_send) > 0) |
378 | UART_PUT_TTGR(port, | 379 | UART_PUT_TTGR(port, port->rs485.delay_rts_after_send); |
379 | atmel_port->rs485.delay_rts_after_send); | ||
380 | mode |= ATMEL_US_USMODE_RS485; | 380 | mode |= ATMEL_US_USMODE_RS485; |
381 | } else { | 381 | } else { |
382 | dev_dbg(port->dev, "Setting UART to RS232\n"); | 382 | dev_dbg(port->dev, "Setting UART to RS232\n"); |
@@ -423,8 +423,8 @@ static void atmel_stop_tx(struct uart_port *port) | |||
423 | /* Disable interrupts */ | 423 | /* Disable interrupts */ |
424 | UART_PUT_IDR(port, atmel_port->tx_done_mask); | 424 | UART_PUT_IDR(port, atmel_port->tx_done_mask); |
425 | 425 | ||
426 | if ((atmel_port->rs485.flags & SER_RS485_ENABLED) && | 426 | if ((port->rs485.flags & SER_RS485_ENABLED) && |
427 | !(atmel_port->rs485.flags & SER_RS485_RX_DURING_TX)) | 427 | !(port->rs485.flags & SER_RS485_RX_DURING_TX)) |
428 | atmel_start_rx(port); | 428 | atmel_start_rx(port); |
429 | } | 429 | } |
430 | 430 | ||
@@ -441,8 +441,8 @@ static void atmel_start_tx(struct uart_port *port) | |||
441 | really need this.*/ | 441 | really need this.*/ |
442 | return; | 442 | return; |
443 | 443 | ||
444 | if ((atmel_port->rs485.flags & SER_RS485_ENABLED) && | 444 | if ((port->rs485.flags & SER_RS485_ENABLED) && |
445 | !(atmel_port->rs485.flags & SER_RS485_RX_DURING_TX)) | 445 | !(port->rs485.flags & SER_RS485_RX_DURING_TX)) |
446 | atmel_stop_rx(port); | 446 | atmel_stop_rx(port); |
447 | 447 | ||
448 | /* re-enable PDC transmit */ | 448 | /* re-enable PDC transmit */ |
@@ -807,7 +807,7 @@ static void atmel_tx_dma(struct uart_port *port) | |||
807 | atmel_port->cookie_tx = dmaengine_submit(desc); | 807 | atmel_port->cookie_tx = dmaengine_submit(desc); |
808 | 808 | ||
809 | } else { | 809 | } else { |
810 | if (atmel_port->rs485.flags & SER_RS485_ENABLED) { | 810 | if (port->rs485.flags & SER_RS485_ENABLED) { |
811 | /* DMA done, stop TX, start RX for RS485 */ | 811 | /* DMA done, stop TX, start RX for RS485 */ |
812 | atmel_start_rx(port); | 812 | atmel_start_rx(port); |
813 | } | 813 | } |
@@ -1254,8 +1254,8 @@ static void atmel_tx_pdc(struct uart_port *port) | |||
1254 | /* Enable interrupts */ | 1254 | /* Enable interrupts */ |
1255 | UART_PUT_IER(port, atmel_port->tx_done_mask); | 1255 | UART_PUT_IER(port, atmel_port->tx_done_mask); |
1256 | } else { | 1256 | } else { |
1257 | if ((atmel_port->rs485.flags & SER_RS485_ENABLED) && | 1257 | if ((port->rs485.flags & SER_RS485_ENABLED) && |
1258 | !(atmel_port->rs485.flags & SER_RS485_RX_DURING_TX)) { | 1258 | !(port->rs485.flags & SER_RS485_RX_DURING_TX)) { |
1259 | /* DMA done, stop TX, start RX for RS485 */ | 1259 | /* DMA done, stop TX, start RX for RS485 */ |
1260 | atmel_start_rx(port); | 1260 | atmel_start_rx(port); |
1261 | } | 1261 | } |
@@ -1566,7 +1566,7 @@ static int atmel_init_property(struct atmel_uart_port *atmel_port, | |||
1566 | return 0; | 1566 | return 0; |
1567 | } | 1567 | } |
1568 | 1568 | ||
1569 | static void atmel_init_rs485(struct atmel_uart_port *atmel_port, | 1569 | static void atmel_init_rs485(struct uart_port *port, |
1570 | struct platform_device *pdev) | 1570 | struct platform_device *pdev) |
1571 | { | 1571 | { |
1572 | struct device_node *np = pdev->dev.of_node; | 1572 | struct device_node *np = pdev->dev.of_node; |
@@ -1577,7 +1577,7 @@ static void atmel_init_rs485(struct atmel_uart_port *atmel_port, | |||
1577 | /* rs485 properties */ | 1577 | /* rs485 properties */ |
1578 | if (of_property_read_u32_array(np, "rs485-rts-delay", | 1578 | if (of_property_read_u32_array(np, "rs485-rts-delay", |
1579 | rs485_delay, 2) == 0) { | 1579 | rs485_delay, 2) == 0) { |
1580 | struct serial_rs485 *rs485conf = &atmel_port->rs485; | 1580 | struct serial_rs485 *rs485conf = &port->rs485; |
1581 | 1581 | ||
1582 | rs485conf->delay_rts_before_send = rs485_delay[0]; | 1582 | rs485conf->delay_rts_before_send = rs485_delay[0]; |
1583 | rs485conf->delay_rts_after_send = rs485_delay[1]; | 1583 | rs485conf->delay_rts_after_send = rs485_delay[1]; |
@@ -1591,7 +1591,7 @@ static void atmel_init_rs485(struct atmel_uart_port *atmel_port, | |||
1591 | rs485conf->flags |= SER_RS485_ENABLED; | 1591 | rs485conf->flags |= SER_RS485_ENABLED; |
1592 | } | 1592 | } |
1593 | } else { | 1593 | } else { |
1594 | atmel_port->rs485 = pdata->rs485; | 1594 | port->rs485 = pdata->rs485; |
1595 | } | 1595 | } |
1596 | 1596 | ||
1597 | } | 1597 | } |
@@ -1927,7 +1927,6 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, | |||
1927 | { | 1927 | { |
1928 | unsigned long flags; | 1928 | unsigned long flags; |
1929 | unsigned int mode, imr, quot, baud; | 1929 | unsigned int mode, imr, quot, baud; |
1930 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); | ||
1931 | 1930 | ||
1932 | /* Get current mode register */ | 1931 | /* Get current mode register */ |
1933 | mode = UART_GET_MR(port) & ~(ATMEL_US_USCLKS | ATMEL_US_CHRL | 1932 | mode = UART_GET_MR(port) & ~(ATMEL_US_USCLKS | ATMEL_US_CHRL |
@@ -2029,10 +2028,9 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, | |||
2029 | /* Resetting serial mode to RS232 (0x0) */ | 2028 | /* Resetting serial mode to RS232 (0x0) */ |
2030 | mode &= ~ATMEL_US_USMODE; | 2029 | mode &= ~ATMEL_US_USMODE; |
2031 | 2030 | ||
2032 | if (atmel_port->rs485.flags & SER_RS485_ENABLED) { | 2031 | if (port->rs485.flags & SER_RS485_ENABLED) { |
2033 | if ((atmel_port->rs485.delay_rts_after_send) > 0) | 2032 | if ((port->rs485.delay_rts_after_send) > 0) |
2034 | UART_PUT_TTGR(port, | 2033 | UART_PUT_TTGR(port, port->rs485.delay_rts_after_send); |
2035 | atmel_port->rs485.delay_rts_after_send); | ||
2036 | mode |= ATMEL_US_USMODE_RS485; | 2034 | mode |= ATMEL_US_USMODE_RS485; |
2037 | } | 2035 | } |
2038 | 2036 | ||
@@ -2171,35 +2169,6 @@ static void atmel_poll_put_char(struct uart_port *port, unsigned char ch) | |||
2171 | } | 2169 | } |
2172 | #endif | 2170 | #endif |
2173 | 2171 | ||
2174 | static int | ||
2175 | atmel_ioctl(struct uart_port *port, unsigned int cmd, unsigned long arg) | ||
2176 | { | ||
2177 | struct serial_rs485 rs485conf; | ||
2178 | |||
2179 | switch (cmd) { | ||
2180 | case TIOCSRS485: | ||
2181 | if (copy_from_user(&rs485conf, (struct serial_rs485 *) arg, | ||
2182 | sizeof(rs485conf))) | ||
2183 | return -EFAULT; | ||
2184 | |||
2185 | atmel_config_rs485(port, &rs485conf); | ||
2186 | break; | ||
2187 | |||
2188 | case TIOCGRS485: | ||
2189 | if (copy_to_user((struct serial_rs485 *) arg, | ||
2190 | &(to_atmel_uart_port(port)->rs485), | ||
2191 | sizeof(rs485conf))) | ||
2192 | return -EFAULT; | ||
2193 | break; | ||
2194 | |||
2195 | default: | ||
2196 | return -ENOIOCTLCMD; | ||
2197 | } | ||
2198 | return 0; | ||
2199 | } | ||
2200 | |||
2201 | |||
2202 | |||
2203 | static struct uart_ops atmel_pops = { | 2172 | static struct uart_ops atmel_pops = { |
2204 | .tx_empty = atmel_tx_empty, | 2173 | .tx_empty = atmel_tx_empty, |
2205 | .set_mctrl = atmel_set_mctrl, | 2174 | .set_mctrl = atmel_set_mctrl, |
@@ -2220,7 +2189,6 @@ static struct uart_ops atmel_pops = { | |||
2220 | .config_port = atmel_config_port, | 2189 | .config_port = atmel_config_port, |
2221 | .verify_port = atmel_verify_port, | 2190 | .verify_port = atmel_verify_port, |
2222 | .pm = atmel_serial_pm, | 2191 | .pm = atmel_serial_pm, |
2223 | .ioctl = atmel_ioctl, | ||
2224 | #ifdef CONFIG_CONSOLE_POLL | 2192 | #ifdef CONFIG_CONSOLE_POLL |
2225 | .poll_get_char = atmel_poll_get_char, | 2193 | .poll_get_char = atmel_poll_get_char, |
2226 | .poll_put_char = atmel_poll_put_char, | 2194 | .poll_put_char = atmel_poll_put_char, |
@@ -2240,7 +2208,7 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port, | |||
2240 | if (!atmel_init_property(atmel_port, pdev)) | 2208 | if (!atmel_init_property(atmel_port, pdev)) |
2241 | atmel_set_ops(port); | 2209 | atmel_set_ops(port); |
2242 | 2210 | ||
2243 | atmel_init_rs485(atmel_port, pdev); | 2211 | atmel_init_rs485(port, pdev); |
2244 | 2212 | ||
2245 | port->iotype = UPIO_MEM; | 2213 | port->iotype = UPIO_MEM; |
2246 | port->flags = UPF_BOOT_AUTOCONF; | 2214 | port->flags = UPF_BOOT_AUTOCONF; |
@@ -2249,6 +2217,7 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port, | |||
2249 | port->dev = &pdev->dev; | 2217 | port->dev = &pdev->dev; |
2250 | port->mapbase = pdev->resource[0].start; | 2218 | port->mapbase = pdev->resource[0].start; |
2251 | port->irq = pdev->resource[1].start; | 2219 | port->irq = pdev->resource[1].start; |
2220 | port->rs485_config = atmel_config_rs485; | ||
2252 | 2221 | ||
2253 | tasklet_init(&atmel_port->tasklet, atmel_tasklet_func, | 2222 | tasklet_init(&atmel_port->tasklet, atmel_tasklet_func, |
2254 | (unsigned long)port); | 2223 | (unsigned long)port); |
@@ -2283,7 +2252,7 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port, | |||
2283 | } | 2252 | } |
2284 | 2253 | ||
2285 | /* Use TXEMPTY for interrupt when rs485 else TXRDY or ENDTX|TXBUFE */ | 2254 | /* Use TXEMPTY for interrupt when rs485 else TXRDY or ENDTX|TXBUFE */ |
2286 | if (atmel_port->rs485.flags & SER_RS485_ENABLED) | 2255 | if (port->rs485.flags & SER_RS485_ENABLED) |
2287 | atmel_port->tx_done_mask = ATMEL_US_TXEMPTY; | 2256 | atmel_port->tx_done_mask = ATMEL_US_TXEMPTY; |
2288 | else if (atmel_use_pdc_tx(port)) { | 2257 | else if (atmel_use_pdc_tx(port)) { |
2289 | port->fifosize = PDC_BUFFER_SIZE; | 2258 | port->fifosize = PDC_BUFFER_SIZE; |
@@ -2629,7 +2598,7 @@ static int atmel_serial_probe(struct platform_device *pdev) | |||
2629 | device_init_wakeup(&pdev->dev, 1); | 2598 | device_init_wakeup(&pdev->dev, 1); |
2630 | platform_set_drvdata(pdev, port); | 2599 | platform_set_drvdata(pdev, port); |
2631 | 2600 | ||
2632 | if (port->rs485.flags & SER_RS485_ENABLED) { | 2601 | if (port->uart.rs485.flags & SER_RS485_ENABLED) { |
2633 | UART_PUT_MR(&port->uart, ATMEL_US_USMODE_NORMAL); | 2602 | UART_PUT_MR(&port->uart, ATMEL_US_USMODE_NORMAL); |
2634 | UART_PUT_CR(&port->uart, ATMEL_US_RTSEN); | 2603 | UART_PUT_CR(&port->uart, ATMEL_US_RTSEN); |
2635 | } | 2604 | } |