linux/drivers/tty/hvc/hvc_udbg.c
<<
>>
Prefs
   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);
  83