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 20 static struct hvc_struct *hvc_udbg_dev; 21 22 static 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 32 static 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 49 static const struct hv_ops hvc_udbg_ops = { 50 .get_chars = hvc_udbg_get, 51 .put_chars = hvc_udbg_put, 52 }; 53 54 static 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 } 71 device_initcall(hvc_udbg_init); 72 73 static 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 } 83 console_initcall(hvc_udbg_console_init); 84