aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>2014-11-06 03:22:55 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-11-06 17:59:22 -0500
commit2fc0184dae7be565e4ad47c720e6014cd5543a21 (patch)
tree5d8a90e2af1506216ca6f99db1cd30ef573e5731
parentb57d15fe8b37fef8f374afa08e3a557898d5d517 (diff)
serial/mcf: 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/tty/serial/mcf.c37
1 files changed, 7 insertions, 30 deletions
diff --git a/drivers/tty/serial/mcf.c b/drivers/tty/serial/mcf.c
index bc896dc7d2ed..d7be1f18545b 100644
--- a/drivers/tty/serial/mcf.c
+++ b/drivers/tty/serial/mcf.c
@@ -57,7 +57,6 @@ struct mcf_uart {
57 struct uart_port port; 57 struct uart_port port;
58 unsigned int sigs; /* Local copy of line sigs */ 58 unsigned int sigs; /* Local copy of line sigs */
59 unsigned char imr; /* Local IMR mirror */ 59 unsigned char imr; /* Local IMR mirror */
60 struct serial_rs485 rs485; /* RS485 settings */
61}; 60};
62 61
63/****************************************************************************/ 62/****************************************************************************/
@@ -104,7 +103,7 @@ static void mcf_start_tx(struct uart_port *port)
104{ 103{
105 struct mcf_uart *pp = container_of(port, struct mcf_uart, port); 104 struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
106 105
107 if (pp->rs485.flags & SER_RS485_ENABLED) { 106 if (port->rs485.flags & SER_RS485_ENABLED) {
108 /* Enable Transmitter */ 107 /* Enable Transmitter */
109 writeb(MCFUART_UCR_TXENABLE, port->membase + MCFUART_UCR); 108 writeb(MCFUART_UCR_TXENABLE, port->membase + MCFUART_UCR);
110 /* Manually assert RTS */ 109 /* Manually assert RTS */
@@ -258,7 +257,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
258 mr2 |= MCFUART_MR2_TXCTS; 257 mr2 |= MCFUART_MR2_TXCTS;
259 } 258 }
260 259
261 if (pp->rs485.flags & SER_RS485_ENABLED) { 260 if (port->rs485.flags & SER_RS485_ENABLED) {
262 dev_dbg(port->dev, "Setting UART to RS485\n"); 261 dev_dbg(port->dev, "Setting UART to RS485\n");
263 mr2 |= MCFUART_MR2_TXRTS; 262 mr2 |= MCFUART_MR2_TXRTS;
264 } 263 }
@@ -360,7 +359,7 @@ static void mcf_tx_chars(struct mcf_uart *pp)
360 pp->imr &= ~MCFUART_UIR_TXREADY; 359 pp->imr &= ~MCFUART_UIR_TXREADY;
361 writeb(pp->imr, port->membase + MCFUART_UIMR); 360 writeb(pp->imr, port->membase + MCFUART_UIMR);
362 /* Disable TX to negate RTS automatically */ 361 /* Disable TX to negate RTS automatically */
363 if (pp->rs485.flags & SER_RS485_ENABLED) 362 if (port->rs485.flags & SER_RS485_ENABLED)
364 writeb(MCFUART_UCR_TXDISABLE, 363 writeb(MCFUART_UCR_TXDISABLE,
365 port->membase + MCFUART_UCR); 364 port->membase + MCFUART_UCR);
366 } 365 }
@@ -440,7 +439,7 @@ static int mcf_verify_port(struct uart_port *port, struct serial_struct *ser)
440/****************************************************************************/ 439/****************************************************************************/
441 440
442/* Enable or disable the RS485 support */ 441/* Enable or disable the RS485 support */
443static void mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485) 442static int mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485)
444{ 443{
445 struct mcf_uart *pp = container_of(port, struct mcf_uart, port); 444 struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
446 unsigned long flags; 445 unsigned long flags;
@@ -460,32 +459,9 @@ static void mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485)
460 } 459 }
461 writeb(mr1, port->membase + MCFUART_UMR); 460 writeb(mr1, port->membase + MCFUART_UMR);
462 writeb(mr2, port->membase + MCFUART_UMR); 461 writeb(mr2, port->membase + MCFUART_UMR);
463 pp->rs485 = *rs485; 462 port->rs485 = *rs485;
464 spin_unlock_irqrestore(&port->lock, flags); 463 spin_unlock_irqrestore(&port->lock, flags);
465}
466 464
467static int mcf_ioctl(struct uart_port *port, unsigned int cmd,
468 unsigned long arg)
469{
470 switch (cmd) {
471 case TIOCSRS485: {
472 struct serial_rs485 rs485;
473 if (copy_from_user(&rs485, (struct serial_rs485 *)arg,
474 sizeof(struct serial_rs485)))
475 return -EFAULT;
476 mcf_config_rs485(port, &rs485);
477 break;
478 }
479 case TIOCGRS485: {
480 struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
481 if (copy_to_user((struct serial_rs485 *)arg, &pp->rs485,
482 sizeof(struct serial_rs485)))
483 return -EFAULT;
484 break;
485 }
486 default:
487 return -ENOIOCTLCMD;
488 }
489 return 0; 465 return 0;
490} 466}
491 467
@@ -510,7 +486,6 @@ static const struct uart_ops mcf_uart_ops = {
510 .release_port = mcf_release_port, 486 .release_port = mcf_release_port,
511 .config_port = mcf_config_port, 487 .config_port = mcf_config_port,
512 .verify_port = mcf_verify_port, 488 .verify_port = mcf_verify_port,
513 .ioctl = mcf_ioctl,
514}; 489};
515 490
516static struct mcf_uart mcf_ports[4]; 491static struct mcf_uart mcf_ports[4];
@@ -538,6 +513,7 @@ int __init early_mcf_setup(struct mcf_platform_uart *platp)
538 port->irq = platp[i].irq; 513 port->irq = platp[i].irq;
539 port->uartclk = MCF_BUSCLK; 514 port->uartclk = MCF_BUSCLK;
540 port->flags = UPF_BOOT_AUTOCONF; 515 port->flags = UPF_BOOT_AUTOCONF;
516 port->rs485_config = mcf_config_rs485;
541 port->ops = &mcf_uart_ops; 517 port->ops = &mcf_uart_ops;
542 } 518 }
543 519
@@ -663,6 +639,7 @@ static int mcf_probe(struct platform_device *pdev)
663 port->uartclk = MCF_BUSCLK; 639 port->uartclk = MCF_BUSCLK;
664 port->ops = &mcf_uart_ops; 640 port->ops = &mcf_uart_ops;
665 port->flags = UPF_BOOT_AUTOCONF; 641 port->flags = UPF_BOOT_AUTOCONF;
642 port->rs485_config = mcf_config_rs485;
666 643
667 uart_add_one_port(&mcf_driver, port); 644 uart_add_one_port(&mcf_driver, port);
668 } 645 }