da3e1eb3ab1fa9bf621cda37edbc517ac3917b13
[platform/kernel/u-boot.git] / drivers / serial / serial-uclass.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2014 The Chromium OS Authors.
4  */
5
6 #define LOG_CATEGORY UCLASS_SERIAL
7
8 #include <common.h>
9 #include <dm.h>
10 #include <env_internal.h>
11 #include <errno.h>
12 #include <malloc.h>
13 #include <os.h>
14 #include <serial.h>
15 #include <stdio_dev.h>
16 #include <watchdog.h>
17 #include <asm/global_data.h>
18 #include <dm/lists.h>
19 #include <dm/device-internal.h>
20 #include <dm/of_access.h>
21 #include <linux/delay.h>
22
23 DECLARE_GLOBAL_DATA_PTR;
24
25 /*
26  * Table with supported baudrates (defined in config_xyz.h)
27  */
28 static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
29
30 #if CONFIG_IS_ENABLED(SERIAL_PRESENT)
31 static int serial_check_stdout(const void *blob, struct udevice **devp)
32 {
33         int node = -1;
34         const char *str, *p, *name;
35         int namelen;
36
37         /* Check for a chosen console */
38         str = fdtdec_get_chosen_prop(blob, "stdout-path");
39         if (str) {
40                 p = strchr(str, ':');
41                 namelen = p ? p - str : strlen(str);
42                 node = fdt_path_offset_namelen(blob, str, namelen);
43
44                 if (node < 0) {
45                         /*
46                          * Deal with things like
47                          *      stdout-path = "serial0:115200n8";
48                          *
49                          * We need to look up the alias and then follow it to
50                          * the correct node.
51                          */
52                         name = fdt_get_alias_namelen(blob, str, namelen);
53                         if (name)
54                                 node = fdt_path_offset(blob, name);
55                 }
56         }
57
58         if (node < 0)
59                 node = fdt_path_offset(blob, "console");
60         if (!uclass_get_device_by_of_offset(UCLASS_SERIAL, node, devp))
61                 return 0;
62
63         /*
64          * If the console is not marked to be bound before relocation, bind it
65          * anyway.
66          */
67         if (node > 0 && !lists_bind_fdt(gd->dm_root, offset_to_ofnode(node),
68                                         devp, NULL, false)) {
69                 if (device_get_uclass_id(*devp) == UCLASS_SERIAL &&
70                     !device_probe(*devp))
71                         return 0;
72         }
73
74         return -ENODEV;
75 }
76
77 static void serial_find_console_or_panic(void)
78 {
79         const void *blob = gd->fdt_blob;
80         struct udevice *dev;
81 #ifdef CONFIG_SERIAL_SEARCH_ALL
82         int ret;
83 #endif
84
85         if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
86                 uclass_first_device(UCLASS_SERIAL, &dev);
87                 if (dev) {
88                         gd->cur_serial_dev = dev;
89                         return;
90                 }
91         } else if (CONFIG_IS_ENABLED(OF_CONTROL) && blob) {
92                 /* Live tree has support for stdout */
93                 if (of_live_active()) {
94                         struct device_node *np = of_get_stdout();
95
96                         if (np && !uclass_get_device_by_ofnode(UCLASS_SERIAL,
97                                         np_to_ofnode(np), &dev)) {
98                                 gd->cur_serial_dev = dev;
99                                 return;
100                         }
101                 } else {
102                         if (!serial_check_stdout(blob, &dev)) {
103                                 gd->cur_serial_dev = dev;
104                                 return;
105                         }
106                 }
107         }
108         if (!IS_ENABLED(CONFIG_SPL_BUILD) || !CONFIG_IS_ENABLED(OF_CONTROL) ||
109             !blob) {
110                 /*
111                  * Try to use CONFIG_CONS_INDEX if available (it is numbered
112                  * from 1!).
113                  *
114                  * Failing that, get the device with sequence number 0, or in
115                  * extremis just the first working serial device we can find.
116                  * But we insist on having a console (even if it is silent).
117                  */
118 #ifdef CONFIG_CONS_INDEX
119 #define INDEX (CONFIG_CONS_INDEX - 1)
120 #else
121 #define INDEX 0
122 #endif
123
124 #ifdef CONFIG_SERIAL_SEARCH_ALL
125                 if (!uclass_get_device_by_seq(UCLASS_SERIAL, INDEX, &dev) ||
126                     !uclass_get_device(UCLASS_SERIAL, INDEX, &dev)) {
127                         if (dev_get_flags(dev) & DM_FLAG_ACTIVATED) {
128                                 gd->cur_serial_dev = dev;
129                                 return;
130                         }
131                 }
132
133                 /* Search for any working device */
134                 for (ret = uclass_first_device_check(UCLASS_SERIAL, &dev);
135                      dev;
136                      ret = uclass_next_device_check(&dev)) {
137                         if (!ret) {
138                                 /* Device did succeed probing */
139                                 gd->cur_serial_dev = dev;
140                                 return;
141                         }
142                 }
143 #else
144                 if (!uclass_get_device_by_seq(UCLASS_SERIAL, INDEX, &dev) ||
145                     !uclass_get_device(UCLASS_SERIAL, INDEX, &dev) ||
146                     (!uclass_first_device(UCLASS_SERIAL, &dev) && dev)) {
147                         gd->cur_serial_dev = dev;
148                         return;
149                 }
150 #endif
151
152 #undef INDEX
153         }
154
155 #ifdef CONFIG_REQUIRE_SERIAL_CONSOLE
156         panic_str("No serial driver found");
157 #endif
158 }
159 #endif /* CONFIG_SERIAL_PRESENT */
160
161 /* Called prior to relocation */
162 int serial_init(void)
163 {
164 #if CONFIG_IS_ENABLED(SERIAL_PRESENT)
165         serial_find_console_or_panic();
166         gd->flags |= GD_FLG_SERIAL_READY;
167         serial_setbrg();
168 #endif
169
170         return 0;
171 }
172
173 /* Called after relocation */
174 int serial_initialize(void)
175 {
176         /* Scanning uclass to probe devices */
177         if (IS_ENABLED(CONFIG_SERIAL_PROBE_ALL)) {
178                 int ret;
179
180                 ret  = uclass_probe_all(UCLASS_SERIAL);
181                 if (ret)
182                         return ret;
183         }
184
185         return serial_init();
186 }
187
188 static void _serial_putc(struct udevice *dev, char ch)
189 {
190         struct dm_serial_ops *ops = serial_get_ops(dev);
191         int err;
192
193         if (ch == '\n')
194                 _serial_putc(dev, '\r');
195
196         do {
197                 err = ops->putc(dev, ch);
198         } while (err == -EAGAIN);
199 }
200
201 static int __serial_puts(struct udevice *dev, const char *str, size_t len)
202 {
203         struct dm_serial_ops *ops = serial_get_ops(dev);
204
205         do {
206                 ssize_t written = ops->puts(dev, str, len);
207
208                 if (written < 0)
209                         return written;
210                 str += written;
211                 len -= written;
212         } while (len);
213
214         return 0;
215 }
216
217 static void _serial_puts(struct udevice *dev, const char *str)
218 {
219         struct dm_serial_ops *ops = serial_get_ops(dev);
220
221         if (!CONFIG_IS_ENABLED(SERIAL_PUTS) || !ops->puts) {
222                 while (*str)
223                         _serial_putc(dev, *str++);
224                 return;
225         }
226
227         do {
228                 const char *newline = strchrnul(str, '\n');
229                 size_t len = newline - str;
230
231                 if (__serial_puts(dev, str, len))
232                         return;
233
234                 if (*newline && __serial_puts(dev, "\r\n", 2))
235                         return;
236
237                 str += len + !!*newline;
238         } while (*str);
239 }
240
241 #ifdef CONFIG_CONSOLE_FLUSH_SUPPORT
242 static void _serial_flush(struct udevice *dev)
243 {
244         struct dm_serial_ops *ops = serial_get_ops(dev);
245
246         if (!ops->pending)
247                 return;
248         while (ops->pending(dev, false) > 0)
249                 ;
250 }
251 #endif
252
253 static int __serial_getc(struct udevice *dev)
254 {
255         struct dm_serial_ops *ops = serial_get_ops(dev);
256         int err;
257
258         do {
259                 err = ops->getc(dev);
260                 if (err == -EAGAIN)
261                         schedule();
262         } while (err == -EAGAIN);
263
264         return err >= 0 ? err : 0;
265 }
266
267 static int __serial_tstc(struct udevice *dev)
268 {
269         struct dm_serial_ops *ops = serial_get_ops(dev);
270
271         if (ops->pending)
272                 return ops->pending(dev, true);
273
274         return 1;
275 }
276
277 #if CONFIG_IS_ENABLED(SERIAL_RX_BUFFER)
278 static int _serial_tstc(struct udevice *dev)
279 {
280         struct serial_dev_priv *upriv = dev_get_uclass_priv(dev);
281
282         /* Read all available chars into the RX buffer */
283         while (__serial_tstc(dev)) {
284                 upriv->buf[upriv->wr_ptr++] = __serial_getc(dev);
285                 upriv->wr_ptr %= CONFIG_SERIAL_RX_BUFFER_SIZE;
286         }
287
288         return upriv->rd_ptr != upriv->wr_ptr ? 1 : 0;
289 }
290
291 static int _serial_getc(struct udevice *dev)
292 {
293         struct serial_dev_priv *upriv = dev_get_uclass_priv(dev);
294         char val;
295
296         if (upriv->rd_ptr == upriv->wr_ptr)
297                 return __serial_getc(dev);
298
299         val = upriv->buf[upriv->rd_ptr++];
300         upriv->rd_ptr %= CONFIG_SERIAL_RX_BUFFER_SIZE;
301
302         return val;
303 }
304
305 #else /* CONFIG_IS_ENABLED(SERIAL_RX_BUFFER) */
306
307 static int _serial_getc(struct udevice *dev)
308 {
309         return __serial_getc(dev);
310 }
311
312 static int _serial_tstc(struct udevice *dev)
313 {
314         return __serial_tstc(dev);
315 }
316 #endif /* CONFIG_IS_ENABLED(SERIAL_RX_BUFFER) */
317
318 void serial_putc(char ch)
319 {
320         if (gd->cur_serial_dev)
321                 _serial_putc(gd->cur_serial_dev, ch);
322 }
323
324 void serial_puts(const char *str)
325 {
326         if (gd->cur_serial_dev)
327                 _serial_puts(gd->cur_serial_dev, str);
328 }
329
330 #ifdef CONFIG_CONSOLE_FLUSH_SUPPORT
331 void serial_flush(void)
332 {
333         if (!gd->cur_serial_dev)
334                 return;
335
336         _serial_flush(gd->cur_serial_dev);
337 }
338 #endif
339
340 int serial_getc(void)
341 {
342         if (!gd->cur_serial_dev)
343                 return 0;
344
345         return _serial_getc(gd->cur_serial_dev);
346 }
347
348 int serial_tstc(void)
349 {
350         if (!gd->cur_serial_dev)
351                 return 0;
352
353         return _serial_tstc(gd->cur_serial_dev);
354 }
355
356 void serial_setbrg(void)
357 {
358         struct dm_serial_ops *ops;
359
360         if (!gd->cur_serial_dev)
361                 return;
362
363         ops = serial_get_ops(gd->cur_serial_dev);
364         if (ops->setbrg)
365                 ops->setbrg(gd->cur_serial_dev, gd->baudrate);
366 }
367
368 int serial_getconfig(struct udevice *dev, uint *config)
369 {
370         struct dm_serial_ops *ops;
371
372         ops = serial_get_ops(dev);
373         if (ops->getconfig)
374                 return ops->getconfig(dev, config);
375
376         return 0;
377 }
378
379 int serial_setconfig(struct udevice *dev, uint config)
380 {
381         struct dm_serial_ops *ops;
382
383         ops = serial_get_ops(dev);
384         if (ops->setconfig)
385                 return ops->setconfig(dev, config);
386
387         return 0;
388 }
389
390 int serial_getinfo(struct udevice *dev, struct serial_device_info *info)
391 {
392         struct dm_serial_ops *ops;
393
394         if (!info)
395                 return -EINVAL;
396
397         info->baudrate = gd->baudrate;
398
399         ops = serial_get_ops(dev);
400         if (ops->getinfo)
401                 return ops->getinfo(dev, info);
402
403         return -EINVAL;
404 }
405
406 void serial_stdio_init(void)
407 {
408 }
409
410 #if defined(CONFIG_DM_STDIO)
411
412 #if CONFIG_IS_ENABLED(SERIAL_PRESENT)
413 static void serial_stub_putc(struct stdio_dev *sdev, const char ch)
414 {
415         _serial_putc(sdev->priv, ch);
416 }
417
418 static void serial_stub_puts(struct stdio_dev *sdev, const char *str)
419 {
420         _serial_puts(sdev->priv, str);
421 }
422
423 #ifdef CONFIG_CONSOLE_FLUSH_SUPPORT
424 static void serial_stub_flush(struct stdio_dev *sdev)
425 {
426         _serial_flush(sdev->priv);
427 }
428 #endif
429
430 static int serial_stub_getc(struct stdio_dev *sdev)
431 {
432         return _serial_getc(sdev->priv);
433 }
434
435 static int serial_stub_tstc(struct stdio_dev *sdev)
436 {
437         return _serial_tstc(sdev->priv);
438 }
439 #endif
440 #endif
441
442 /**
443  * on_baudrate() - Update the actual baudrate when the env var changes
444  *
445  * This will check for a valid baudrate and only apply it if valid.
446  */
447 static int on_baudrate(const char *name, const char *value, enum env_op op,
448         int flags)
449 {
450         int i;
451         int baudrate;
452
453         switch (op) {
454         case env_op_create:
455         case env_op_overwrite:
456                 /*
457                  * Switch to new baudrate if new baudrate is supported
458                  */
459                 baudrate = dectoul(value, NULL);
460
461                 /* Not actually changing */
462                 if (gd->baudrate == baudrate)
463                         return 0;
464
465                 for (i = 0; i < ARRAY_SIZE(baudrate_table); ++i) {
466                         if (baudrate == baudrate_table[i])
467                                 break;
468                 }
469                 if (i == ARRAY_SIZE(baudrate_table)) {
470                         if ((flags & H_FORCE) == 0)
471                                 printf("## Baudrate %d bps not supported\n",
472                                        baudrate);
473                         return 1;
474                 }
475                 if ((flags & H_INTERACTIVE) != 0) {
476                         printf("## Switch baudrate to %d bps and press ENTER ...\n",
477                                baudrate);
478                         udelay(50000);
479                         flush();
480                 }
481
482                 gd->baudrate = baudrate;
483
484                 serial_setbrg();
485
486                 udelay(50000);
487
488                 if ((flags & H_INTERACTIVE) != 0)
489                         while (1) {
490                                 if (getchar() == '\r')
491                                         break;
492                         }
493
494                 return 0;
495         case env_op_delete:
496                 printf("## Baudrate may not be deleted\n");
497                 return 1;
498         default:
499                 return 0;
500         }
501 }
502 U_BOOT_ENV_CALLBACK(baudrate, on_baudrate);
503
504 #if CONFIG_IS_ENABLED(SERIAL_PRESENT)
505 static int serial_post_probe(struct udevice *dev)
506 {
507         struct dm_serial_ops *ops = serial_get_ops(dev);
508 #ifdef CONFIG_DM_STDIO
509         struct serial_dev_priv *upriv = dev_get_uclass_priv(dev);
510         struct stdio_dev sdev;
511 #endif
512         int ret;
513
514 #if defined(CONFIG_NEEDS_MANUAL_RELOC)
515         if (ops->setbrg)
516                 ops->setbrg += gd->reloc_off;
517         if (ops->getc)
518                 ops->getc += gd->reloc_off;
519         if (ops->putc)
520                 ops->putc += gd->reloc_off;
521         if (ops->pending)
522                 ops->pending += gd->reloc_off;
523         if (ops->clear)
524                 ops->clear += gd->reloc_off;
525         if (ops->getconfig)
526                 ops->getconfig += gd->reloc_off;
527         if (ops->setconfig)
528                 ops->setconfig += gd->reloc_off;
529 #if CONFIG_POST & CONFIG_SYS_POST_UART
530         if (ops->loop)
531                 ops->loop += gd->reloc_off;
532 #endif
533         if (ops->getinfo)
534                 ops->getinfo += gd->reloc_off;
535 #endif
536         /* Set the baud rate */
537         if (ops->setbrg) {
538                 ret = ops->setbrg(dev, gd->baudrate);
539                 if (ret)
540                         return ret;
541         }
542
543 #ifdef CONFIG_DM_STDIO
544         if (!(gd->flags & GD_FLG_RELOC))
545                 return 0;
546         memset(&sdev, '\0', sizeof(sdev));
547
548         strncpy(sdev.name, dev->name, sizeof(sdev.name));
549         sdev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_DM;
550         sdev.priv = dev;
551         sdev.putc = serial_stub_putc;
552         sdev.puts = serial_stub_puts;
553         STDIO_DEV_ASSIGN_FLUSH(&sdev, serial_stub_flush);
554         sdev.getc = serial_stub_getc;
555         sdev.tstc = serial_stub_tstc;
556
557 #if CONFIG_IS_ENABLED(SERIAL_RX_BUFFER)
558         /* Allocate the RX buffer */
559         upriv->buf = malloc(CONFIG_SERIAL_RX_BUFFER_SIZE);
560 #endif
561
562         stdio_register_dev(&sdev, &upriv->sdev);
563 #endif
564         return 0;
565 }
566
567 static int serial_pre_remove(struct udevice *dev)
568 {
569 #if CONFIG_IS_ENABLED(SYS_STDIO_DEREGISTER)
570         struct serial_dev_priv *upriv = dev_get_uclass_priv(dev);
571
572         if (stdio_deregister_dev(upriv->sdev, true))
573                 return -EPERM;
574 #endif
575
576         return 0;
577 }
578
579 UCLASS_DRIVER(serial) = {
580         .id             = UCLASS_SERIAL,
581         .name           = "serial",
582         .flags          = DM_UC_FLAG_SEQ_ALIAS,
583         .post_probe     = serial_post_probe,
584         .pre_remove     = serial_pre_remove,
585         .per_device_auto        = sizeof(struct serial_dev_priv),
586 };
587 #endif