84 lines · c
1// SPDX-License-Identifier: GPL-2.0+2/*3 * udbg interface to hvc_console.c4 *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