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