|
@@ -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)
|