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__);
        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));
                                        "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))