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>
This commit is contained in:
parent
dadd7ecbff
commit
c267d679cf
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user