]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
dm: serial: Move baud rate calculation to ns16550.c
authorSimon Glass <sjg@chromium.org>
Thu, 4 Sep 2014 22:27:32 +0000 (16:27 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 10 Sep 2014 19:00:01 +0000 (13:00 -0600)
Move the function that calculates the baud rate divisor into ns16550.c so
it can be used by that file.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/serial/ns16550.c
drivers/serial/serial_ns16550.c
include/ns16550.h

index 079f67d3801b0c3297076beb62f7d8c02565323e..3f5f4efe077b0947880825525eb6f8b82adb87c3 100644 (file)
@@ -4,7 +4,7 @@
  * modified to use CONFIG_SYS_ISA_MEM and new defines
  */
 
  * modified to use CONFIG_SYS_ISA_MEM and new defines
  */
 
-#include <config.h>
+#include <common.h>
 #include <ns16550.h>
 #include <watchdog.h>
 #include <linux/types.h>
 #include <ns16550.h>
 #include <watchdog.h>
 #include <linux/types.h>
 #define CONFIG_SYS_NS16550_IER  0x00
 #endif /* CONFIG_SYS_NS16550_IER */
 
 #define CONFIG_SYS_NS16550_IER  0x00
 #endif /* CONFIG_SYS_NS16550_IER */
 
+int ns16550_calc_divisor(NS16550_t port, int clock, int baudrate)
+{
+       const unsigned int mode_x_div = 16;
+
+#ifdef CONFIG_OMAP1510
+       /* If can't cleanly clock 115200 set div to 1 */
+       if ((clock == 12000000) && (baudrate == 115200)) {
+               port->osc_12m_sel = OSC_12M_SEL;  /* enable 6.5 * divisor */
+               return 1;                       /* return 1 for base divisor */
+       }
+       port->osc_12m_sel = 0;                  /* clear if previsouly set */
+#endif
+
+       return DIV_ROUND_CLOSEST(clock, mode_x_div * baudrate);
+}
+
 void NS16550_init(NS16550_t com_port, int baud_divisor)
 {
 #if (defined(CONFIG_SPL_BUILD) && defined(CONFIG_OMAP34XX))
 void NS16550_init(NS16550_t com_port, int baud_divisor)
 {
 #if (defined(CONFIG_SPL_BUILD) && defined(CONFIG_OMAP34XX))
index dafeed742df49e7d56bf2774314ea535c228be22..632da4cf70bb93c15c2a84a93815b6b6078c06c4 100644 (file)
@@ -81,7 +81,8 @@ static NS16550_t serial_ports[6] = {
        static int  eserial##port##_init(void) \
        { \
                int clock_divisor; \
        static int  eserial##port##_init(void) \
        { \
                int clock_divisor; \
-               clock_divisor = calc_divisor(serial_ports[port-1]); \
+               clock_divisor = ns16550_calc_divisor(serial_ports[port-1], \
+                               CONFIG_SYS_NS16550_CLK, gd->baudrate); \
                NS16550_init(serial_ports[port-1], clock_divisor); \
                return 0 ; \
        } \
                NS16550_init(serial_ports[port-1], clock_divisor); \
                return 0 ; \
        } \
@@ -118,14 +119,6 @@ static NS16550_t serial_ports[6] = {
        .puts   = eserial##port##_puts,         \
 }
 
        .puts   = eserial##port##_puts,         \
 }
 
-static int calc_divisor (NS16550_t port)
-{
-       const unsigned int mode_x_div = 16;
-
-       return DIV_ROUND_CLOSEST(CONFIG_SYS_NS16550_CLK,
-                                               mode_x_div * gd->baudrate);
-}
-
 void
 _serial_putc(const char c,const int port)
 {
 void
 _serial_putc(const char c,const int port)
 {
@@ -167,7 +160,8 @@ _serial_setbrg (const int port)
 {
        int clock_divisor;
 
 {
        int clock_divisor;
 
-       clock_divisor = calc_divisor(PORT);
+       clock_divisor = ns16550_calc_divisor(PORT, CONFIG_SYS_NS16550_CLK,
+                                            gd->baudrate);
        NS16550_reinit(PORT, clock_divisor);
 }
 
        NS16550_reinit(PORT, clock_divisor);
 }
 
index d1f3a906c095d8f0269f8ce376f92804e0c5943c..d93e28e3eca3d08937d3e673ff80a9870e850099 100644 (file)
@@ -170,3 +170,16 @@ void NS16550_putc(NS16550_t com_port, char c);
 char NS16550_getc(NS16550_t com_port);
 int NS16550_tstc(NS16550_t com_port);
 void NS16550_reinit(NS16550_t com_port, int baud_divisor);
 char NS16550_getc(NS16550_t com_port);
 int NS16550_tstc(NS16550_t com_port);
 void NS16550_reinit(NS16550_t com_port, int baud_divisor);
+
+/**
+ * ns16550_calc_divisor() - calculate the divisor given clock and baud rate
+ *
+ * Given the UART input clock and required baudrate, calculate the divisor
+ * that should be used.
+ *
+ * @port:      UART port
+ * @clock:     UART input clock speed in Hz
+ * @baudrate:  Required baud rate
+ * @return baud rate divisor that should be used
+ */
+int ns16550_calc_divisor(NS16550_t port, int clock, int baudrate);