diff options
-rw-r--r-- | drivers/tty/serial/max310x.c | 70 |
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 | ||
880 | static int max310x_ioctl(struct uart_port *port, unsigned int cmd, | 880 | static 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 | ||
929 | static int max310x_startup(struct uart_port *port) | 913 | static 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 | ||
1024 | static int __maybe_unused max310x_suspend(struct device *dev) | 1007 | static 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); |