]> git.sur5r.net Git - u-boot/blob - common/serial.c
Blackfin: adi boards: enable multi serial support by default
[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 #if defined(CONFIG_SYS_BFIN_UART)
177         serial_register_bfin_uart();
178 #endif
179         serial_assign (default_serial_console ()->name);
180 }
181
182 void serial_stdio_init (void)
183 {
184         struct stdio_dev dev;
185         struct serial_device *s = serial_devices;
186
187         while (s) {
188                 memset (&dev, 0, sizeof (dev));
189
190                 strcpy (dev.name, s->name);
191                 dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT;
192
193                 dev.start = s->init;
194                 dev.stop = s->uninit;
195                 dev.putc = s->putc;
196                 dev.puts = s->puts;
197                 dev.getc = s->getc;
198                 dev.tstc = s->tstc;
199
200                 stdio_register (&dev);
201
202                 s = s->next;
203         }
204 }
205
206 int serial_assign (char *name)
207 {
208         struct serial_device *s;
209
210         for (s = serial_devices; s; s = s->next) {
211                 if (strcmp (s->name, name) == 0) {
212                         serial_current = s;
213                         return 0;
214                 }
215         }
216
217         return 1;
218 }
219
220 void serial_reinit_all (void)
221 {
222         struct serial_device *s;
223
224         for (s = serial_devices; s; s = s->next) {
225                 s->init ();
226         }
227 }
228
229 int serial_init (void)
230 {
231         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
232                 struct serial_device *dev = default_serial_console ();
233
234                 return dev->init ();
235         }
236
237         return serial_current->init ();
238 }
239
240 void serial_setbrg (void)
241 {
242         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
243                 struct serial_device *dev = default_serial_console ();
244
245                 dev->setbrg ();
246                 return;
247         }
248
249         serial_current->setbrg ();
250 }
251
252 int serial_getc (void)
253 {
254         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
255                 struct serial_device *dev = default_serial_console ();
256
257                 return dev->getc ();
258         }
259
260         return serial_current->getc ();
261 }
262
263 int serial_tstc (void)
264 {
265         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
266                 struct serial_device *dev = default_serial_console ();
267
268                 return dev->tstc ();
269         }
270
271         return serial_current->tstc ();
272 }
273
274 void serial_putc (const char c)
275 {
276         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
277                 struct serial_device *dev = default_serial_console ();
278
279                 dev->putc (c);
280                 return;
281         }
282
283         serial_current->putc (c);
284 }
285
286 void serial_puts (const char *s)
287 {
288         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
289                 struct serial_device *dev = default_serial_console ();
290
291                 dev->puts (s);
292                 return;
293         }
294
295         serial_current->puts (s);
296 }