Commit 2fc0184d authored by Ricardo Ribalda Delgado's avatar Ricardo Ribalda Delgado Committed by Greg Kroah-Hartman

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: default avatarAlan Cox <alan@linux.intel.com>
Cc: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: default avatarRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b57d15fe
...@@ -57,7 +57,6 @@ struct mcf_uart { ...@@ -57,7 +57,6 @@ struct mcf_uart {
struct uart_port port; struct uart_port port;
unsigned int sigs; /* Local copy of line sigs */ unsigned int sigs; /* Local copy of line sigs */
unsigned char imr; /* Local IMR mirror */ unsigned char imr; /* Local IMR mirror */
struct serial_rs485 rs485; /* RS485 settings */
}; };
/****************************************************************************/ /****************************************************************************/
...@@ -104,7 +103,7 @@ static void mcf_start_tx(struct uart_port *port) ...@@ -104,7 +103,7 @@ static void mcf_start_tx(struct uart_port *port)
{ {
struct mcf_uart *pp = container_of(port, struct mcf_uart, port); struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
if (pp->rs485.flags & SER_RS485_ENABLED) { if (port->rs485.flags & SER_RS485_ENABLED) {
/* Enable Transmitter */ /* Enable Transmitter */
writeb(MCFUART_UCR_TXENABLE, port->membase + MCFUART_UCR); writeb(MCFUART_UCR_TXENABLE, port->membase + MCFUART_UCR);
/* Manually assert RTS */ /* Manually assert RTS */
...@@ -258,7 +257,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios, ...@@ -258,7 +257,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
mr2 |= MCFUART_MR2_TXCTS; mr2 |= MCFUART_MR2_TXCTS;
} }
if (pp->rs485.flags & SER_RS485_ENABLED) { if (port->rs485.flags & SER_RS485_ENABLED) {
dev_dbg(port->dev, "Setting UART to RS485\n"); dev_dbg(port->dev, "Setting UART to RS485\n");
mr2 |= MCFUART_MR2_TXRTS; mr2 |= MCFUART_MR2_TXRTS;
} }
...@@ -360,7 +359,7 @@ static void mcf_tx_chars(struct mcf_uart *pp) ...@@ -360,7 +359,7 @@ static void mcf_tx_chars(struct mcf_uart *pp)
pp->imr &= ~MCFUART_UIR_TXREADY; pp->imr &= ~MCFUART_UIR_TXREADY;
writeb(pp->imr, port->membase + MCFUART_UIMR); writeb(pp->imr, port->membase + MCFUART_UIMR);
/* Disable TX to negate RTS automatically */ /* Disable TX to negate RTS automatically */
if (pp->rs485.flags & SER_RS485_ENABLED) if (port->rs485.flags & SER_RS485_ENABLED)
writeb(MCFUART_UCR_TXDISABLE, writeb(MCFUART_UCR_TXDISABLE,
port->membase + MCFUART_UCR); port->membase + MCFUART_UCR);
} }
...@@ -440,7 +439,7 @@ static int mcf_verify_port(struct uart_port *port, struct serial_struct *ser) ...@@ -440,7 +439,7 @@ static int mcf_verify_port(struct uart_port *port, struct serial_struct *ser)
/****************************************************************************/ /****************************************************************************/
/* Enable or disable the RS485 support */ /* Enable or disable the RS485 support */
static void mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485) static int mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485)
{ {
struct mcf_uart *pp = container_of(port, struct mcf_uart, port); struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
unsigned long flags; unsigned long flags;
...@@ -460,32 +459,9 @@ static void mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485) ...@@ -460,32 +459,9 @@ static void mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485)
} }
writeb(mr1, port->membase + MCFUART_UMR); writeb(mr1, port->membase + MCFUART_UMR);
writeb(mr2, port->membase + MCFUART_UMR); writeb(mr2, port->membase + MCFUART_UMR);
pp->rs485 = *rs485; port->rs485 = *rs485;
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
}
static int mcf_ioctl(struct uart_port *port, unsigned int cmd,
unsigned long arg)
{
switch (cmd) {
case TIOCSRS485: {
struct serial_rs485 rs485;
if (copy_from_user(&rs485, (struct serial_rs485 *)arg,
sizeof(struct serial_rs485)))
return -EFAULT;
mcf_config_rs485(port, &rs485);
break;
}
case TIOCGRS485: {
struct mcf_uart *pp = container_of(port, struct mcf_uart, port);
if (copy_to_user((struct serial_rs485 *)arg, &pp->rs485,
sizeof(struct serial_rs485)))
return -EFAULT;
break;
}
default:
return -ENOIOCTLCMD;
}
return 0; return 0;
} }
...@@ -510,7 +486,6 @@ static const struct uart_ops mcf_uart_ops = { ...@@ -510,7 +486,6 @@ static const struct uart_ops mcf_uart_ops = {
.release_port = mcf_release_port, .release_port = mcf_release_port,
.config_port = mcf_config_port, .config_port = mcf_config_port,
.verify_port = mcf_verify_port, .verify_port = mcf_verify_port,
.ioctl = mcf_ioctl,
}; };
static struct mcf_uart mcf_ports[4]; static struct mcf_uart mcf_ports[4];
...@@ -538,6 +513,7 @@ int __init early_mcf_setup(struct mcf_platform_uart *platp) ...@@ -538,6 +513,7 @@ int __init early_mcf_setup(struct mcf_platform_uart *platp)
port->irq = platp[i].irq; port->irq = platp[i].irq;
port->uartclk = MCF_BUSCLK; port->uartclk = MCF_BUSCLK;
port->flags = UPF_BOOT_AUTOCONF; port->flags = UPF_BOOT_AUTOCONF;
port->rs485_config = mcf_config_rs485;
port->ops = &mcf_uart_ops; port->ops = &mcf_uart_ops;
} }
...@@ -663,6 +639,7 @@ static int mcf_probe(struct platform_device *pdev) ...@@ -663,6 +639,7 @@ static int mcf_probe(struct platform_device *pdev)
port->uartclk = MCF_BUSCLK; port->uartclk = MCF_BUSCLK;
port->ops = &mcf_uart_ops; port->ops = &mcf_uart_ops;
port->flags = UPF_BOOT_AUTOCONF; port->flags = UPF_BOOT_AUTOCONF;
port->rs485_config = mcf_config_rs485;
uart_add_one_port(&mcf_driver, port); uart_add_one_port(&mcf_driver, port);
} }
......
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