Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (C) 2019 Axis Communications AB
0004  *
0005  * Based on ttyprintk.c:
0006  *  Copyright (C) 2010 Samo Pogacnik
0007  */
0008 
0009 #include <linux/console.h>
0010 #include <linux/module.h>
0011 #include <linux/tty.h>
0012 
0013 static const struct tty_port_operations ttynull_port_ops;
0014 static struct tty_driver *ttynull_driver;
0015 static struct tty_port ttynull_port;
0016 
0017 static int ttynull_open(struct tty_struct *tty, struct file *filp)
0018 {
0019     return tty_port_open(&ttynull_port, tty, filp);
0020 }
0021 
0022 static void ttynull_close(struct tty_struct *tty, struct file *filp)
0023 {
0024     tty_port_close(&ttynull_port, tty, filp);
0025 }
0026 
0027 static void ttynull_hangup(struct tty_struct *tty)
0028 {
0029     tty_port_hangup(&ttynull_port);
0030 }
0031 
0032 static int ttynull_write(struct tty_struct *tty, const unsigned char *buf,
0033              int count)
0034 {
0035     return count;
0036 }
0037 
0038 static unsigned int ttynull_write_room(struct tty_struct *tty)
0039 {
0040     return 65536;
0041 }
0042 
0043 static const struct tty_operations ttynull_ops = {
0044     .open = ttynull_open,
0045     .close = ttynull_close,
0046     .hangup = ttynull_hangup,
0047     .write = ttynull_write,
0048     .write_room = ttynull_write_room,
0049 };
0050 
0051 static struct tty_driver *ttynull_device(struct console *c, int *index)
0052 {
0053     *index = 0;
0054     return ttynull_driver;
0055 }
0056 
0057 static struct console ttynull_console = {
0058     .name = "ttynull",
0059     .device = ttynull_device,
0060 };
0061 
0062 static int __init ttynull_init(void)
0063 {
0064     struct tty_driver *driver;
0065     int ret;
0066 
0067     driver = tty_alloc_driver(1,
0068         TTY_DRIVER_RESET_TERMIOS |
0069         TTY_DRIVER_REAL_RAW |
0070         TTY_DRIVER_UNNUMBERED_NODE);
0071     if (IS_ERR(driver))
0072         return PTR_ERR(driver);
0073 
0074     tty_port_init(&ttynull_port);
0075     ttynull_port.ops = &ttynull_port_ops;
0076 
0077     driver->driver_name = "ttynull";
0078     driver->name = "ttynull";
0079     driver->type = TTY_DRIVER_TYPE_CONSOLE;
0080     driver->init_termios = tty_std_termios;
0081     driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET;
0082     tty_set_operations(driver, &ttynull_ops);
0083     tty_port_link_device(&ttynull_port, driver, 0);
0084 
0085     ret = tty_register_driver(driver);
0086     if (ret < 0) {
0087         tty_driver_kref_put(driver);
0088         tty_port_destroy(&ttynull_port);
0089         return ret;
0090     }
0091 
0092     ttynull_driver = driver;
0093     register_console(&ttynull_console);
0094 
0095     return 0;
0096 }
0097 
0098 static void __exit ttynull_exit(void)
0099 {
0100     unregister_console(&ttynull_console);
0101     tty_unregister_driver(ttynull_driver);
0102     tty_driver_kref_put(ttynull_driver);
0103     tty_port_destroy(&ttynull_port);
0104 }
0105 
0106 module_init(ttynull_init);
0107 module_exit(ttynull_exit);
0108 
0109 MODULE_LICENSE("GPL v2");