aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>2014-11-06 03:22:56 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-11-06 17:59:22 -0500
commit13bd3e6fa177883914fa64b609651e56d58eea65 (patch)
treeb274d50dc5dfb3ac39c526051faca5186e1976c1
parent2fc0184dae7be565e4ad47c720e6014cd5543a21 (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.c79
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 */
293void atmel_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf) 292static 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
1569static void atmel_init_rs485(struct atmel_uart_port *atmel_port, 1569static 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
2174static int
2175atmel_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
2203static struct uart_ops atmel_pops = { 2172static 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 }