serial: mfd: add more baud rates support
authorFeng Tang <feng.tang@intel.com>
Thu, 14 Oct 2010 09:47:35 +0000 (17:47 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 22 Oct 2010 17:20:10 +0000 (10:20 -0700)
Add more baud rates support referring the baud_table[] defined
in drivers/char/tty_ioctl.c: 3000000/2000000/1000000/500000

Signed-off-by: Feng Tang <feng.tang@intel.com>
Acked-by: Alan Cox <alan.cox@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/serial/mfd.c

index ad35130..735799e 100644 (file)
@@ -929,39 +929,52 @@ serial_hsu_set_termios(struct uart_port *port, struct ktermios *termios,
                cval |= UART_LCR_EPAR;
 
        /*
+        * The base clk is 50Mhz, and the baud rate come from:
+        *      baud = 50M * MUL / (DIV * PS * DLAB)
+        *
         * For those basic low baud rate we can get the direct
-        * scalar from 2746800, like 115200 = 2746800/24, for those
-        * higher baud rate, we have to handle them case by case,
-        * but DIV reg is never touched as its default value 0x3d09
+        * scalar from 2746800, like 115200 = 2746800/24. For those
+        * higher baud rate, we handle them case by case, mainly by
+        * adjusting the MUL/PS registers, and DIV register is kept
+        * as default value 0x3d09 to make things simple
         */
        baud = uart_get_baud_rate(port, termios, old, 0, 4000000);
-       quot = uart_get_divisor(port, baud);
 
+       quot = 1;
        switch (baud) {
        case 3500000:
                mul = 0x3345;
                ps = 0xC;
-               quot = 1;
+               break;
+       case 3000000:
+               mul = 0x2EE0;
                break;
        case 2500000:
                mul = 0x2710;
-               ps = 0x10;
-               quot = 1;
                break;
-       case 18432000:
+       case 2000000:
+               mul = 0x1F40;
+               break;
+       case 1843200:
                mul = 0x2400;
-               ps = 0x10;
-               quot = 1;
                break;
        case 1500000:
-               mul = 0x1D4C;
-               ps = 0xc;
-               quot = 1;
+               mul = 0x1770;
+               break;
+       case 1000000:
+               mul = 0xFA0;
+               break;
+       case 500000:
+               mul = 0x7D0;
                break;
        default:
-               ;
+               /* Use uart_get_divisor to get quot for other baud rates */
+               quot = 0;
        }
 
+       if (!quot)
+               quot = uart_get_divisor(port, baud);
+
        if ((up->port.uartclk / quot) < (2400 * 16))
                fcr = UART_FCR_ENABLE_FIFO | UART_FCR_HSU_64_1B;
        else if ((up->port.uartclk / quot) < (230400 * 16))