]> git.sur5r.net Git - u-boot/blob - common/serial.c
Blackfin: replace "bfin_reset_or_hang()" with "panic()"
[u-boot] / common / serial.c
1 /*
2  * (C) Copyright 2004
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  */
23
24 #include <common.h>
25 #include <serial.h>
26 #include <stdio_dev.h>
27
28 DECLARE_GLOBAL_DATA_PTR;
29
30 static struct serial_device *serial_devices = NULL;
31 static struct serial_device *serial_current = NULL;
32
33 #if !defined(CONFIG_LWMON) && !defined(CONFIG_PXA250) && !defined(CONFIG_PXA27X)
34 struct serial_device *__default_serial_console (void)
35 {
36 #if defined(CONFIG_8xx_CONS_SMC1) || defined(CONFIG_8xx_CONS_SMC2)
37         return &serial_smc_device;
38 #elif defined(CONFIG_8xx_CONS_SCC1) || defined(CONFIG_8xx_CONS_SCC2) \
39    || defined(CONFIG_8xx_CONS_SCC3) || defined(CONFIG_8xx_CONS_SCC4)
40         return &serial_scc_device;
41 #elif defined(CONFIG_4xx) \
42    || defined(CONFIG_MB86R0x) || defined(CONFIG_MPC5xxx) \
43    || defined(CONFIG_MPC83xx) || defined(CONFIG_MPC85xx) \
44    || defined(CONFIG_MPC86xx) || defined(CONFIG_SYS_SC520) \
45    || defined(CONFIG_TEGRA2)
46 #if defined(CONFIG_CONS_INDEX) && defined(CONFIG_SYS_NS16550_SERIAL)
47 #if (CONFIG_CONS_INDEX==1)
48         return &eserial1_device;
49 #elif (CONFIG_CONS_INDEX==2)
50         return &eserial2_device;
51 #elif (CONFIG_CONS_INDEX==3)
52         return &eserial3_device;
53 #elif (CONFIG_CONS_INDEX==4)
54         return &eserial4_device;
55 #else
56 #error "Bad CONFIG_CONS_INDEX."
57 #endif
58 #else
59         return &serial0_device;
60 #endif
61 #elif defined(CONFIG_MPC512X)
62 #if (CONFIG_PSC_CONSOLE == 3)
63                 return &serial3_device;
64 #elif (CONFIG_PSC_CONSOLE == 6)
65                 return &serial6_device;
66 #else
67 #error "Bad CONFIG_PSC_CONSOLE."
68 #endif
69 #elif defined(CONFIG_S3C2410)
70 #if defined(CONFIG_SERIAL1)
71         return &s3c24xx_serial0_device;
72 #elif defined(CONFIG_SERIAL2)
73         return &s3c24xx_serial1_device;
74 #elif defined(CONFIG_SERIAL3)
75         return &s3c24xx_serial2_device;
76 #else
77 #error "CONFIG_SERIAL? missing."
78 #endif
79 #elif defined(CONFIG_S5P)
80 #if defined(CONFIG_SERIAL0)
81         return &s5p_serial0_device;
82 #elif defined(CONFIG_SERIAL1)
83         return &s5p_serial1_device;
84 #elif defined(CONFIG_SERIAL2)
85         return &s5p_serial2_device;
86 #elif defined(CONFIG_SERIAL3)
87         return &s5p_serial3_device;
88 #else
89 #error "CONFIG_SERIAL? missing."
90 #endif
91 #elif defined(CONFIG_OMAP3_ZOOM2)
92                 return ZOOM2_DEFAULT_SERIAL_DEVICE;
93 #else
94 #error No default console
95 #endif
96 }
97
98 struct serial_device *default_serial_console(void) __attribute__((weak, alias("__default_serial_console")));
99 #endif
100
101 int serial_register (struct serial_device *dev)
102 {
103 #ifdef CONFIG_NEEDS_MANUAL_RELOC
104         dev->init += gd->reloc_off;
105         dev->setbrg += gd->reloc_off;
106         dev->getc += gd->reloc_off;
107         dev->tstc += gd->reloc_off;
108         dev->putc += gd->reloc_off;
109         dev->puts += gd->reloc_off;
110 #endif
111
112         dev->next = serial_devices;
113         serial_devices = dev;
114
115         return 0;
116 }
117
118 void serial_initialize (void)
119 {
120 #if defined(CONFIG_8xx_CONS_SMC1) || defined(CONFIG_8xx_CONS_SMC2)
121         serial_register (&serial_smc_device);
122 #endif
123 #if defined(CONFIG_8xx_CONS_SCC1) || defined(CONFIG_8xx_CONS_SCC2) \
124  || defined(CONFIG_8xx_CONS_SCC3) || defined(CONFIG_8xx_CONS_SCC4)
125         serial_register (&serial_scc_device);
126 #endif
127
128 #if defined(CONFIG_SYS_NS16550_SERIAL)
129 #if defined(CONFIG_SYS_NS16550_COM1)
130         serial_register(&eserial1_device);
131 #endif
132 #if defined(CONFIG_SYS_NS16550_COM2)
133         serial_register(&eserial2_device);
134 #endif
135 #if defined(CONFIG_SYS_NS16550_COM3)
136         serial_register(&eserial3_device);
137 #endif
138 #if defined(CONFIG_SYS_NS16550_COM4)
139         serial_register(&eserial4_device);
140 #endif
141 #endif /* CONFIG_SYS_NS16550_SERIAL */
142 #if defined (CONFIG_FFUART)
143         serial_register(&serial_ffuart_device);
144 #endif
145 #if defined (CONFIG_BTUART)
146         serial_register(&serial_btuart_device);
147 #endif
148 #if defined (CONFIG_STUART)
149         serial_register(&serial_stuart_device);
150 #endif
151 #if defined(CONFIG_S3C2410)
152         serial_register(&s3c24xx_serial0_device);
153         serial_register(&s3c24xx_serial1_device);
154         serial_register(&s3c24xx_serial2_device);
155 #endif
156 #if defined(CONFIG_S5P)
157         serial_register(&s5p_serial0_device);
158         serial_register(&s5p_serial1_device);
159         serial_register(&s5p_serial2_device);
160         serial_register(&s5p_serial3_device);
161 #endif
162 #if defined(CONFIG_MPC512X)
163 #if defined(CONFIG_SYS_PSC1)
164         serial_register(&serial1_device);
165 #endif
166 #if defined(CONFIG_SYS_PSC3)
167         serial_register(&serial3_device);
168 #endif
169 #if defined(CONFIG_SYS_PSC4)
170         serial_register(&serial4_device);
171 #endif
172 #if defined(CONFIG_SYS_PSC6)
173         serial_register(&serial6_device);
174 #endif
175 #endif
176         serial_assign (default_serial_console ()->name);
177 }
178
179 void serial_stdio_init (void)
180 {
181         struct stdio_dev dev;
182         struct serial_device *s = serial_devices;
183
184         while (s) {
185                 memset (&dev, 0, sizeof (dev));
186
187                 strcpy (dev.name, s->name);
188                 dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT;
189
190                 dev.start = s->init;
191                 dev.stop = s->uninit;
192                 dev.putc = s->putc;
193                 dev.puts = s->puts;
194                 dev.getc = s->getc;
195                 dev.tstc = s->tstc;
196
197                 stdio_register (&dev);
198
199                 s = s->next;
200         }
201 }
202
203 int serial_assign (char *name)
204 {
205         struct serial_device *s;
206
207         for (s = serial_devices; s; s = s->next) {
208                 if (strcmp (s->name, name) == 0) {
209                         serial_current = s;
210                         return 0;
211                 }
212         }
213
214         return 1;
215 }
216
217 void serial_reinit_all (void)
218 {
219         struct serial_device *s;
220
221         for (s = serial_devices; s; s = s->next) {
222                 s->init ();
223         }
224 }
225
226 int serial_init (void)
227 {
228         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
229                 struct serial_device *dev = default_serial_console ();
230
231                 return dev->init ();
232         }
233
234         return serial_current->init ();
235 }
236
237 void serial_setbrg (void)
238 {
239         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
240                 struct serial_device *dev = default_serial_console ();
241
242                 dev->setbrg ();
243                 return;
244         }
245
246         serial_current->setbrg ();
247 }
248
249 int serial_getc (void)
250 {
251         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
252                 struct serial_device *dev = default_serial_console ();
253
254                 return dev->getc ();
255         }
256
257         return serial_current->getc ();
258 }
259
260 int serial_tstc (void)
261 {
262         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
263                 struct serial_device *dev = default_serial_console ();
264
265                 return dev->tstc ();
266         }
267
268         return serial_current->tstc ();
269 }
270
271 void serial_putc (const char c)
272 {
273         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
274                 struct serial_device *dev = default_serial_console ();
275
276                 dev->putc (c);
277                 return;
278         }
279
280         serial_current->putc (c);
281 }
282
283 void serial_puts (const char *s)
284 {
285         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
286                 struct serial_device *dev = default_serial_console ();
287
288                 dev->puts (s);
289                 return;
290         }
291
292         serial_current->puts (s);
293 }