USB: serial: cp210x.c: add mark/space parity
authorRoland Koebler <r.koebler@yahoo.de>
Wed, 9 Nov 2011 18:37:08 +0000 (19:37 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 15 Nov 2011 00:46:06 +0000 (16:46 -0800)
Add mark and space parity support.

Signed-off-by: Roland Koebler <r.koebler@yahoo.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/serial/cp210x.c

index fd67cc53545bcdfcb37772e6536f6f884bd711fc..b1e5db1614879165c20603d2484ac4334907655f 100644 (file)
@@ -520,18 +520,13 @@ static void cp210x_get_termios_port(struct usb_serial_port *port,
                cflag |= PARENB;
                break;
        case BITS_PARITY_MARK:
-               dbg("%s - parity = MARK (not supported, disabling parity)",
-                               __func__);
-               cflag &= ~PARENB;
-               bits &= ~BITS_PARITY_MASK;
-               cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2);
+               dbg("%s - parity = MARK", __func__);
+               cflag |= (PARENB|PARODD|CMSPAR);
                break;
        case BITS_PARITY_SPACE:
-               dbg("%s - parity = SPACE (not supported, disabling parity)",
-                               __func__);
-               cflag &= ~PARENB;
-               bits &= ~BITS_PARITY_MASK;
-               cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2);
+               dbg("%s - parity = SPACE", __func__);
+               cflag &= ~PARODD;
+               cflag |= (PARENB|CMSPAR);
                break;
        default:
                dbg("%s - Unknown parity mode, disabling parity", __func__);
@@ -588,7 +583,6 @@ static void cp210x_set_termios(struct tty_struct *tty,
        if (!tty)
                return;
 
-       tty->termios->c_cflag &= ~CMSPAR;
        cflag = tty->termios->c_cflag;
        old_cflag = old_termios->c_cflag;
        baud = cp210x_quantise_baudrate(tty_get_baud_rate(tty));
@@ -643,16 +637,27 @@ static void cp210x_set_termios(struct tty_struct *tty,
                                        "not supported by device\n");
        }
 
-       if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))) {
+       if ((cflag     & (PARENB|PARODD|CMSPAR)) !=
+           (old_cflag & (PARENB|PARODD|CMSPAR))) {
                cp210x_get_config(port, CP210X_GET_LINE_CTL, &bits, 2);
                bits &= ~BITS_PARITY_MASK;
                if (cflag & PARENB) {
-                       if (cflag & PARODD) {
-                               bits |= BITS_PARITY_ODD;
-                               dbg("%s - parity = ODD", __func__);
+                       if (cflag & CMSPAR) {
+                           if (cflag & PARODD) {
+                                   bits |= BITS_PARITY_MARK;
+                                   dbg("%s - parity = MARK", __func__);
+                           } else {
+                                   bits |= BITS_PARITY_SPACE;
+                                   dbg("%s - parity = SPACE", __func__);
+                           }
                        } else {
-                               bits |= BITS_PARITY_EVEN;
-                               dbg("%s - parity = EVEN", __func__);
+                           if (cflag & PARODD) {
+                                   bits |= BITS_PARITY_ODD;
+                                   dbg("%s - parity = ODD", __func__);
+                           } else {
+                                   bits |= BITS_PARITY_EVEN;
+                                   dbg("%s - parity = EVEN", __func__);
+                           }
                        }
                }
                if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2))