mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 23:14:31 +08:00
USB: serial: cp210x: clean up line-control handling
Update the line-control settings in one request unconditionally instead of setting the word-length, parity and stop-bit settings separately. This avoids multiple requests when several settings are changed even if this scheme could potentially also be used to detect unsupported device settings. Since all device types but CP2101 appears to support all settings, let's handle that one specifically and also report back the unsupported settings properly through termios by clearing the corresponding bits. Also drop the related unnecessary debug printks. Signed-off-by: Johan Hovold <johan@kernel.org>
This commit is contained in:
parent
95168d624f
commit
d42976296c
@ -1364,9 +1364,11 @@ static bool cp210x_termios_change(const struct ktermios *a, const struct ktermio
|
||||
static void cp210x_set_termios(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, struct ktermios *old_termios)
|
||||
{
|
||||
struct cp210x_serial_private *priv = usb_get_serial_data(port->serial);
|
||||
struct device *dev = &port->dev;
|
||||
unsigned int cflag, old_cflag;
|
||||
u16 bits;
|
||||
int ret;
|
||||
|
||||
if (!cp210x_termios_change(&tty->termios, old_termios))
|
||||
return;
|
||||
@ -1377,73 +1379,52 @@ static void cp210x_set_termios(struct tty_struct *tty,
|
||||
if (tty->termios.c_ospeed != old_termios->c_ospeed)
|
||||
cp210x_change_speed(tty, port, old_termios);
|
||||
|
||||
/* If the number of data bits is to be updated */
|
||||
if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
|
||||
cp210x_get_line_ctl(port, &bits);
|
||||
bits &= ~BITS_DATA_MASK;
|
||||
switch (cflag & CSIZE) {
|
||||
/* CP2101 only supports CS8, 1 stop bit and non-stick parity. */
|
||||
if (priv->partnum == CP210X_PARTNUM_CP2101) {
|
||||
tty->termios.c_cflag &= ~(CSIZE | CSTOPB | CMSPAR);
|
||||
tty->termios.c_cflag |= CS8;
|
||||
}
|
||||
|
||||
bits = 0;
|
||||
|
||||
switch (C_CSIZE(tty)) {
|
||||
case CS5:
|
||||
bits |= BITS_DATA_5;
|
||||
dev_dbg(dev, "%s - data bits = 5\n", __func__);
|
||||
break;
|
||||
case CS6:
|
||||
bits |= BITS_DATA_6;
|
||||
dev_dbg(dev, "%s - data bits = 6\n", __func__);
|
||||
break;
|
||||
case CS7:
|
||||
bits |= BITS_DATA_7;
|
||||
dev_dbg(dev, "%s - data bits = 7\n", __func__);
|
||||
break;
|
||||
case CS8:
|
||||
default:
|
||||
bits |= BITS_DATA_8;
|
||||
dev_dbg(dev, "%s - data bits = 8\n", __func__);
|
||||
break;
|
||||
}
|
||||
if (cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits))
|
||||
dev_dbg(dev, "Number of data bits requested not supported by device\n");
|
||||
}
|
||||
|
||||
if ((cflag & (PARENB|PARODD|CMSPAR)) !=
|
||||
(old_cflag & (PARENB|PARODD|CMSPAR))) {
|
||||
cp210x_get_line_ctl(port, &bits);
|
||||
bits &= ~BITS_PARITY_MASK;
|
||||
if (cflag & PARENB) {
|
||||
if (cflag & CMSPAR) {
|
||||
if (cflag & PARODD) {
|
||||
if (C_PARENB(tty)) {
|
||||
if (C_CMSPAR(tty)) {
|
||||
if (C_PARODD(tty))
|
||||
bits |= BITS_PARITY_MARK;
|
||||
dev_dbg(dev, "%s - parity = MARK\n", __func__);
|
||||
} else {
|
||||
else
|
||||
bits |= BITS_PARITY_SPACE;
|
||||
dev_dbg(dev, "%s - parity = SPACE\n", __func__);
|
||||
}
|
||||
} else {
|
||||
if (cflag & PARODD) {
|
||||
if (C_PARODD(tty))
|
||||
bits |= BITS_PARITY_ODD;
|
||||
dev_dbg(dev, "%s - parity = ODD\n", __func__);
|
||||
} else {
|
||||
else
|
||||
bits |= BITS_PARITY_EVEN;
|
||||
dev_dbg(dev, "%s - parity = EVEN\n", __func__);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits))
|
||||
dev_dbg(dev, "Parity mode not supported by device\n");
|
||||
}
|
||||
|
||||
if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) {
|
||||
cp210x_get_line_ctl(port, &bits);
|
||||
bits &= ~BITS_STOP_MASK;
|
||||
if (cflag & CSTOPB) {
|
||||
if (C_CSTOPB(tty))
|
||||
bits |= BITS_STOP_2;
|
||||
dev_dbg(dev, "%s - stop bits = 2\n", __func__);
|
||||
} else {
|
||||
else
|
||||
bits |= BITS_STOP_1;
|
||||
dev_dbg(dev, "%s - stop bits = 1\n", __func__);
|
||||
}
|
||||
if (cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits))
|
||||
dev_dbg(dev, "Number of stop bits requested not supported by device\n");
|
||||
}
|
||||
|
||||
ret = cp210x_write_u16_reg(port, CP210X_SET_LINE_CTL, bits);
|
||||
if (ret)
|
||||
dev_err(&port->dev, "failed to set line control: %d\n", ret);
|
||||
|
||||
if ((cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
|
||||
struct cp210x_flow_ctl flow_ctl;
|
||||
|
Loading…
Reference in New Issue
Block a user