162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2008 David Gibson, IBM Corporation 462306a36Sopenharmony_ci * Copyright (C) 2012 Regents of the University of California 562306a36Sopenharmony_ci * Copyright (C) 2017 SiFive 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/console.h> 962306a36Sopenharmony_ci#include <linux/err.h> 1062306a36Sopenharmony_ci#include <linux/init.h> 1162306a36Sopenharmony_ci#include <linux/moduleparam.h> 1262306a36Sopenharmony_ci#include <linux/types.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <asm/sbi.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include "hvc_console.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic int hvc_sbi_tty_put(uint32_t vtermno, const char *buf, int count) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci int i; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci for (i = 0; i < count; i++) 2362306a36Sopenharmony_ci sbi_console_putchar(buf[i]); 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci return i; 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic int hvc_sbi_tty_get(uint32_t vtermno, char *buf, int count) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci int i, c; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci for (i = 0; i < count; i++) { 3362306a36Sopenharmony_ci c = sbi_console_getchar(); 3462306a36Sopenharmony_ci if (c < 0) 3562306a36Sopenharmony_ci break; 3662306a36Sopenharmony_ci buf[i] = c; 3762306a36Sopenharmony_ci } 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci return i; 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic const struct hv_ops hvc_sbi_ops = { 4362306a36Sopenharmony_ci .get_chars = hvc_sbi_tty_get, 4462306a36Sopenharmony_ci .put_chars = hvc_sbi_tty_put, 4562306a36Sopenharmony_ci}; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic int __init hvc_sbi_init(void) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci return PTR_ERR_OR_ZERO(hvc_alloc(0, 0, &hvc_sbi_ops, 16)); 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_cidevice_initcall(hvc_sbi_init); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic int __init hvc_sbi_console_init(void) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci hvc_instantiate(0, 0, &hvc_sbi_ops); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci return 0; 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ciconsole_initcall(hvc_sbi_console_init); 60