1 // Copyright 2017 The Fuchsia Authors
2 //
3 // Use of this source code is governed by a MIT-style
4 // license that can be found in the LICENSE file or at
5 // https://opensource.org/licenses/MIT
6
7 #include <pdev/uart.h>
8
9 #include <arch/arch_ops.h>
10 #include <err.h>
11
default_getc(bool wait)12 static int default_getc(bool wait) {
13 return ZX_ERR_NOT_SUPPORTED;
14 }
15
default_pputc(char c)16 static int default_pputc(char c) {
17 return -1;
18 }
19
default_pgetc()20 static int default_pgetc() {
21 return ZX_ERR_NOT_SUPPORTED;
22 }
23
default_start_panic()24 static void default_start_panic() {
25 }
26
default_dputs(const char * str,size_t len,bool block,bool map_NL)27 static void default_dputs(const char* str, size_t len,
28 bool block, bool map_NL) {
29 }
30
31 static const struct pdev_uart_ops default_ops = {
32 .getc = default_getc,
33 .pputc = default_pputc,
34 .pgetc = default_pgetc,
35 .start_panic = default_start_panic,
36 .dputs = default_dputs,
37 };
38
39 static const struct pdev_uart_ops* uart_ops = &default_ops;
40
uart_init()41 void uart_init() {
42 }
43
uart_init_early()44 void uart_init_early() {
45 }
46
uart_present()47 bool uart_present() {
48 return uart_ops != &default_ops;
49 }
50
uart_putc(char c)51 void uart_putc(char c) {
52 uart_ops->dputs(&c, 1, true, true);
53 }
54
uart_getc(bool wait)55 int uart_getc(bool wait) {
56 return uart_ops->getc(wait);
57 }
58
59 /*
60 * block : Blocking vs Non-Blocking
61 * map_NL : If true, map a '\n' to '\r'+'\n'
62 */
uart_puts(const char * str,size_t len,bool block,bool map_NL)63 void uart_puts(const char* str, size_t len, bool block, bool map_NL) {
64 uart_ops->dputs(str, len, block, map_NL);
65 }
66
uart_pputc(char c)67 int uart_pputc(char c) {
68 return uart_ops->pputc(c);
69 }
70
uart_pgetc()71 int uart_pgetc() {
72 return uart_ops->pgetc();
73 }
74
pdev_register_uart(const struct pdev_uart_ops * ops)75 void pdev_register_uart(const struct pdev_uart_ops* ops) {
76 uart_ops = ops;
77 smp_mb();
78 }
79