From: "Chew, Chiau Ee" <chiau.ee.c...@intel.com>

This will enable high speed baud rates namely 1M, 2M, 3M, and 4M
in Intel Baytrail Designware controller.

Signed-off-by: Chew, Chiau Ee <chiau.ee.c...@intel.com>
Signed-off-by: Maurice Petallo <mauricex.r.peta...@intel.com>
---
 drivers/tty/serial/8250/8250_dw.c | 43 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/drivers/tty/serial/8250/8250_dw.c 
b/drivers/tty/serial/8250/8250_dw.c
index 2731c08..8df7d99 100644
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
@@ -124,6 +124,48 @@ static unsigned int dw8250_serial_in32(struct uart_port 
*p, int offset)
        return dw8250_modify_msr(p, offset, value);
 }
 
+#define LPSS_PRV_CLK                   0x800
+#define LPSS_PRV_CLK_EN                        (1 << 0)
+#define LPSS_PRV_CLK_M_VAL_SHIFT       1
+#define LPSS_PRV_CLK_N_VAL_SHIFT       16
+#define LPSS_PRV_CLK_UPDATE            (1 << 31)
+
+static void
+dw8250_set_termios(struct uart_port *p, struct ktermios *termios,
+                  struct ktermios *old)
+{
+       unsigned int baud = tty_termios_baud_rate(termios);
+       unsigned int m = 6912;
+       unsigned int n = 15625;
+       u32 reg;
+
+       /*
+        * For baud rates 1000000, 2000000 and 4000000 the dividers must be
+        * adjusted.
+        */
+       if (baud == 1000000 || baud == 2000000 || baud == 4000000) {
+               m = 64;
+               n = 100;
+
+               p->uartclk = 64000000;
+       } else if (baud == 3000000) {
+               m = 48;
+               n = 100;
+
+               p->uartclk = 48000000;
+       } else {
+               p->uartclk = 44236800;
+       }
+
+       /* Reset the clock */
+       reg = (m << LPSS_PRV_CLK_M_VAL_SHIFT) | (n << LPSS_PRV_CLK_N_VAL_SHIFT);
+       writel(reg, p->membase + LPSS_PRV_CLK);
+       reg |= LPSS_PRV_CLK_EN | LPSS_PRV_CLK_UPDATE;
+       writel(reg, p->membase + LPSS_PRV_CLK);
+
+       serial8250_do_set_termios(p, termios, old);
+}
+
 static int dw8250_handle_irq(struct uart_port *p)
 {
        struct dw8250_data *d = p->private_data;
@@ -265,6 +307,7 @@ static int dw8250_probe_acpi(struct uart_8250_port *up,
        p->iotype = UPIO_MEM32;
        p->serial_in = dw8250_serial_in32;
        p->serial_out = dw8250_serial_out32;
+       p->set_termios = dw8250_set_termios;
        p->regshift = 2;
 
        if (!p->uartclk)
-- 
1.9.1

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to