Add support for Freescale M5271: Merge with /work/u-boot.mcf5271
[platform/kernel/u-boot.git] / cpu / arm720t / serial.c
1 /*
2  * (C) Copyright 2002-2004
3  * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
4  *
5  * (C) Copyright 2002
6  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
7  * Marius Groeger <mgroeger@sysgo.de>
8  *
9  * (C) Copyright 2002
10  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
11  * Alex Zuepke <azu@sysgo.de>
12  *
13  * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl)
14  *
15  * This program is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 2 of the License, or
18  * (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  *
29  */
30
31 #include <common.h>
32
33 #if defined(CONFIG_IMPA7) || defined(CONFIG_EP7312) || defined(CONFIG_ARMADILLO)
34
35 #include <clps7111.h>
36
37 DECLARE_GLOBAL_DATA_PTR;
38
39 void serial_setbrg (void)
40 {
41         unsigned int reg = 0;
42
43         switch (gd->baudrate) {
44         case   1200:    reg = 191;      break;
45         case   9600:    reg =  23;      break;
46         case  19200:    reg =  11;      break;
47         case  38400:    reg =   5;      break;
48         case  57600:    reg =   3;      break;
49         case 115200:    reg =   1;      break;
50         default:        hang ();        break;
51         }
52
53         /* init serial serial 1,2 */
54         IO_SYSCON1 = SYSCON1_UART1EN;
55         IO_SYSCON2 = SYSCON2_UART2EN;
56
57         reg |= UBRLCR_WRDLEN8;
58
59         IO_UBRLCR1 = reg;
60         IO_UBRLCR2 = reg;
61 }
62
63
64 /*
65  * Initialise the serial port with the given baudrate. The settings
66  * are always 8 data bits, no parity, 1 stop bit, no start bits.
67  *
68  */
69 int serial_init (void)
70 {
71         serial_setbrg ();
72
73         return (0);
74 }
75
76
77 /*
78  * Output a single byte to the serial port.
79  */
80 void serial_putc (const char c)
81 {
82         int tmo;
83
84         /* If \n, also do \r */
85         if (c == '\n')
86                 serial_putc ('\r');
87
88         tmo = get_timer (0) + 1 * CFG_HZ;
89         while (IO_SYSFLG1 & SYSFLG1_UTXFF)
90                 if (get_timer (0) > tmo)
91                         break;
92
93         IO_UARTDR1 = c;
94 }
95
96 /*
97  * Read a single byte from the serial port. Returns 1 on success, 0
98  * otherwise. When the function is succesfull, the character read is
99  * written into its argument c.
100  */
101 int serial_tstc (void)
102 {
103         return !(IO_SYSFLG1 & SYSFLG1_URXFE);
104 }
105
106 /*
107  * Read a single byte from the serial port. Returns 1 on success, 0
108  * otherwise. When the function is succesfull, the character read is
109  * written into its argument c.
110  */
111 int serial_getc (void)
112 {
113         while (IO_SYSFLG1 & SYSFLG1_URXFE);
114
115         return IO_UARTDR1 & 0xff;
116 }
117
118 void
119 serial_puts (const char *s)
120 {
121         while (*s) {
122                 serial_putc (*s++);
123         }
124 }
125
126 #endif /* defined(CONFIG_IMPA7) || defined(CONFIG_EP7312) */