blob: 3b10ab3349cc6942d9cc8d89eb08153380256b2f [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <pdev/uart.h>
#include <arch/arch_ops.h>
#include <err.h>
static int default_getc(bool wait) {
return ZX_ERR_NOT_SUPPORTED;
}
static int default_pputc(char c) {
return -1;
}
static int default_pgetc() {
return ZX_ERR_NOT_SUPPORTED;
}
static void default_start_panic() {
}
static void default_dputs(const char* str, size_t len,
bool block, bool map_NL) {
}
static const struct pdev_uart_ops default_ops = {
.getc = default_getc,
.pputc = default_pputc,
.pgetc = default_pgetc,
.start_panic = default_start_panic,
.dputs = default_dputs,
};
static const struct pdev_uart_ops* uart_ops = &default_ops;
void uart_init() {
}
void uart_init_early() {
}
bool uart_present() {
return uart_ops != &default_ops;
}
void uart_putc(char c) {
uart_ops->dputs(&c, 1, true, true);
}
int uart_getc(bool wait) {
return uart_ops->getc(wait);
}
/*
* block : Blocking vs Non-Blocking
* map_NL : If true, map a '\n' to '\r'+'\n'
*/
void uart_puts(const char* str, size_t len, bool block, bool map_NL) {
uart_ops->dputs(str, len, block, map_NL);
}
int uart_pputc(char c) {
return uart_ops->pputc(c);
}
int uart_pgetc() {
return uart_ops->pgetc();
}
void pdev_register_uart(const struct pdev_uart_ops* ops) {
uart_ops = ops;
smp_mb();
}