diff --git a/arch/mips/cpu/xburst/jz_serial.c b/arch/mips/cpu/xburst/jz_serial.c
index e6c48e0890a7d13be460920ce24300b898c9848a..b1e1d276e72e2fec6156d79754bf540c4603fc6d 100644
--- a/arch/mips/cpu/xburst/jz_serial.c
+++ b/arch/mips/cpu/xburst/jz_serial.c
@@ -23,6 +23,8 @@
 #include <common.h>
 #include <asm/io.h>
 #include <asm/jz4740.h>
+#include <serial.h>
+#include <linux/compiler.h>
 
 /*
  * serial_init - initialize a channel
@@ -35,7 +37,7 @@
  */
 struct jz4740_uart *uart = (struct jz4740_uart *)CONFIG_SYS_UART_BASE;
 
-int serial_init(void)
+static int jz_serial_init(void)
 {
 	/* Disable port interrupts while changing hardware */
 	writeb(0, &uart->dlhr_ier);
@@ -62,7 +64,7 @@ int serial_init(void)
 	return 0;
 }
 
-void serial_setbrg(void)
+static void jz_serial_setbrg(void)
 {
 	u32 baud_div, tmp;
 
@@ -79,7 +81,7 @@ void serial_setbrg(void)
 	writeb(tmp, &uart->lcr);
 }
 
-int serial_tstc(void)
+static int jz_serial_tstc(void)
 {
 	if (readb(&uart->lsr) & UART_LSR_DR)
 		return 1;
@@ -87,7 +89,7 @@ int serial_tstc(void)
 	return 0;
 }
 
-void serial_putc(const char c)
+static void jz_serial_putc(const char c)
 {
 	if (c == '\n')
 		serial_putc('\r');
@@ -99,7 +101,7 @@ void serial_putc(const char c)
 	writeb((u8)c, &uart->rbr_thr_dllr);
 }
 
-int serial_getc(void)
+static int jz_serial_getc(void)
 {
 	while (!serial_tstc())
 		;
@@ -107,8 +109,61 @@ int serial_getc(void)
 	return readb(&uart->rbr_thr_dllr);
 }
 
-void serial_puts(const char *s)
+static void jz_serial_puts(const char *s)
 {
 	while (*s)
 		serial_putc(*s++);
 }
+
+#ifdef CONFIG_SERIAL_MULTI
+static struct serial_device jz_serial_drv = {
+	.name	= "jz_serial",
+	.start	= jz_serial_init,
+	.stop	= NULL,
+	.setbrg	= jz_serial_setbrg,
+	.putc	= jz_serial_putc,
+	.puts	= jz_serial_puts,
+	.getc	= jz_serial_getc,
+	.tstc	= jz_serial_tstc,
+};
+
+void jz_serial_initialize(void)
+{
+	serial_register(&jz_serial_drv);
+}
+
+__weak struct serial_device *default_serial_console(void)
+{
+	return &jz_serial_drv;
+}
+#else
+int serial_init(void)
+{
+	return jz_serial_init();
+}
+
+void serial_setbrg(void)
+{
+	jz_serial_setbrg();
+}
+
+void serial_putc(const char c)
+{
+	jz_serial_putc(c);
+}
+
+void serial_puts(const char *s)
+{
+	jz_serial_puts(s);
+}
+
+int serial_getc(void)
+{
+	return jz_serial_getc();
+}
+
+int serial_tstc(void)
+{
+	return jz_serial_tstc();
+}
+#endif
diff --git a/common/serial.c b/common/serial.c
index a5996fe6c80929c2b14630a33a51c97ae001d97a..7f5d455776da4e8638b44071402515cda59435cb 100644
--- a/common/serial.c
+++ b/common/serial.c
@@ -52,6 +52,7 @@ serial_initfunc(mpc512x_serial_initialize);
 serial_initfunc(uartlite_serial_initialize);
 serial_initfunc(au1x00_serial_initialize);
 serial_initfunc(asc_serial_initialize);
+serial_initfunc(jz_serial_initialize);
 
 void serial_register(struct serial_device *dev)
 {
@@ -82,6 +83,7 @@ void serial_initialize(void)
 	zynq_serial_initalize();
 	au1x00_serial_initialize();
 	asc_serial_initialize();
+	jz_serial_initialize();
 
 	serial_assign(default_serial_console()->name);
 }