drivers/max310: Use the rs485 functions on serial_core
authorRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Thu, 6 Nov 2014 08:22:58 +0000 (09:22 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 6 Nov 2014 23:00:15 +0000 (15:00 -0800)
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>
drivers/tty/serial/max310x.c

index ecb4667..182549f 100644 (file)
@@ -877,53 +877,37 @@ static void max310x_set_termios(struct uart_port *port,
        uart_update_timeout(port, termios->c_cflag, baud);
 }
 
-static int max310x_ioctl(struct uart_port *port, unsigned int cmd,
-                        unsigned long arg)
+static int max310x_rs485_config(struct uart_port *port,
+                               struct serial_rs485 *rs485)
 {
-       struct serial_rs485 rs485;
        unsigned int val;
 
-       switch (cmd) {
-       case TIOCSRS485:
-               if (copy_from_user(&rs485, (void __user *)arg, sizeof(rs485)))
-                       return -EFAULT;
-               if (rs485.delay_rts_before_send > 0x0f ||
-                   rs485.delay_rts_after_send > 0x0f)
-                       return -ERANGE;
-               val = (rs485.delay_rts_before_send << 4) |
-                     rs485.delay_rts_after_send;
-               max310x_port_write(port, MAX310X_HDPIXDELAY_REG, val);
-               if (rs485.flags & SER_RS485_ENABLED) {
-                       max310x_port_update(port, MAX310X_MODE1_REG,
-                                           MAX310X_MODE1_TRNSCVCTRL_BIT,
-                                           MAX310X_MODE1_TRNSCVCTRL_BIT);
-                       max310x_port_update(port, MAX310X_MODE2_REG,
-                                           MAX310X_MODE2_ECHOSUPR_BIT,
-                                           MAX310X_MODE2_ECHOSUPR_BIT);
-               } else {
-                       max310x_port_update(port, MAX310X_MODE1_REG,
-                                           MAX310X_MODE1_TRNSCVCTRL_BIT, 0);
-                       max310x_port_update(port, MAX310X_MODE2_REG,
-                                           MAX310X_MODE2_ECHOSUPR_BIT, 0);
-               }
-               return 0;
-       case TIOCGRS485:
-               memset(&rs485, 0, sizeof(rs485));
-               val = max310x_port_read(port, MAX310X_MODE1_REG);
-               rs485.flags = (val & MAX310X_MODE1_TRNSCVCTRL_BIT) ?
-                             SER_RS485_ENABLED : 0;
-               rs485.flags |= SER_RS485_RTS_ON_SEND;
-               val = max310x_port_read(port, MAX310X_HDPIXDELAY_REG);
-               rs485.delay_rts_before_send = val >> 4;
-               rs485.delay_rts_after_send = val & 0x0f;
-               if (copy_to_user((void __user *)arg, &rs485, sizeof(rs485)))
-                       return -EFAULT;
-               return 0;
-       default:
-               break;
+       if (rs485->delay_rts_before_send > 0x0f ||
+                   rs485->delay_rts_after_send > 0x0f)
+               return -ERANGE;
+
+       val = (rs485->delay_rts_before_send << 4) |
+               rs485->delay_rts_after_send;
+       max310x_port_write(port, MAX310X_HDPIXDELAY_REG, val);
+       if (rs485->flags & SER_RS485_ENABLED) {
+               max310x_port_update(port, MAX310X_MODE1_REG,
+                               MAX310X_MODE1_TRNSCVCTRL_BIT,
+                               MAX310X_MODE1_TRNSCVCTRL_BIT);
+               max310x_port_update(port, MAX310X_MODE2_REG,
+                               MAX310X_MODE2_ECHOSUPR_BIT,
+                               MAX310X_MODE2_ECHOSUPR_BIT);
+       } else {
+               max310x_port_update(port, MAX310X_MODE1_REG,
+                               MAX310X_MODE1_TRNSCVCTRL_BIT, 0);
+               max310x_port_update(port, MAX310X_MODE2_REG,
+                               MAX310X_MODE2_ECHOSUPR_BIT, 0);
        }
 
-       return -ENOIOCTLCMD;
+       rs485->flags &= SER_RS485_RTS_ON_SEND | SER_RS485_ENABLED;
+       memset(rs485->padding, 0, sizeof(rs485->padding));
+       port->rs485 = *rs485;
+
+       return 0;
 }
 
 static int max310x_startup(struct uart_port *port)
@@ -1018,7 +1002,6 @@ static const struct uart_ops max310x_ops = {
        .release_port   = max310x_null_void,
        .config_port    = max310x_config_port,
        .verify_port    = max310x_verify_port,
-       .ioctl          = max310x_ioctl,
 };
 
 static int __maybe_unused max310x_suspend(struct device *dev)
@@ -1219,6 +1202,7 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
                s->p[i].port.iobase     = i * 0x20;
                s->p[i].port.membase    = (void __iomem *)~0;
                s->p[i].port.uartclk    = uartclk;
+               s->p[i].port.rs485_config = max310x_rs485_config;
                s->p[i].port.ops        = &max310x_ops;
                /* Disable all interrupts */
                max310x_port_write(&s->p[i].port, MAX310X_IRQEN_REG, 0);