1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * udbg interface to hvc_console.c 4 * 5 * (C) Copyright David Gibson, IBM Corporation 2008. 6 */ 7 8#include <linux/console.h> 9#include <linux/delay.h> 10#include <linux/err.h> 11#include <linux/init.h> 12#include <linux/moduleparam.h> 13#include <linux/types.h> 14#include <linux/irq.h> 15 16#include <asm/udbg.h> 17 18#include "hvc_console.h" 19 20static struct hvc_struct *hvc_udbg_dev; 21 22static ssize_t hvc_udbg_put(uint32_t vtermno, const u8 *buf, size_t count) 23{ 24 size_t i; 25 26 for (i = 0; i < count && udbg_putc; i++) 27 udbg_putc(buf[i]); 28 29 return i; 30} 31 32static ssize_t hvc_udbg_get(uint32_t vtermno, u8 *buf, size_t count) 33{ 34 size_t i; 35 int c; 36 37 if (!udbg_getc_poll) 38 return 0; 39 40 for (i = 0; i < count; i++) { 41 if ((c = udbg_getc_poll()) == -1) 42 break; 43 buf[i] = c; 44 } 45 46 return i; 47} 48 49static const struct hv_ops hvc_udbg_ops = { 50 .get_chars = hvc_udbg_get, 51 .put_chars = hvc_udbg_put, 52}; 53 54static int __init hvc_udbg_init(void) 55{ 56 struct hvc_struct *hp; 57 58 if (!udbg_putc) 59 return -ENODEV; 60 61 BUG_ON(hvc_udbg_dev); 62 63 hp = hvc_alloc(0, 0, &hvc_udbg_ops, 16); 64 if (IS_ERR(hp)) 65 return PTR_ERR(hp); 66 67 hvc_udbg_dev = hp; 68 69 return 0; 70} 71device_initcall(hvc_udbg_init); 72 73static int __init hvc_udbg_console_init(void) 74{ 75 if (!udbg_putc) 76 return -ENODEV; 77 78 hvc_instantiate(0, 0, &hvc_udbg_ops); 79 add_preferred_console("hvc", 0, NULL); 80 81 return 0; 82} 83console_initcall(hvc_udbg_console_init); 84