diff --git a/common/serial.c b/common/serial.c
index 6d5eb448ad22b806dfc31c32b6ff49cea75b4c60..3152873905fd85455c80dc85dfc19201927f78b8 100644
--- a/common/serial.c
+++ b/common/serial.c
@@ -86,6 +86,7 @@ serial_initfunc(ixp_serial_initialize);
 serial_initfunc(ks8695_serial_initialize);
 serial_initfunc(lh7a40x_serial_initialize);
 serial_initfunc(lpc2292_serial_initialize);
+serial_initfunc(max3100_serial_initialize);
 
 void serial_register(struct serial_device *dev)
 {
@@ -150,6 +151,7 @@ void serial_initialize(void)
 	ks8695_serial_initialize();
 	lh7a40x_serial_initialize();
 	lpc2292_serial_initialize();
+	max3100_serial_initialize();
 
 	serial_assign(default_serial_console()->name);
 }
diff --git a/drivers/serial/serial_max3100.c b/drivers/serial/serial_max3100.c
index 4abc27109b4afe58f25262a93f4e43234cb93829..b21fba0691604012373d375c1075a35df9efe4c2 100644
--- a/drivers/serial/serial_max3100.c
+++ b/drivers/serial/serial_max3100.c
@@ -25,6 +25,8 @@
 
 #include <common.h>
 #include <watchdog.h>
+#include <serial.h>
+#include <linux/compiler.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -149,7 +151,7 @@ static int rxfifo_in;
 static int rxfifo_out;
 static unsigned char rxfifo_buf[16];
 
-static void max3100_putc(int c)
+static void max3100_serial_putc_raw(int c)
 {
 	unsigned int rx;
 
@@ -164,7 +166,7 @@ static void max3100_putc(int c)
 	}
 }
 
-static int max3100_getc(void)
+static int max3100_serial_getc(void)
 {
 	int c;
 	unsigned int rx;
@@ -190,7 +192,7 @@ static int max3100_getc(void)
 	return c;
 }
 
-static int max3100_tstc(void)
+static int max3100_serial_tstc(void)
 {
 	unsigned int rx;
 
@@ -213,7 +215,7 @@ static int max3100_tstc(void)
 	return 1;
 }
 
-int serial_init(void)
+static int max3100_serial_init(void)
 {
 	unsigned int wconf, rconf;
 	int i;
@@ -268,31 +270,73 @@ int serial_init(void)
 	return (0);
 }
 
-void serial_putc(const char c)
+static void max3100_serial_putc(const char c)
 {
 	if (c == '\n')
-		max3100_putc('\r');
+		max3100_serial_putc_raw('\r');
 
-	max3100_putc(c);
+	max3100_serial_putc_raw(c);
 }
 
-void serial_puts(const char *s)
+static void max3100_serial_puts(const char *s)
 {
 	while (*s)
-		serial_putc (*s++);
+		max3100_serial_putc_raw(*s++);
 }
 
-int serial_getc(void)
+static void max3100_serial_setbrg(void)
 {
-	return max3100_getc();
 }
 
-int serial_tstc(void)
+#ifdef CONFIG_SERIAL_MULTI
+static struct serial_device max3100_serial_drv = {
+	.name	= "max3100_serial",
+	.start	= max3100_serial_init,
+	.stop	= NULL,
+	.setbrg	= max3100_serial_setbrg,
+	.putc	= max3100_serial_putc,
+	.puts	= max3100_serial_puts,
+	.getc	= max3100_serial_getc,
+	.tstc	= max3100_serial_tstc,
+};
+
+void max3100_serial_initialize(void)
+{
+	serial_register(&max3100_serial_drv);
+}
+
+__weak struct serial_device *default_serial_console(void)
+{
+	return &max3100_serial_drv;
+}
+#else
+int serial_init(void)
 {
-	return max3100_tstc();
+	return max3100_serial_init();
 }
 
-/* XXX WTF? */
 void serial_setbrg(void)
 {
+	max3100_serial_setbrg();
+}
+
+void serial_putc(const char c)
+{
+	max3100_serial_putc(c);
+}
+
+void serial_puts(const char *s)
+{
+	max3100_serial_puts(s);
+}
+
+int serial_getc(void)
+{
+	return max3100_serial_getc();
+}
+
+int serial_tstc(void)
+{
+	return max3100_serial_tstc();
 }
+#endif