|
@@ -57,7 +57,6 @@ struct mcf_uart {
|
|
|
struct uart_port port;
|
|
|
unsigned int sigs; /* Local copy of line sigs */
|
|
|
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)
|
|
|
{
|
|
|
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 */
|
|
|
writeb(MCFUART_UCR_TXENABLE, port->membase + MCFUART_UCR);
|
|
|
/* Manually assert RTS */
|
|
@@ -258,7 +257,7 @@ static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
|
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");
|
|
|
mr2 |= MCFUART_MR2_TXRTS;
|
|
|
}
|
|
@@ -360,7 +359,7 @@ static void mcf_tx_chars(struct mcf_uart *pp)
|
|
|
pp->imr &= ~MCFUART_UIR_TXREADY;
|
|
|
writeb(pp->imr, port->membase + MCFUART_UIMR);
|
|
|
/* Disable TX to negate RTS automatically */
|
|
|
- if (pp->rs485.flags & SER_RS485_ENABLED)
|
|
|
+ if (port->rs485.flags & SER_RS485_ENABLED)
|
|
|
writeb(MCFUART_UCR_TXDISABLE,
|
|
|
port->membase + MCFUART_UCR);
|
|
|
}
|
|
@@ -440,7 +439,7 @@ static int mcf_verify_port(struct uart_port *port, struct serial_struct *ser)
|
|
|
/****************************************************************************/
|
|
|
|
|
|
/* 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);
|
|
|
unsigned long flags;
|
|
@@ -460,32 +459,9 @@ static void mcf_config_rs485(struct uart_port *port, struct serial_rs485 *rs485)
|
|
|
}
|
|
|
writeb(mr1, port->membase + MCFUART_UMR);
|
|
|
writeb(mr2, port->membase + MCFUART_UMR);
|
|
|
- pp->rs485 = *rs485;
|
|
|
+ port->rs485 = *rs485;
|
|
|
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;
|
|
|
}
|
|
|
|
|
@@ -510,7 +486,6 @@ static const struct uart_ops mcf_uart_ops = {
|
|
|
.release_port = mcf_release_port,
|
|
|
.config_port = mcf_config_port,
|
|
|
.verify_port = mcf_verify_port,
|
|
|
- .ioctl = mcf_ioctl,
|
|
|
};
|
|
|
|
|
|
static struct mcf_uart mcf_ports[4];
|
|
@@ -538,6 +513,7 @@ int __init early_mcf_setup(struct mcf_platform_uart *platp)
|
|
|
port->irq = platp[i].irq;
|
|
|
port->uartclk = MCF_BUSCLK;
|
|
|
port->flags = UPF_BOOT_AUTOCONF;
|
|
|
+ port->rs485_config = mcf_config_rs485;
|
|
|
port->ops = &mcf_uart_ops;
|
|
|
}
|
|
|
|
|
@@ -663,6 +639,7 @@ static int mcf_probe(struct platform_device *pdev)
|
|
|
port->uartclk = MCF_BUSCLK;
|
|
|
port->ops = &mcf_uart_ops;
|
|
|
port->flags = UPF_BOOT_AUTOCONF;
|
|
|
+ port->rs485_config = mcf_config_rs485;
|
|
|
|
|
|
uart_add_one_port(&mcf_driver, port);
|
|
|
}
|