aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/tty/serial/max310x.c70
1 files changed, 27 insertions, 43 deletions
diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
index ecb466701ede..182549f55904 100644
--- a/drivers/tty/serial/max310x.c
+++ b/drivers/tty/serial/max310x.c
@@ -877,53 +877,37 @@ static void max310x_set_termios(struct uart_port *port,
877 uart_update_timeout(port, termios->c_cflag, baud); 877 uart_update_timeout(port, termios->c_cflag, baud);
878} 878}
879 879
880static int max310x_ioctl(struct uart_port *port, unsigned int cmd, 880static int max310x_rs485_config(struct uart_port *port,
881 unsigned long arg) 881 struct serial_rs485 *rs485)
882{ 882{
883 struct serial_rs485 rs485;
884 unsigned int val; 883 unsigned int val;
885 884
886 switch (cmd) { 885 if (rs485->delay_rts_before_send > 0x0f ||
887 case TIOCSRS485: 886 rs485->delay_rts_after_send > 0x0f)
888 if (copy_from_user(&rs485, (void __user *)arg, sizeof(rs485))) 887 return -ERANGE;
889 return -EFAULT; 888
890 if (rs485.delay_rts_before_send > 0x0f || 889 val = (rs485->delay_rts_before_send << 4) |
891 rs485.delay_rts_after_send > 0x0f) 890 rs485->delay_rts_after_send;
892 return -ERANGE; 891 max310x_port_write(port, MAX310X_HDPIXDELAY_REG, val);
893 val = (rs485.delay_rts_before_send << 4) | 892 if (rs485->flags & SER_RS485_ENABLED) {
894 rs485.delay_rts_after_send; 893 max310x_port_update(port, MAX310X_MODE1_REG,
895 max310x_port_write(port, MAX310X_HDPIXDELAY_REG, val); 894 MAX310X_MODE1_TRNSCVCTRL_BIT,
896 if (rs485.flags & SER_RS485_ENABLED) { 895 MAX310X_MODE1_TRNSCVCTRL_BIT);
897 max310x_port_update(port, MAX310X_MODE1_REG, 896 max310x_port_update(port, MAX310X_MODE2_REG,
898 MAX310X_MODE1_TRNSCVCTRL_BIT, 897 MAX310X_MODE2_ECHOSUPR_BIT,
899 MAX310X_MODE1_TRNSCVCTRL_BIT); 898 MAX310X_MODE2_ECHOSUPR_BIT);
900 max310x_port_update(port, MAX310X_MODE2_REG, 899 } else {
901 MAX310X_MODE2_ECHOSUPR_BIT, 900 max310x_port_update(port, MAX310X_MODE1_REG,
902 MAX310X_MODE2_ECHOSUPR_BIT); 901 MAX310X_MODE1_TRNSCVCTRL_BIT, 0);
903 } else { 902 max310x_port_update(port, MAX310X_MODE2_REG,
904 max310x_port_update(port, MAX310X_MODE1_REG, 903 MAX310X_MODE2_ECHOSUPR_BIT, 0);
905 MAX310X_MODE1_TRNSCVCTRL_BIT, 0);
906 max310x_port_update(port, MAX310X_MODE2_REG,
907 MAX310X_MODE2_ECHOSUPR_BIT, 0);
908 }
909 return 0;
910 case TIOCGRS485:
911 memset(&rs485, 0, sizeof(rs485));
912 val = max310x_port_read(port, MAX310X_MODE1_REG);
913 rs485.flags = (val & MAX310X_MODE1_TRNSCVCTRL_BIT) ?
914 SER_RS485_ENABLED : 0;
915 rs485.flags |= SER_RS485_RTS_ON_SEND;
916 val = max310x_port_read(port, MAX310X_HDPIXDELAY_REG);
917 rs485.delay_rts_before_send = val >> 4;
918 rs485.delay_rts_after_send = val & 0x0f;
919 if (copy_to_user((void __user *)arg, &rs485, sizeof(rs485)))
920 return -EFAULT;
921 return 0;
922 default:
923 break;
924 } 904 }
925 905
926 return -ENOIOCTLCMD; 906 rs485->flags &= SER_RS485_RTS_ON_SEND | SER_RS485_ENABLED;
907 memset(rs485->padding, 0, sizeof(rs485->padding));
908 port->rs485 = *rs485;
909
910 return 0;
927} 911}
928 912
929static int max310x_startup(struct uart_port *port) 913static int max310x_startup(struct uart_port *port)
@@ -1018,7 +1002,6 @@ static const struct uart_ops max310x_ops = {
1018 .release_port = max310x_null_void, 1002 .release_port = max310x_null_void,
1019 .config_port = max310x_config_port, 1003 .config_port = max310x_config_port,
1020 .verify_port = max310x_verify_port, 1004 .verify_port = max310x_verify_port,
1021 .ioctl = max310x_ioctl,
1022}; 1005};
1023 1006
1024static int __maybe_unused max310x_suspend(struct device *dev) 1007static int __maybe_unused max310x_suspend(struct device *dev)
@@ -1219,6 +1202,7 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
1219 s->p[i].port.iobase = i * 0x20; 1202 s->p[i].port.iobase = i * 0x20;
1220 s->p[i].port.membase = (void __iomem *)~0; 1203 s->p[i].port.membase = (void __iomem *)~0;
1221 s->p[i].port.uartclk = uartclk; 1204 s->p[i].port.uartclk = uartclk;
1205 s->p[i].port.rs485_config = max310x_rs485_config;
1222 s->p[i].port.ops = &max310x_ops; 1206 s->p[i].port.ops = &max310x_ops;
1223 /* Disable all interrupts */ 1207 /* Disable all interrupts */
1224 max310x_port_write(&s->p[i].port, MAX310X_IRQEN_REG, 0); 1208 max310x_port_write(&s->p[i].port, MAX310X_IRQEN_REG, 0);