/* byte size and parity */
 
-       switch (cflag & CSIZE) {
-       case CS5: info->params.data_bits = 5; break;
-       case CS6: info->params.data_bits = 6; break;
-       case CS7: info->params.data_bits = 7; break;
-       case CS8: info->params.data_bits = 8; break;
-       default:  info->params.data_bits = 7; break;
-       }
+       info->params.data_bits = tty_get_char_size(cflag);
 
        if (cflag & CSTOPB)
                info->params.stop_bits = 2;
 
                                (termios->c_cflag & PARODD ? 1 : 2) +
                                (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
 
-       switch (termios->c_cflag & CSIZE) {
-       case CS5:
-               newline.data_bits = 5;
-               break;
-       case CS6:
-               newline.data_bits = 6;
-               break;
-       case CS7:
-               newline.data_bits = 7;
-               break;
-       case CS8:
-       default:
-               newline.data_bits = 8;
-               break;
-       }
+       newline.data_bits = tty_get_char_size(termios->c_cflag);
 
        /* FIXME: needs to clear unsupported bits in the termios */
        gb_tty->clocal = ((termios->c_cflag & CLOCAL) != 0);
 
        scval = 0;
 
        /* byte size */
-       switch (termios->c_cflag & CSIZE) {
-       case CS5:
-               bits = 5;
-               break;
-       case CS6:
-               bits = 6;
-               break;
-       case CS7:
-               bits = 7;
-               break;
-       case CS8:
-               bits = 8;
-               break;
-               /* Never happens, but GCC is too dumb to figure it out */
-       default:
-               bits = 8;
-               break;
-       }
+       bits = tty_get_char_size(termios->c_cflag);
        sbits = bits - 5;
 
        if (termios->c_cflag & CSTOPB) {
 
                                 struct ktermios *old)
 {
        struct mxs_auart_port *s = to_auart_port(u);
-       u32 bm, ctrl, ctrl2, div;
+       u32 ctrl, ctrl2, div;
        unsigned int cflag, baud, baud_min, baud_max;
 
        cflag = termios->c_cflag;
        ctrl = AUART_LINECTRL_FEN;
        ctrl2 = mxs_read(s, REG_CTRL2);
 
-       /* byte size */
-       switch (cflag & CSIZE) {
-       case CS5:
-               bm = 5;
-               break;
-       case CS6:
-               bm = 6;
-               break;
-       case CS7:
-               bm = 7;
-               break;
-       case CS8:
-               bm = 8;
-               break;
-       default:
-               return;
-       }
-
-       ctrl |= AUART_LINECTRL_WLEN(bm);
+       ctrl |= AUART_LINECTRL_WLEN(tty_get_char_size(cflag));
 
        /* parity */
        if (cflag & PARENB) {
 
        }
 
        /* bits per char */
-       switch (termios->c_cflag & CSIZE) {
-       case CS5:
-               bits_per_char = 5;
-               break;
-       case CS6:
-               bits_per_char = 6;
-               break;
-       case CS7:
-               bits_per_char = 7;
-               break;
-       case CS8:
-       default:
-               bits_per_char = 8;
-               break;
-       }
+       bits_per_char = tty_get_char_size(termios->c_cflag);
 
        /* stop bits */
        if (termios->c_cflag & CSTOPB)
 
        uart_update_timeout(port, termios->c_cflag, baud);
 
        /* byte size and parity */
-       switch (termios->c_cflag & CSIZE) {
-       case CS5:
-               bits = 7;
-               break;
-       case CS6:
-               bits = 8;
-               break;
-       case CS7:
-               bits = 9;
-               break;
-       default:
-               bits = 10;
-               break;
-       }
-
-       if (termios->c_cflag & CSTOPB)
-               bits++;
-       if (termios->c_cflag & PARENB)
-               bits++;
+       bits = tty_get_frame_size(termios->c_cflag);
 
        if (sci_getreg(port, SEMR)->size)
                serial_port_out(port, SEMR, 0);
 
        free_irq(port->irq, port);
 }
 
-static unsigned int stm32_usart_get_databits(struct ktermios *termios)
-{
-       unsigned int bits;
-
-       tcflag_t cflag = termios->c_cflag;
-
-       switch (cflag & CSIZE) {
-       /*
-        * CSIZE settings are not necessarily supported in hardware.
-        * CSIZE unsupported configurations are handled here to set word length
-        * to 8 bits word as default configuration and to print debug message.
-        */
-       case CS5:
-               bits = 5;
-               break;
-       case CS6:
-               bits = 6;
-               break;
-       case CS7:
-               bits = 7;
-               break;
-       /* default including CS8 */
-       default:
-               bits = 8;
-               break;
-       }
-
-       return bits;
-}
-
 static void stm32_usart_set_termios(struct uart_port *port,
                                    struct ktermios *termios,
                                    struct ktermios *old)
        if (cflag & CSTOPB)
                cr2 |= USART_CR2_STOP_2B;
 
-       bits = stm32_usart_get_databits(termios);
+       bits = tty_get_char_size(cflag);
        stm32_port->rdr_mask = (BIT(bits) - 1);
 
        if (cflag & PARENB) {
 
 
        /* byte size and parity */
 
-       switch (cflag & CSIZE) {
-       case CS5: info->params.data_bits = 5; break;
-       case CS6: info->params.data_bits = 6; break;
-       case CS7: info->params.data_bits = 7; break;
-       case CS8: info->params.data_bits = 8; break;
-       default:  info->params.data_bits = 7; break;
-       }
-
+       info->params.data_bits = tty_get_char_size(cflag);
        info->params.stop_bits = (cflag & CSTOPB) ? 2 : 1;
 
        if (cflag & PARENB)
 
        newline.bParityType = termios->c_cflag & PARENB ?
                                (termios->c_cflag & PARODD ? 1 : 2) +
                                (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
-       switch (termios->c_cflag & CSIZE) {
-       case CS5:
-               newline.bDataBits = 5;
-               break;
-       case CS6:
-               newline.bDataBits = 6;
-               break;
-       case CS7:
-               newline.bDataBits = 7;
-               break;
-       case CS8:
-       default:
-               newline.bDataBits = 8;
-               break;
-       }
+       newline.bDataBits = tty_get_char_size(termios->c_cflag);
+
        /* FIXME: Needs to clear unsupported bits in the termios */
        acm->clocal = ((termios->c_cflag & CLOCAL) != 0);
 
 
 
        /* set the number of data bits */
        if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
-               switch (cflag & CSIZE) {
-               case CS5:
-                       urb_value = BELKIN_SA_DATA_BITS(5);
-                       break;
-               case CS6:
-                       urb_value = BELKIN_SA_DATA_BITS(6);
-                       break;
-               case CS7:
-                       urb_value = BELKIN_SA_DATA_BITS(7);
-                       break;
-               case CS8:
-                       urb_value = BELKIN_SA_DATA_BITS(8);
-                       break;
-               default:
-                       dev_dbg(&port->dev,
-                               "CSIZE was not CS5-CS8, using default of 8\n");
-                       urb_value = BELKIN_SA_DATA_BITS(8);
-                       break;
-               }
+               urb_value = BELKIN_SA_DATA_BITS(tty_get_char_size(cflag));
                if (BSA_USB_CMD(BELKIN_SA_SET_DATA_BITS_REQUEST, urb_value) < 0)
                        dev_err(&port->dev, "Set data bits error\n");
        }
 
        } else
                parity_enable = parity_type = 0;
 
-       switch (cflag & CSIZE) {
-       case CS5:
-               data_bits = 5;
-               break;
-       case CS6:
-               data_bits = 6;
-               break;
-       case CS7:
-               data_bits = 7;
-               break;
-       case CS8:
-               data_bits = 8;
-               break;
-       default:
-               dev_err(dev, "%s - CSIZE was set, but not CS5-CS8\n", __func__);
-               data_bits = 8;
-       }
+       data_bits = tty_get_char_size(cflag);
+
        spin_lock_irqsave(&priv->lock, flags);
        oldlines = priv->line_control;
        if ((cflag & CBAUD) == B0) {
 
 
        pl2303_get_line_request(port, buf);
 
-       switch (C_CSIZE(tty)) {
-       case CS5:
-               buf[6] = 5;
-               break;
-       case CS6:
-               buf[6] = 6;
-               break;
-       case CS7:
-               buf[6] = 7;
-               break;
-       default:
-       case CS8:
-               buf[6] = 8;
-       }
+       buf[6] = tty_get_char_size(tty->termios.c_cflag);
        dev_dbg(&port->dev, "data bits = %d\n", buf[6]);
 
        /* For reference buf[0]:buf[3] baud rate value */
 
 
        port_settings.port = port->port_number + 1;
 
-       /* get the byte size */
-       switch (cflag & CSIZE) {
-       case CS5:       port_settings.bits = 5;   break;
-       case CS6:       port_settings.bits = 6;   break;
-       case CS7:       port_settings.bits = 7;   break;
-       default:
-       case CS8:       port_settings.bits = 8;   break;
-       }
+       port_settings.bits = tty_get_char_size(cflag);
        dev_dbg(dev, "%s - data bits = %d\n", __func__, port_settings.bits);
 
        /* determine the parity */