serial: ns16550: Add access functions that don't need platdata
authorSimon Glass <sjg@chromium.org>
Tue, 27 Jan 2015 01:27:08 +0000 (18:27 -0700)
committerSimon Glass <sjg@chromium.org>
Thu, 19 Feb 2015 13:20:28 +0000 (06:20 -0700)
For the debug UART we need to be able to provide any parameters before
driver model is set up. Add parameters to the low-level access functions
to make this possible.

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

index 70c9462..57e6125 100644 (file)
@@ -55,17 +55,9 @@ DECLARE_GLOBAL_DATA_PTR;
 #endif /* CONFIG_SYS_NS16550_IER */
 
 #ifdef CONFIG_DM_SERIAL
-static void ns16550_writeb(NS16550_t port, int offset, int value)
-{
-       struct ns16550_platdata *plat = port->plat;
-       unsigned char *addr;
 
-       offset *= 1 << plat->reg_shift;
-       addr = map_sysmem(plat->base, 0) + offset;
-       /*
-        * As far as we know it doesn't make sense to support selection of
-        * these options at run-time, so use the existing CONFIG options.
-        */
+static inline void serial_out_shift(unsigned char *addr, int shift, int value)
+{
 #ifdef CONFIG_SYS_NS16550_PORT_MAPPED
        outb(value, (ulong)addr);
 #elif defined(CONFIG_SYS_NS16550_MEM32) && !defined(CONFIG_SYS_BIG_ENDIAN)
@@ -73,19 +65,14 @@ static void ns16550_writeb(NS16550_t port, int offset, int value)
 #elif defined(CONFIG_SYS_NS16550_MEM32) && defined(CONFIG_SYS_BIG_ENDIAN)
        out_be32(addr, value);
 #elif defined(CONFIG_SYS_BIG_ENDIAN)
-       writeb(value, addr + (1 << plat->reg_shift) - 1);
+       writeb(value, addr + (1 << shift) - 1);
 #else
        writeb(value, addr);
 #endif
 }
 
-static int ns16550_readb(NS16550_t port, int offset)
+static inline int serial_in_shift(unsigned char *addr, int shift)
 {
-       struct ns16550_platdata *plat = port->plat;
-       unsigned char *addr;
-
-       offset *= 1 << plat->reg_shift;
-       addr = map_sysmem(plat->base, 0) + offset;
 #ifdef CONFIG_SYS_NS16550_PORT_MAPPED
        return inb((ulong)addr);
 #elif defined(CONFIG_SYS_NS16550_MEM32) && !defined(CONFIG_SYS_BIG_ENDIAN)
@@ -93,12 +80,37 @@ static int ns16550_readb(NS16550_t port, int offset)
 #elif defined(CONFIG_SYS_NS16550_MEM32) && defined(CONFIG_SYS_BIG_ENDIAN)
        return in_be32(addr);
 #elif defined(CONFIG_SYS_BIG_ENDIAN)
-       return readb(addr + (1 << plat->reg_shift) - 1);
+       return readb(addr + (1 << reg_shift) - 1);
 #else
        return readb(addr);
 #endif
 }
 
+static void ns16550_writeb(NS16550_t port, int offset, int value)
+{
+       struct ns16550_platdata *plat = port->plat;
+       unsigned char *addr;
+
+       offset *= 1 << plat->reg_shift;
+       addr = map_sysmem(plat->base, 0) + offset;
+       /*
+        * As far as we know it doesn't make sense to support selection of
+        * these options at run-time, so use the existing CONFIG options.
+        */
+       serial_out_shift(addr, plat->reg_shift, value);
+}
+
+static int ns16550_readb(NS16550_t port, int offset)
+{
+       struct ns16550_platdata *plat = port->plat;
+       unsigned char *addr;
+
+       offset *= 1 << plat->reg_shift;
+       addr = map_sysmem(plat->base, 0) + offset;
+
+       return serial_in_shift(addr, plat->reg_shift);
+}
+
 /* We can clean these up once everything is moved to driver model */
 #define serial_out(value, addr)        \
        ns16550_writeb(com_port, addr - (unsigned char *)com_port, value)