Home | History | Annotate | Download | only in arch_msm7k
      1 /*
      2  * Copyright (c) 2008, Google Inc.
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *  * Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  *  * Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in
     12  *    the documentation and/or other materials provided with the
     13  *    distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     18  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     19  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
     22  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     25  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 
     29 #include <boot/boot.h>
     30 #include <boot/uart.h>
     31 #include <msm7k/uart.h>
     32 
     33 static unsigned uart_base = MSM_UART1_BASE;
     34 
     35 #define uwr(v,a) writel(v, uart_base + (a))
     36 #define urd(a) readl(uart_base + (a))
     37 
     38 #define UART_NEED_INIT 1
     39 
     40 void uart_init(unsigned n)
     41 {
     42 
     43     switch(n) {
     44     case 0:
     45         uart_base = MSM_UART1_BASE;
     46         break;
     47     case 1:
     48         uart_base = MSM_UART2_BASE;
     49         break;
     50     case 2:
     51         uart_base = MSM_UART3_BASE;
     52         break;
     53     }
     54 
     55 #if UART_NEED_INIT
     56     uwr(0x0A, UART_CR);  /* disable TX and RX */
     57 
     58     uwr(0x30, UART_CR);  /* reset error status */
     59     uwr(0x10, UART_CR);  /* reset receiver */
     60     uwr(0x20, UART_CR);  /* reset transmitter */
     61 
     62     mdelay(100);
     63 
     64         /* configuration for 19.2MHz TCXO */
     65     uwr(0xC0, UART_MREG);
     66     uwr(0xAF, UART_NREG);
     67     uwr(0x80, UART_DREG);
     68     uwr(0x19, UART_MNDREG);
     69 
     70     uwr(0x10, UART_CR);  /* reset RX */
     71     uwr(0x20, UART_CR);  /* reset TX */
     72     uwr(0x30, UART_CR);  /* reset error status */
     73     uwr(0x40, UART_CR);  /* reset RX break */
     74     uwr(0x70, UART_CR);  /* rest? */
     75     uwr(0xD0, UART_CR);  /* reset */
     76 
     77     uwr(0x7BF, UART_IPR); /* stale timeout = 630 * bitrate */
     78     uwr(0, UART_IMR);
     79     uwr(115, UART_RFWR); /* RX watermark = 58 * 2 - 1 */
     80     uwr(10, UART_TFWR);  /* TX watermark */
     81 
     82     uwr(0, UART_RFWR);
     83 
     84     uwr(UART_CSR_115200, UART_CSR);
     85     uwr(0, UART_IRDA);
     86     uwr(0x1E, UART_HCR);
     87 //    uwr(0x7F4, UART_MR1); /* RFS/ CTS/ 500chr RFR */
     88     uwr(16, UART_MR1);
     89     uwr(0x34, UART_MR2); /* 8N1 */
     90 
     91     mdelay(100);
     92 
     93     uwr(0x05, UART_CR); /* enable TX & RX */
     94     mdelay(100);
     95 #endif
     96 }
     97 
     98 int uart_getc(void)
     99 {
    100     if(!(urd(UART_SR) & UART_SR_RX_READY))
    101         return -1;
    102     return urd(UART_RF);
    103 }
    104 
    105 void uart_putc(unsigned c)
    106 {
    107     while(!(urd(UART_SR) & UART_SR_TX_READY)) ;
    108     uwr(c, UART_TF);
    109 }
    110 
    111 int uart_tx_ready(void)
    112 {
    113     return urd(UART_SR) & UART_SR_TX_READY;
    114 }
    115 
    116 
    117 void uart_puts(const char *s)
    118 {
    119     while(*s) {
    120         if(*s == '\n') uart_putc('\r');
    121         uart_putc(*s++);
    122     }
    123 }
    124 
    125