Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/max310: 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: 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>

authored by

Ricardo Ribalda Delgado and committed by
Greg Kroah-Hartman
c267d679 dadd7ecb

+27 -43
+27 -43
drivers/tty/serial/max310x.c
··· 877 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, 881 - unsigned long arg) 880 + static int max310x_rs485_config(struct uart_port *port, 881 + struct serial_rs485 *rs485) 882 882 { 883 - struct serial_rs485 rs485; 884 883 unsigned int val; 885 884 886 - switch (cmd) { 887 - case TIOCSRS485: 888 - if (copy_from_user(&rs485, (void __user *)arg, sizeof(rs485))) 889 - return -EFAULT; 890 - if (rs485.delay_rts_before_send > 0x0f || 891 - rs485.delay_rts_after_send > 0x0f) 892 - return -ERANGE; 893 - val = (rs485.delay_rts_before_send << 4) | 894 - rs485.delay_rts_after_send; 895 - max310x_port_write(port, MAX310X_HDPIXDELAY_REG, val); 896 - if (rs485.flags & SER_RS485_ENABLED) { 897 - max310x_port_update(port, MAX310X_MODE1_REG, 898 - MAX310X_MODE1_TRNSCVCTRL_BIT, 899 - MAX310X_MODE1_TRNSCVCTRL_BIT); 900 - max310x_port_update(port, MAX310X_MODE2_REG, 901 - MAX310X_MODE2_ECHOSUPR_BIT, 902 - MAX310X_MODE2_ECHOSUPR_BIT); 903 - } else { 904 - max310x_port_update(port, MAX310X_MODE1_REG, 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; 885 + if (rs485->delay_rts_before_send > 0x0f || 886 + rs485->delay_rts_after_send > 0x0f) 887 + return -ERANGE; 888 + 889 + val = (rs485->delay_rts_before_send << 4) | 890 + rs485->delay_rts_after_send; 891 + max310x_port_write(port, MAX310X_HDPIXDELAY_REG, val); 892 + if (rs485->flags & SER_RS485_ENABLED) { 893 + max310x_port_update(port, MAX310X_MODE1_REG, 894 + MAX310X_MODE1_TRNSCVCTRL_BIT, 895 + MAX310X_MODE1_TRNSCVCTRL_BIT); 896 + max310x_port_update(port, MAX310X_MODE2_REG, 897 + MAX310X_MODE2_ECHOSUPR_BIT, 898 + MAX310X_MODE2_ECHOSUPR_BIT); 899 + } else { 900 + max310x_port_update(port, MAX310X_MODE1_REG, 901 + MAX310X_MODE1_TRNSCVCTRL_BIT, 0); 902 + max310x_port_update(port, MAX310X_MODE2_REG, 903 + MAX310X_MODE2_ECHOSUPR_BIT, 0); 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 913 static int max310x_startup(struct uart_port *port) ··· 1002 1018 .release_port = max310x_null_void, 1003 1019 .config_port = max310x_config_port, 1004 1020 .verify_port = max310x_verify_port, 1005 - .ioctl = max310x_ioctl, 1006 1021 }; 1007 1022 1008 1023 static int __maybe_unused max310x_suspend(struct device *dev) ··· 1202 1219 s->p[i].port.iobase = i * 0x20; 1203 1220 s->p[i].port.membase = (void __iomem *)~0; 1204 1221 s->p[i].port.uartclk = uartclk; 1222 + s->p[i].port.rs485_config = max310x_rs485_config; 1205 1223 s->p[i].port.ops = &max310x_ops; 1206 1224 /* Disable all interrupts */ 1207 1225 max310x_port_write(&s->p[i].port, MAX310X_IRQEN_REG, 0);