From patchwork Mon Mar 5 14:34:05 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: mohamed.haneef@lntinfotech.com X-Patchwork-Id: 144691 X-Patchwork-Delegate: albert.aribaud@free.fr 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 9EF2BB6F9F for ; Tue, 6 Mar 2012 01:33:28 +1100 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 9D096280A6; Mon, 5 Mar 2012 15:33:18 +0100 (CET) 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 chOnnXOKjtz7; Mon, 5 Mar 2012 15:33:18 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 618A328094; Mon, 5 Mar 2012 15:33:16 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 8247C28094 for ; Mon, 5 Mar 2012 15:33:13 +0100 (CET) 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 JNYypLEEXMBv for ; Mon, 5 Mar 2012 15:33:11 +0100 (CET) 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 mail1.bemta12.messagelabs.com (mail1.bemta12.messagelabs.com [216.82.250.242]) by theia.denx.de (Postfix) with ESMTPS id 13E6128093 for ; Mon, 5 Mar 2012 15:33:09 +0100 (CET) Received: from [216.82.249.99:21036] by server-3.bemta-12.messagelabs.com id 67/48-12085-2AEC45F4; Mon, 05 Mar 2012 14:33:06 +0000 X-Env-Sender: Mohamed.Haneef@lntinfotech.com X-Msg-Ref: server-8.tower-142.messagelabs.com!1330957962!93211299!2 X-Originating-IP: [203.101.96.7] X-StarScan-Version: 6.5.5; banners=-,-,- X-VirusChecked: Checked Received: (qmail 8913 invoked from network); 5 Mar 2012 14:33:05 -0000 Received: from unknown (HELO BLRINMSHTCAS01.bglrodc.lntinfotech.com) (203.101.96.7) by server-8.tower-142.messagelabs.com with AES128-SHA encrypted SMTP; 5 Mar 2012 14:33:05 -0000 Received: from INFBA02474.BGLRODC.lntinfotech.com (172.28.9.86) by BLRINMSHTCAS01.bglrodc.lntinfotech.com (172.28.0.81) with Microsoft SMTP Server id 8.2.176.0; Mon, 5 Mar 2012 20:02:52 +0530 From: Mohamed Haneef To: u-boot@lists.denx.de, albert.u.boot@aribaud.net Date: Mon, 5 Mar 2012 20:04:05 +0530 Message-ID: <1330958045-24619-1-git-send-email-mohamed.haneef@lntinfotech.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1329361163-11228-2-git-send-email-mohamed.haneef@lntinfotech.com> References: <1329361163-11228-2-git-send-email-mohamed.haneef@lntinfotech.com> MIME-Version: 1.0 Cc: Mohamed Haneef , srikanth.reddy@lntinfotech.com Subject: [U-Boot] [PATCH v2 1/5] msm7x30: Add Support for low speed uart on msm7x30 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: , Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de * Support for low speed uart Signed-off-by: Mohamed Haneef --- Changes for v2: - Removed unused macros drivers/serial/Makefile | 1 + drivers/serial/serial_msm_uart.c | 156 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 0 deletions(-) create mode 100644 drivers/serial/serial_msm_uart.c -- 1.7.1 The contents of this e-mail and any attachment(s) may contain confidential or privileged information for the intended recipient(s). Unintended recipients are prohibited from taking action on the basis of information in this e-mail and using or disseminating the information, and must notify the sender and delete it from their system. L&T Infotech will not accept responsibility or liability for the accuracy or completeness of, or the presence of any virus or disabling code in this e-mail" diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile index 616b857..2801edc 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile @@ -55,6 +55,7 @@ COBJS-$(CONFIG_S3C44B0_SERIAL) += serial_s3c44b0.o COBJS-$(CONFIG_XILINX_UARTLITE) += serial_xuartlite.o COBJS-$(CONFIG_SANDBOX_SERIAL) += sandbox.o COBJS-$(CONFIG_SCIF_CONSOLE) += serial_sh.o +COBJS-$(CONFIG_MSM_UART) += serial_msm_uart.o ifndef CONFIG_SPL_BUILD COBJS-$(CONFIG_USB_TTY) += usbtty.o diff --git a/drivers/serial/serial_msm_uart.c b/drivers/serial/serial_msm_uart.c new file mode 100644 index 0000000..8f80561 --- /dev/null +++ b/drivers/serial/serial_msm_uart.c @@ -0,0 +1,156 @@ +/* + * (C) Copyright 2012 + * LARSEN & TOUBRO INFOTECH LTD + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include + +#define UART_MR1 0x0000 + + +#define UART_MR2 0x0004 + +#define UART_CSR 0x0008 +#define UART_CSR_115200 0xFF + +#define UART_TF 0x000C + +#define UART_CR 0x0010 +#define UART_CR_CMD_MODE_RESET (12 << 4) + +#define UART_IMR 0x0014 + +#define UART_IPR 0x0018 +#define UART_TFWR 0x001C +#define UART_RFWR 0x0020 +#define UART_HCR 0x0024 + +#define UART_MREG 0x0028 +#define UART_NREG 0x002C +#define UART_DREG 0x0030 +#define UART_MNDREG 0x0034 +#define UART_IRDA 0x0038 + +#define UART_SR 0x0008 +#define UART_SR_TX_READY (1 << 2) +#define UART_SR_RX_READY (1 << 0) + +#define UART_RF 0x000C + + +#if PLATFORM_MSM7X30 +static unsigned uart_base = MSM_UART2_BASE; +#elif PLATFORM_MSM7X27A +static unsigned uart_base = MSM_UART1_BASE; +#else +static unsigned uart_base = MSM_UART3_BASE; +#endif + +#define uwr(v, a) writel(v, uart_base + (a)) +#define urd(a) readl(uart_base + (a)) + +void uart_init(void) +{ + uwr(0x0A, UART_CR); /* disable TX and RX */ + uwr(0x30, UART_CR); /* reset error status */ + uwr(0x10, UART_CR); /* reset receiver */ + uwr(0x20, UART_CR); /* reset transmitter */ +#if PLATFORM_QSD8K || PLATFORM_MSM7X30 || PLATFORM_MSM7X27A + /* TCXO */ + uwr(0x06, UART_MREG); + uwr(0xF1, UART_NREG); + uwr(0x0F, UART_DREG); + uwr(0x1A, UART_MNDREG); +#else + /* TCXO/4 */ + uwr(0xC0, UART_MREG); + uwr(0xAF, UART_NREG); + uwr(0x80, UART_DREG); + uwr(0x19, UART_MNDREG); +#endif + uwr(0x10, UART_CR); /* reset RX */ + uwr(0x20, UART_CR); /* reset TX */ + uwr(0x30, UART_CR); /* reset error status */ + uwr(0x40, UART_CR); /* reset RX break */ + uwr(0x70, UART_CR); /* rest? */ + uwr(0xD0, UART_CR); /* reset */ + uwr(0x7BF, UART_IPR); /* stale timeout = 630 * bitrate */ + uwr(0, UART_IMR); + uwr(115, UART_RFWR); /* RX watermark = 58 * 2 - 1 */ + uwr(10, UART_TFWR); /* TX watermark */ + uwr(0, UART_RFWR); + uwr(UART_CSR_115200, UART_CSR); + uwr(0, UART_IRDA); + uwr(0x1E, UART_HCR); + uwr(16, UART_MR1); + uwr(0x34, UART_MR2); /* 8N1 */ + uwr(0x05, UART_CR); /* enable TX & RX */ + +} + +static int _uart_putc(int port, char c) +{ + while (!(urd(UART_SR) & UART_SR_TX_READY)) + ; + uwr(c, UART_TF); + return 0; +} + +int serial_init(void) +{ + uart_init(); + return 0; +} + +void serial_putc(char c) +{ + if (c == '\n') + _uart_putc(0, '\r'); + _uart_putc(0, c); +} + +void serial_putc_raw(const char c) +{ + _uart_putc(0, c); +} + +void serial_puts(const char *s) +{ + while (*s) + serial_putc(*s++); +} + +int serial_getc() +{ + while (!(urd(UART_SR) & UART_SR_RX_READY)) + ; + return urd(UART_RF); +} + +int serial_tstc() +{ + return urd(UART_SR) & UART_SR_RX_READY; +} + +void serial_setbrg() +{ +} +