diff options
author | Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> | 2014-11-06 03:22:55 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-11-06 17:59:22 -0500 |
commit | 2fc0184dae7be565e4ad47c720e6014cd5543a21 (patch) | |
tree | 5d8a90e2af1506216ca6f99db1cd30ef573e5731 | |
parent | b57d15fe8b37fef8f374afa08e3a557898d5d517 (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.c | 37 |
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 */ |
443 | static void mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485) | 442 | static 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 | ||
467 | static 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 | ||
516 | static struct mcf_uart mcf_ports[4]; | 491 | static 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 | } |