Merge branch 'master' of git://git.denx.de/u-boot-mpc85xx
[platform/kernel/u-boot.git] / 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_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 #if defined(CONFIG_CONS_INDEX) && defined(CONFIG_SYS_NS16550_SERIAL)
46 #if (CONFIG_CONS_INDEX==1)
47         return &eserial1_device;
48 #elif (CONFIG_CONS_INDEX==2)
49         return &eserial2_device;
50 #elif (CONFIG_CONS_INDEX==3)
51         return &eserial3_device;
52 #elif (CONFIG_CONS_INDEX==4)
53         return &eserial4_device;
54 #else
55 #error "Bad CONFIG_CONS_INDEX."
56 #endif
57 #else
58         return &serial0_device;
59 #endif
60 #elif defined(CONFIG_MPC512X)
61 #if (CONFIG_PSC_CONSOLE == 3)
62                 return &serial3_device;
63 #elif (CONFIG_PSC_CONSOLE == 6)
64                 return &serial6_device;
65 #else
66 #error "Bad CONFIG_PSC_CONSOLE."
67 #endif
68 #elif defined(CONFIG_S3C2410)
69 #if defined(CONFIG_SERIAL1)
70         return &s3c24xx_serial0_device;
71 #elif defined(CONFIG_SERIAL2)
72         return &s3c24xx_serial1_device;
73 #elif defined(CONFIG_SERIAL3)
74         return &s3c24xx_serial2_device;
75 #else
76 #error "CONFIG_SERIAL? missing."
77 #endif
78 #elif defined(CONFIG_S5P)
79 #if defined(CONFIG_SERIAL0)
80         return &s5p_serial0_device;
81 #elif defined(CONFIG_SERIAL1)
82         return &s5p_serial1_device;
83 #elif defined(CONFIG_SERIAL2)
84         return &s5p_serial2_device;
85 #elif defined(CONFIG_SERIAL3)
86         return &s5p_serial3_device;
87 #else
88 #error "CONFIG_SERIAL? missing."
89 #endif
90 #elif defined(CONFIG_OMAP3_ZOOM2)
91                 return ZOOM2_DEFAULT_SERIAL_DEVICE;
92 #else
93 #error No default console
94 #endif
95 }
96
97 struct serial_device *default_serial_console(void) __attribute__((weak, alias("__default_serial_console")));
98 #endif
99
100 int serial_register (struct serial_device *dev)
101 {
102 #ifndef CONFIG_RELOC_FIXUP_WORKS
103         dev->init += gd->reloc_off;
104         dev->setbrg += gd->reloc_off;
105         dev->getc += gd->reloc_off;
106         dev->tstc += gd->reloc_off;
107         dev->putc += gd->reloc_off;
108         dev->puts += gd->reloc_off;
109 #endif
110
111         dev->next = serial_devices;
112         serial_devices = dev;
113
114         return 0;
115 }
116
117 void serial_initialize (void)
118 {
119 #if defined(CONFIG_8xx_CONS_SMC1) || defined(CONFIG_8xx_CONS_SMC2)
120         serial_register (&serial_smc_device);
121 #endif
122 #if defined(CONFIG_8xx_CONS_SCC1) || defined(CONFIG_8xx_CONS_SCC2) \
123  || defined(CONFIG_8xx_CONS_SCC3) || defined(CONFIG_8xx_CONS_SCC4)
124         serial_register (&serial_scc_device);
125 #endif
126
127 #if defined(CONFIG_SYS_NS16550_SERIAL)
128 #if defined(CONFIG_SYS_NS16550_COM1)
129         serial_register(&eserial1_device);
130 #endif
131 #if defined(CONFIG_SYS_NS16550_COM2)
132         serial_register(&eserial2_device);
133 #endif
134 #if defined(CONFIG_SYS_NS16550_COM3)
135         serial_register(&eserial3_device);
136 #endif
137 #if defined(CONFIG_SYS_NS16550_COM4)
138         serial_register(&eserial4_device);
139 #endif
140 #endif /* CONFIG_SYS_NS16550_SERIAL */
141 #if defined (CONFIG_FFUART)
142         serial_register(&serial_ffuart_device);
143 #endif
144 #if defined (CONFIG_BTUART)
145         serial_register(&serial_btuart_device);
146 #endif
147 #if defined (CONFIG_STUART)
148         serial_register(&serial_stuart_device);
149 #endif
150 #if defined(CONFIG_S3C2410)
151         serial_register(&s3c24xx_serial0_device);
152         serial_register(&s3c24xx_serial1_device);
153         serial_register(&s3c24xx_serial2_device);
154 #endif
155 #if defined(CONFIG_S5P)
156         serial_register(&s5p_serial0_device);
157         serial_register(&s5p_serial1_device);
158         serial_register(&s5p_serial2_device);
159         serial_register(&s5p_serial3_device);
160 #endif
161 #if defined(CONFIG_MPC512X)
162 #if defined(CONFIG_SYS_PSC1)
163         serial_register(&serial1_device);
164 #endif
165 #if defined(CONFIG_SYS_PSC3)
166         serial_register(&serial3_device);
167 #endif
168 #if defined(CONFIG_SYS_PSC4)
169         serial_register(&serial4_device);
170 #endif
171 #if defined(CONFIG_SYS_PSC6)
172         serial_register(&serial6_device);
173 #endif
174 #endif
175         serial_assign (default_serial_console ()->name);
176 }
177
178 void serial_stdio_init (void)
179 {
180         struct stdio_dev dev;
181         struct serial_device *s = serial_devices;
182
183         while (s) {
184                 memset (&dev, 0, sizeof (dev));
185
186                 strcpy (dev.name, s->name);
187                 dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT;
188
189                 dev.start = s->init;
190                 dev.stop = s->uninit;
191                 dev.putc = s->putc;
192                 dev.puts = s->puts;
193                 dev.getc = s->getc;
194                 dev.tstc = s->tstc;
195
196                 stdio_register (&dev);
197
198                 s = s->next;
199         }
200 }
201
202 int serial_assign (char *name)
203 {
204         struct serial_device *s;
205
206         for (s = serial_devices; s; s = s->next) {
207                 if (strcmp (s->name, name) == 0) {
208                         serial_current = s;
209                         return 0;
210                 }
211         }
212
213         return 1;
214 }
215
216 void serial_reinit_all (void)
217 {
218         struct serial_device *s;
219
220         for (s = serial_devices; s; s = s->next) {
221                 s->init ();
222         }
223 }
224
225 int serial_init (void)
226 {
227         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
228                 struct serial_device *dev = default_serial_console ();
229
230                 return dev->init ();
231         }
232
233         return serial_current->init ();
234 }
235
236 void serial_setbrg (void)
237 {
238         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
239                 struct serial_device *dev = default_serial_console ();
240
241                 dev->setbrg ();
242                 return;
243         }
244
245         serial_current->setbrg ();
246 }
247
248 int serial_getc (void)
249 {
250         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
251                 struct serial_device *dev = default_serial_console ();
252
253                 return dev->getc ();
254         }
255
256         return serial_current->getc ();
257 }
258
259 int serial_tstc (void)
260 {
261         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
262                 struct serial_device *dev = default_serial_console ();
263
264                 return dev->tstc ();
265         }
266
267         return serial_current->tstc ();
268 }
269
270 void serial_putc (const char c)
271 {
272         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
273                 struct serial_device *dev = default_serial_console ();
274
275                 dev->putc (c);
276                 return;
277         }
278
279         serial_current->putc (c);
280 }
281
282 void serial_puts (const char *s)
283 {
284         if (!(gd->flags & GD_FLG_RELOC) || !serial_current) {
285                 struct serial_device *dev = default_serial_console ();
286
287                 dev->puts (s);
288                 return;
289         }
290
291         serial_current->puts (s);
292 }