summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorStefan Reinauer <reinauer@chromium.org>2011-08-19 14:28:25 -0700
committerSimon Glass <sjg@chromium.org>2011-08-29 10:59:37 -0700
commit8d920268a376a12087d846ee58190a4d2b0f5794 (patch)
tree2e155f11224880c14a6b3d4b472263ee8d1984f8 /drivers
parentb124fd0733f61faef826f440645da9b386930e3e (diff)
Allow NS16550 driver to support IO and memory mapped registers
This is needed to use the same config files for all x86 platforms, while the right incarnation of register accesses is determined by the device tree. BUG=chrome-os-partner:4520 TEST=boot u-boot on Alex and Stumpy, get serial output on both. Change-Id: Ibb8192657861713d656358c5f085f6dde2cb1365 Reviewed-on: http://gerrit.chromium.org/gerrit/6248 Tested-by: Stefan Reinauer <reinauer@chromium.org> Reviewed-by: Gabe Black <gabeblack@chromium.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/serial/ns16550.c22
-rw-r--r--drivers/serial/serial_fdt.c15
2 files changed, 36 insertions, 1 deletions
diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
index aed3c294fd..04217de3db 100644
--- a/drivers/serial/ns16550.c
+++ b/drivers/serial/ns16550.c
@@ -21,7 +21,13 @@ DECLARE_GLOBAL_DATA_PTR;
#define UART_FCRVAL (UART_FCR_FIFO_EN | \
UART_FCR_RXSR | \
UART_FCR_TXSR) /* Clear & enable FIFOs */
-#ifdef CONFIG_SYS_NS16550_PORT_MAPPED
+#if defined(CONFIG_SYS_NS16550_RUNTIME_MAPPED)
+#define serial_out(x,y) if (NS16550_io_mapped) \
+ outb(x,(ulong)y); \
+ else \
+ writeb(x,y)
+#define serial_in(y) (NS16550_io_mapped ? inb((ulong)y) : readb(y))
+#elif defined(CONFIG_SYS_NS16550_PORT_MAPPED)
#define serial_out(x,y) outb(x,(ulong)y)
#define serial_in(y) inb((ulong)y)
#else
@@ -33,6 +39,20 @@ DECLARE_GLOBAL_DATA_PTR;
#define CONFIG_SYS_NS16550_IER 0x00
#endif /* CONFIG_SYS_NS16550_IER */
+#if defined(CONFIG_SYS_NS16550_RUNTIME_MAPPED)
+/* This state variable has to be set by a wrapper driver
+ * that knows whether we're operating on an IO mapped or
+ * memory mapped 16550 compatible chip.
+ * See serial_fdt.c for an example.
+ */
+static int NS16550_io_mapped;
+
+void NS16550_is_io_mapped(int io_mapped)
+{
+ NS16550_io_mapped = io_mapped;
+}
+#endif
+
void NS16550_init (NS16550_t com_port, int baud_divisor)
{
serial_out(CONFIG_SYS_NS16550_IER, &com_port->ier);
diff --git a/drivers/serial/serial_fdt.c b/drivers/serial/serial_fdt.c
index 1f4004c2f1..154a51f814 100644
--- a/drivers/serial/serial_fdt.c
+++ b/drivers/serial/serial_fdt.c
@@ -56,6 +56,9 @@ static int fserial_init(void)
switch (uart->compat) {
#ifdef CONFIG_SYS_NS16550
case COMPAT_SERIAL_NS16550:
+#ifdef CONFIG_SYS_NS16550_RUNTIME_MAPPED
+ NS16550_is_io_mapped(uart->io_mapped);
+#endif
NS16550_init((NS16550_t)uart->reg, uart->divisor);
break;
#endif
@@ -79,6 +82,9 @@ static void fserial_putc(const char c)
switch (uart->compat) {
#ifdef CONFIG_SYS_NS16550
case COMPAT_SERIAL_NS16550 :
+#ifdef CONFIG_SYS_NS16550_RUNTIME_MAPPED
+ NS16550_is_io_mapped(uart->io_mapped);
+#endif
NS16550_putc((NS16550_t)uart->reg, c);
break;
#endif
@@ -100,6 +106,9 @@ static int fserial_getc(void)
switch (uart->compat) {
#ifdef CONFIG_SYS_NS16550
case COMPAT_SERIAL_NS16550 :
+#ifdef CONFIG_SYS_NS16550_RUNTIME_MAPPED
+ NS16550_is_io_mapped(uart->io_mapped);
+#endif
return NS16550_getc((NS16550_t)uart->reg, uart->id);
#endif
default:
@@ -117,6 +126,9 @@ static int fserial_tstc(void)
switch (uart->compat) {
#ifdef CONFIG_SYS_NS16550
case COMPAT_SERIAL_NS16550 :
+#ifdef CONFIG_SYS_NS16550_RUNTIME_MAPPED
+ NS16550_is_io_mapped(uart->io_mapped);
+#endif
return NS16550_tstc((NS16550_t)uart->reg, uart->id);
#endif
default:
@@ -134,6 +146,9 @@ static void fserial_setbrg(void)
switch (uart->compat) {
#ifdef CONFIG_SYS_NS16550
case COMPAT_SERIAL_NS16550 :
+#ifdef CONFIG_SYS_NS16550_RUNTIME_MAPPED
+ NS16550_is_io_mapped(uart->io_mapped);
+#endif
NS16550_reinit((NS16550_t)uart->reg, uart->divisor);
break;
#endif