common: Drop linux/delay.h from common header
[oweals/u-boot.git] / drivers / serial / serial.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2004
4  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5  */
6
7 #include <common.h>
8 #include <env_internal.h>
9 #include <hang.h>
10 #include <serial.h>
11 #include <stdio_dev.h>
12 #include <post.h>
13 #include <linux/compiler.h>
14 #include <errno.h>
15 #include <linux/delay.h>
16
17 DECLARE_GLOBAL_DATA_PTR;
18
19 static struct serial_device *serial_devices;
20 static struct serial_device *serial_current;
21 /*
22  * Table with supported baudrates (defined in config_xyz.h)
23  */
24 static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
25
26 /**
27  * serial_null() - Void registration routine of a serial driver
28  *
29  * This routine implements a void registration routine of a serial
30  * driver. The registration routine of a particular driver is aliased
31  * to this empty function in case the driver is not compiled into
32  * U-Boot.
33  */
34 static void serial_null(void)
35 {
36 }
37
38 /**
39  * on_baudrate() - Update the actual baudrate when the env var changes
40  *
41  * @name:       changed environment variable
42  * @value:      new value of the environment variable
43  * @op:         operation (create, overwrite, or delete)
44  * @flags:      attributes of environment variable change,
45  *              see flags H_* in include/search.h
46  *
47  * This will check for a valid baudrate and only apply it if valid.
48  *
49  * Return:      0 on success, 1 on error
50  */
51 static int on_baudrate(const char *name, const char *value, enum env_op op,
52         int flags)
53 {
54         int i;
55         int baudrate;
56
57         switch (op) {
58         case env_op_create:
59         case env_op_overwrite:
60                 /*
61                  * Switch to new baudrate if new baudrate is supported
62                  */
63                 baudrate = simple_strtoul(value, NULL, 10);
64
65                 /* Not actually changing */
66                 if (gd->baudrate == baudrate)
67                         return 0;
68
69                 for (i = 0; i < ARRAY_SIZE(baudrate_table); ++i) {
70                         if (baudrate == baudrate_table[i])
71                                 break;
72                 }
73                 if (i == ARRAY_SIZE(baudrate_table)) {
74                         if ((flags & H_FORCE) == 0)
75                                 printf("## Baudrate %d bps not supported\n",
76                                         baudrate);
77                         return 1;
78                 }
79                 if ((flags & H_INTERACTIVE) != 0) {
80                         printf("## Switch baudrate to %d"
81                                 " bps and press ENTER ...\n", baudrate);
82                         udelay(50000);
83                 }
84
85                 gd->baudrate = baudrate;
86
87                 serial_setbrg();
88
89                 udelay(50000);
90
91                 if ((flags & H_INTERACTIVE) != 0)
92                         while (1) {
93                                 if (getc() == '\r')
94                                         break;
95                         }
96
97                 return 0;
98         case env_op_delete:
99                 printf("## Baudrate may not be deleted\n");
100                 return 1;
101         default:
102                 return 0;
103         }
104 }
105 U_BOOT_ENV_CALLBACK(baudrate, on_baudrate);
106
107 /**
108  * serial_initfunc() - Forward declare of driver registration routine
109  * @name:       Name of the real driver registration routine.
110  *
111  * This macro expands onto forward declaration of a driver registration
112  * routine, which is then used below in serial_initialize() function.
113  * The declaration is made weak and aliases to serial_null() so in case
114  * the driver is not compiled in, the function is still declared and can
115  * be used, but aliases to serial_null() and thus is optimized away.
116  */
117 #define serial_initfunc(name)                                   \
118         void name(void)                                         \
119                 __attribute__((weak, alias("serial_null")));
120
121 serial_initfunc(atmel_serial_initialize);
122 serial_initfunc(mcf_serial_initialize);
123 serial_initfunc(mpc85xx_serial_initialize);
124 serial_initfunc(mxc_serial_initialize);
125 serial_initfunc(ns16550_serial_initialize);
126 serial_initfunc(pl01x_serial_initialize);
127 serial_initfunc(pxa_serial_initialize);
128 serial_initfunc(sh_serial_initialize);
129 serial_initfunc(mtk_serial_initialize);
130
131 /**
132  * serial_register() - Register serial driver with serial driver core
133  * @dev:        Pointer to the serial driver structure
134  *
135  * This function registers the serial driver supplied via @dev with
136  * serial driver core, thus making U-Boot aware of it and making it
137  * available for U-Boot to use. On platforms that still require manual
138  * relocation of constant variables, relocation of the supplied structure
139  * is performed.
140  */
141 void serial_register(struct serial_device *dev)
142 {
143 #ifdef CONFIG_NEEDS_MANUAL_RELOC
144         if (dev->start)
145                 dev->start += gd->reloc_off;
146         if (dev->stop)
147                 dev->stop += gd->reloc_off;
148         if (dev->setbrg)
149                 dev->setbrg += gd->reloc_off;
150         if (dev->getc)
151                 dev->getc += gd->reloc_off;
152         if (dev->tstc)
153                 dev->tstc += gd->reloc_off;
154         if (dev->putc)
155                 dev->putc += gd->reloc_off;
156         if (dev->puts)
157                 dev->puts += gd->reloc_off;
158 #endif
159
160         dev->next = serial_devices;
161         serial_devices = dev;
162 }
163
164 /**
165  * serial_initialize() - Register all compiled-in serial port drivers
166  *
167  * This function registers all serial port drivers that are compiled
168  * into the U-Boot binary with the serial core, thus making them
169  * available to U-Boot to use. Lastly, this function assigns a default
170  * serial port to the serial core. That serial port is then used as a
171  * default output.
172  */
173 void serial_initialize(void)
174 {
175         atmel_serial_initialize();
176         mcf_serial_initialize();
177         mpc85xx_serial_initialize();
178         mxc_serial_initialize();
179         ns16550_serial_initialize();
180         pl01x_serial_initialize();
181         pxa_serial_initialize();
182         sh_serial_initialize();
183         mtk_serial_initialize();
184
185         serial_assign(default_serial_console()->name);
186 }
187
188 static int serial_stub_start(struct stdio_dev *sdev)
189 {
190         struct serial_device *dev = sdev->priv;
191
192         return dev->start();
193 }
194
195 static int serial_stub_stop(struct stdio_dev *sdev)
196 {
197         struct serial_device *dev = sdev->priv;
198
199         return dev->stop();
200 }
201
202 static void serial_stub_putc(struct stdio_dev *sdev, const char ch)
203 {
204         struct serial_device *dev = sdev->priv;
205
206         dev->putc(ch);
207 }
208
209 static void serial_stub_puts(struct stdio_dev *sdev, const char *str)
210 {
211         struct serial_device *dev = sdev->priv;
212
213         dev->puts(str);
214 }
215
216 static int serial_stub_getc(struct stdio_dev *sdev)
217 {
218         struct serial_device *dev = sdev->priv;
219
220         return dev->getc();
221 }
222
223 static int serial_stub_tstc(struct stdio_dev *sdev)
224 {
225         struct serial_device *dev = sdev->priv;
226
227         return dev->tstc();
228 }
229
230 /**
231  * serial_stdio_init() - Register serial ports with STDIO core
232  *
233  * This function generates a proxy driver for each serial port driver.
234  * These proxy drivers then register with the STDIO core, making the
235  * serial drivers available as STDIO devices.
236  */
237 void serial_stdio_init(void)
238 {
239         struct stdio_dev dev;
240         struct serial_device *s = serial_devices;
241
242         while (s) {
243                 memset(&dev, 0, sizeof(dev));
244
245                 strcpy(dev.name, s->name);
246                 dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT;
247
248                 dev.start = serial_stub_start;
249                 dev.stop = serial_stub_stop;
250                 dev.putc = serial_stub_putc;
251                 dev.puts = serial_stub_puts;
252                 dev.getc = serial_stub_getc;
253                 dev.tstc = serial_stub_tstc;
254                 dev.priv = s;
255
256                 stdio_register(&dev);
257
258                 s = s->next;
259         }
260 }
261
262 /**
263  * serial_assign() - Select the serial output device by name
264  * @name:       Name of the serial driver to be used as default output
265  *
266  * This function configures the serial output multiplexing by
267  * selecting which serial device will be used as default. In case
268  * the STDIO "serial" device is selected as stdin/stdout/stderr,
269  * the serial device previously configured by this function will be
270  * used for the particular operation.
271  *
272  * Returns 0 on success, negative on error.
273  */
274 int serial_assign(const char *name)
275 {
276         struct serial_device *s;
277
278         for (s = serial_devices; s; s = s->next) {
279                 if (strcmp(s->name, name))
280                         continue;
281                 serial_current = s;
282                 return 0;
283         }
284
285         return -EINVAL;
286 }
287
288 /**
289  * serial_reinit_all() - Reinitialize all compiled-in serial ports
290  *
291  * This function reinitializes all serial ports that are compiled
292  * into U-Boot by calling their serial_start() functions.
293  */
294 void serial_reinit_all(void)
295 {
296         struct serial_device *s;
297
298         for (s = serial_devices; s; s = s->next)
299                 s->start();
300 }
301
302 /**
303  * get_current() - Return pointer to currently selected serial port
304  *
305  * This function returns a pointer to currently selected serial port.
306  * The currently selected serial port is altered by serial_assign()
307  * function.
308  *
309  * In case this function is called before relocation or before any serial
310  * port is configured, this function calls default_serial_console() to
311  * determine the serial port. Otherwise, the configured serial port is
312  * returned.
313  *
314  * Returns pointer to the currently selected serial port on success,
315  * NULL on error.
316  */
317 static struct serial_device *get_current(void)
318 {
319         struct serial_device *dev;
320
321         if (!(gd->flags & GD_FLG_RELOC))
322                 dev = default_serial_console();
323         else if (!serial_current)
324                 dev = default_serial_console();
325         else
326                 dev = serial_current;
327
328         /* We must have a console device */
329         if (!dev) {
330 #ifdef CONFIG_SPL_BUILD
331                 puts("Cannot find console\n");
332                 hang();
333 #else
334                 panic("Cannot find console\n");
335 #endif
336         }
337
338         return dev;
339 }
340
341 /**
342  * serial_init() - Initialize currently selected serial port
343  *
344  * This function initializes the currently selected serial port. This
345  * usually involves setting up the registers of that particular port,
346  * enabling clock and such. This function uses the get_current() call
347  * to determine which port is selected.
348  *
349  * Returns 0 on success, negative on error.
350  */
351 int serial_init(void)
352 {
353         gd->flags |= GD_FLG_SERIAL_READY;
354         return get_current()->start();
355 }
356
357 /**
358  * serial_setbrg() - Configure baud-rate of currently selected serial port
359  *
360  * This function configures the baud-rate of the currently selected
361  * serial port. The baud-rate is retrieved from global data within
362  * the serial port driver. This function uses the get_current() call
363  * to determine which port is selected.
364  *
365  * Returns 0 on success, negative on error.
366  */
367 void serial_setbrg(void)
368 {
369         get_current()->setbrg();
370 }
371
372 /**
373  * serial_getc() - Read character from currently selected serial port
374  *
375  * This function retrieves a character from currently selected serial
376  * port. In case there is no character waiting on the serial port,
377  * this function will block and wait for the character to appear. This
378  * function uses the get_current() call to determine which port is
379  * selected.
380  *
381  * Returns the character on success, negative on error.
382  */
383 int serial_getc(void)
384 {
385         return get_current()->getc();
386 }
387
388 /**
389  * serial_tstc() - Test if data is available on currently selected serial port
390  *
391  * This function tests if one or more characters are available on
392  * currently selected serial port. This function never blocks. This
393  * function uses the get_current() call to determine which port is
394  * selected.
395  *
396  * Returns positive if character is available, zero otherwise.
397  */
398 int serial_tstc(void)
399 {
400         return get_current()->tstc();
401 }
402
403 /**
404  * serial_putc() - Output character via currently selected serial port
405  * @c:  Single character to be output from the serial port.
406  *
407  * This function outputs a character via currently selected serial
408  * port. This character is passed to the serial port driver responsible
409  * for controlling the hardware. The hardware may still be in process
410  * of transmitting another character, therefore this function may block
411  * for a short amount of time. This function uses the get_current()
412  * call to determine which port is selected.
413  */
414 void serial_putc(const char c)
415 {
416         get_current()->putc(c);
417 }
418
419 /**
420  * serial_puts() - Output string via currently selected serial port
421  * @s:  Zero-terminated string to be output from the serial port.
422  *
423  * This function outputs a zero-terminated string via currently
424  * selected serial port. This function behaves as an accelerator
425  * in case the hardware can queue multiple characters for transfer.
426  * The whole string that is to be output is available to the function
427  * implementing the hardware manipulation. Transmitting the whole
428  * string may take some time, thus this function may block for some
429  * amount of time. This function uses the get_current() call to
430  * determine which port is selected.
431  */
432 void serial_puts(const char *s)
433 {
434         get_current()->puts(s);
435 }
436
437 /**
438  * default_serial_puts() - Output string by calling serial_putc() in loop
439  * @s:  Zero-terminated string to be output from the serial port.
440  *
441  * This function outputs a zero-terminated string by calling serial_putc()
442  * in a loop. Most drivers do not support queueing more than one byte for
443  * transfer, thus this function precisely implements their serial_puts().
444  *
445  * To optimize the number of get_current() calls, this function only
446  * calls get_current() once and then directly accesses the putc() call
447  * of the &struct serial_device .
448  */
449 void default_serial_puts(const char *s)
450 {
451         struct serial_device *dev = get_current();
452         while (*s)
453                 dev->putc(*s++);
454 }
455
456 #if CONFIG_POST & CONFIG_SYS_POST_UART
457 static const int bauds[] = CONFIG_SYS_BAUDRATE_TABLE;
458
459 /**
460  * uart_post_test() - Test the currently selected serial port using POST
461  * @flags:      POST framework flags
462  *
463  * Do a loopback test of the currently selected serial port. This
464  * function is only useful in the context of the POST testing framwork.
465  * The serial port is first configured into loopback mode and then
466  * characters are sent through it.
467  *
468  * Returns 0 on success, value otherwise.
469  */
470 /* Mark weak until post/cpu/.../uart.c migrate over */
471 __weak
472 int uart_post_test(int flags)
473 {
474         unsigned char c;
475         int ret, saved_baud, b;
476         struct serial_device *saved_dev, *s;
477
478         /* Save current serial state */
479         ret = 0;
480         saved_dev = serial_current;
481         saved_baud = gd->baudrate;
482
483         for (s = serial_devices; s; s = s->next) {
484                 /* If this driver doesn't support loop back, skip it */
485                 if (!s->loop)
486                         continue;
487
488                 /* Test the next device */
489                 serial_current = s;
490
491                 ret = serial_init();
492                 if (ret)
493                         goto done;
494
495                 /* Consume anything that happens to be queued */
496                 while (serial_tstc())
497                         serial_getc();
498
499                 /* Enable loop back */
500                 s->loop(1);
501
502                 /* Test every available baud rate */
503                 for (b = 0; b < ARRAY_SIZE(bauds); ++b) {
504                         gd->baudrate = bauds[b];
505                         serial_setbrg();
506
507                         /*
508                          * Stick to printable chars to avoid issues:
509                          *  - terminal corruption
510                          *  - serial program reacting to sequences and sending
511                          *    back random extra data
512                          *  - most serial drivers add in extra chars (like \r\n)
513                          */
514                         for (c = 0x20; c < 0x7f; ++c) {
515                                 /* Send it out */
516                                 serial_putc(c);
517
518                                 /* Make sure it's the same one */
519                                 ret = (c != serial_getc());
520                                 if (ret) {
521                                         s->loop(0);
522                                         goto done;
523                                 }
524
525                                 /* Clean up the output in case it was sent */
526                                 serial_putc('\b');
527                                 ret = ('\b' != serial_getc());
528                                 if (ret) {
529                                         s->loop(0);
530                                         goto done;
531                                 }
532                         }
533                 }
534
535                 /* Disable loop back */
536                 s->loop(0);
537
538                 /* XXX: There is no serial_stop() !? */
539                 if (s->stop)
540                         s->stop();
541         }
542
543  done:
544         /* Restore previous serial state */
545         serial_current = saved_dev;
546         gd->baudrate = saved_baud;
547         serial_reinit_all();
548         serial_setbrg();
549
550         return ret;
551 }
552 #endif