From patchwork Sat Sep 29 21:52:22 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Vasut X-Patchwork-Id: 188096 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id D599B2C00F5 for ; Sun, 30 Sep 2012 08:00:20 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 8A34C2844B; Sun, 30 Sep 2012 00:00:11 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4dh--30fyQdV; Sun, 30 Sep 2012 00:00:11 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id AB834282C5; Sat, 29 Sep 2012 23:56:39 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id CF4AF28279 for ; Sat, 29 Sep 2012 23:53:38 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id aVH13SIrEirC for ; Sat, 29 Sep 2012 23:53:38 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.10]) by theia.denx.de (Postfix) with ESMTPS id 32716281DA for ; Sat, 29 Sep 2012 23:53:20 +0200 (CEST) Received: from frontend1.mail.m-online.net (frontend1.mail.intern.m-online.net [192.168.8.180]) by mail-out.m-online.net (Postfix) with ESMTP id 3XTk5q5KCSz3hhhB; Sat, 29 Sep 2012 23:53:19 +0200 (CEST) X-Auth-Info: J9p+5ry0Mgn2zqkK+RP0NGvAiUHsVUd7Sj6ER6c9Ah0= Received: from mashiro.lan (unknown [195.140.253.167]) by smtp-auth.mnet-online.de (Postfix) with ESMTPA id 3XTk5q3nKJzbbhc; Sat, 29 Sep 2012 23:53:19 +0200 (CEST) From: Marek Vasut To: u-boot@lists.denx.de Date: Sat, 29 Sep 2012 23:52:22 +0200 Message-Id: <1348955586-7109-30-git-send-email-marex@denx.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1348955586-7109-1-git-send-email-marex@denx.de> References: <1348878687-14194-1-git-send-email-marex@denx.de> <1348955586-7109-1-git-send-email-marex@denx.de> Cc: Marek Vasut , Tom Rini , Peter Tyser Subject: [U-Boot] [PATCH 29/72] serial: sparc: Implement CONFIG_SERIAL_MULTI into leon3 serial driver X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de Implement support for CONFIG_SERIAL_MULTI into leon3 serial driver. This driver was so far only usable directly, but this patch also adds support for the multi method. This allows using more than one serial driver alongside the leon3 driver. Also, add a weak implementation of default_serial_console() returning this driver. Signed-off-by: Marek Vasut Cc: Marek Vasut Cc: Tom Rini Cc: Peter Tyser --- arch/sparc/cpu/leon3/serial.c | 83 ++++++++++++++++++++++++++++++++++------- common/serial.c | 2 + 2 files changed, 71 insertions(+), 14 deletions(-) diff --git a/arch/sparc/cpu/leon3/serial.c b/arch/sparc/cpu/leon3/serial.c index 4b2fcb8..a110244 100644 --- a/arch/sparc/cpu/leon3/serial.c +++ b/arch/sparc/cpu/leon3/serial.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include DECLARE_GLOBAL_DATA_PTR; @@ -42,7 +44,7 @@ DECLARE_GLOBAL_DATA_PTR; ambapp_dev_apbuart *leon3_apbuart = NULL; -int serial_init(void) +static int leon3_serial_init(void) { ambapp_apbdev apbdev; unsigned int tmp; @@ -72,15 +74,7 @@ int serial_init(void) return -1; /* didn't find hardware */ } -void serial_putc(const char c) -{ - if (c == '\n') - serial_putc_raw('\r'); - - serial_putc_raw(c); -} - -void serial_putc_raw(const char c) +static void leon3_serial_putc_raw(const char c) { if (!leon3_apbuart) return; @@ -97,14 +91,22 @@ void serial_putc_raw(const char c) #endif } -void serial_puts(const char *s) +static void leon3_serial_putc(const char c) +{ + if (c == '\n') + leon3_serial_putc_raw('\r'); + + leon3_serial_putc_raw(c); +} + +static void leon3_serial_puts(const char *s) { while (*s) { serial_putc(*s++); } } -int serial_getc(void) +static int leon3_serial_getc(void) { if (!leon3_apbuart) return 0; @@ -116,7 +118,7 @@ int serial_getc(void) return READ_WORD(leon3_apbuart->data); } -int serial_tstc(void) +static int leon3_serial_tstc(void) { if (leon3_apbuart) return (READ_WORD(leon3_apbuart->status) & @@ -125,7 +127,7 @@ int serial_tstc(void) } /* set baud rate for uart */ -void serial_setbrg(void) +static void leon3_serial_setbrg(void) { /* update baud rate settings, read it from gd->baudrate */ unsigned int scaler; @@ -137,3 +139,56 @@ void serial_setbrg(void) } return; } + +#ifdef CONFIG_SERIAL_MULTI +static struct serial_device leon3_serial_drv = { + .name = "leon3_serial", + .start = leon3_serial_init, + .stop = NULL, + .setbrg = leon3_serial_setbrg, + .putc = leon3_serial_putc, + .puts = leon3_serial_puts, + .getc = leon3_serial_getc, + .tstc = leon3_serial_tstc, +}; + +void leon3_serial_initialize(void) +{ + serial_register(&leon3_serial_drv); +} + +__weak struct serial_device *default_serial_console(void) +{ + return &leon3_serial_drv; +} +#else +int serial_init(void) +{ + return leon3_serial_init(); +} + +void serial_setbrg(void) +{ + leon3_serial_setbrg(); +} + +void serial_putc(const char c) +{ + leon3_serial_putc(c); +} + +void serial_puts(const char *s) +{ + leon3_serial_puts(s); +} + +int serial_getc(void) +{ + return leon3_serial_getc(); +} + +int serial_tstc(void) +{ + return leon3_serial_tstc(); +} +#endif diff --git a/common/serial.c b/common/serial.c index 8848126..4907009 100644 --- a/common/serial.c +++ b/common/serial.c @@ -59,6 +59,7 @@ serial_initfunc(mpc8260_smc_serial_initialize); serial_initfunc(mpc85xx_serial_initialize); serial_initfunc(iop480_serial_initialize); serial_initfunc(leon2_serial_initialize); +serial_initfunc(leon3_serial_initialize); void serial_register(struct serial_device *dev) { @@ -96,6 +97,7 @@ void serial_initialize(void) mpc85xx_serial_initialize(); iop480_serial_initialize(); leon2_serial_initialize(); + leon3_serial_initialize(); serial_assign(default_serial_console()->name); }