hvc_udbg.c (1382B)
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 int hvc_udbg_put(uint32_t vtermno, const char *buf, int count) 23{ 24 int i; 25 26 for (i = 0; i < count && udbg_putc; i++) 27 udbg_putc(buf[i]); 28 29 return i; 30} 31 32static int hvc_udbg_get(uint32_t vtermno, char *buf, int count) 33{ 34 int i, c; 35 36 if (!udbg_getc_poll) 37 return 0; 38 39 for (i = 0; i < count; i++) { 40 if ((c = udbg_getc_poll()) == -1) 41 break; 42 buf[i] = c; 43 } 44 45 return i; 46} 47 48static const struct hv_ops hvc_udbg_ops = { 49 .get_chars = hvc_udbg_get, 50 .put_chars = hvc_udbg_put, 51}; 52 53static int __init hvc_udbg_init(void) 54{ 55 struct hvc_struct *hp; 56 57 if (!udbg_putc) 58 return -ENODEV; 59 60 BUG_ON(hvc_udbg_dev); 61 62 hp = hvc_alloc(0, 0, &hvc_udbg_ops, 16); 63 if (IS_ERR(hp)) 64 return PTR_ERR(hp); 65 66 hvc_udbg_dev = hp; 67 68 return 0; 69} 70device_initcall(hvc_udbg_init); 71 72static int __init hvc_udbg_console_init(void) 73{ 74 if (!udbg_putc) 75 return -ENODEV; 76 77 hvc_instantiate(0, 0, &hvc_udbg_ops); 78 add_preferred_console("hvc", 0, NULL); 79 80 return 0; 81} 82console_initcall(hvc_udbg_console_init);