blob: 3105928970dbebd229f9152eeaacebcec1101807 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
wdenke831ad52002-10-17 21:52:26 +00002/*
3 * (C) Copyright 2000
4 * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
wdenke831ad52002-10-17 21:52:26 +00005 */
6
Jean-Christophe PLAGNIOL-VILLARD2a7a0312009-05-16 12:14:54 +02007#ifndef _STDIO_DEV_H_
8#define _STDIO_DEV_H_
wdenke831ad52002-10-17 21:52:26 +00009
Tom Rini66c4d712018-05-03 09:12:26 -040010#include <stdio.h>
Jean-Christophe PLAGNIOL-VILLARD2a7a0312009-05-16 12:14:54 +020011#include <linux/list.h>
wdenke831ad52002-10-17 21:52:26 +000012
13/*
Jean-Christophe PLAGNIOL-VILLARD2a7a0312009-05-16 12:14:54 +020014 * STDIO DEVICES
wdenke831ad52002-10-17 21:52:26 +000015 */
16
17#define DEV_FLAGS_INPUT 0x00000001 /* Device can be used as input console */
18#define DEV_FLAGS_OUTPUT 0x00000002 /* Device can be used as output console */
Simon Glass10a7fe92017-07-27 09:31:04 -060019#define DEV_FLAGS_DM 0x00000004 /* Device priv is a struct udevice * */
wdenke831ad52002-10-17 21:52:26 +000020
Andy Shevchenko94331022021-02-11 17:09:36 +020021int stdio_file_to_flags(const int file);
22
wdenkcc1e2562003-03-06 13:39:27 +000023/* Device information */
Jean-Christophe PLAGNIOL-VILLARD2a7a0312009-05-16 12:14:54 +020024struct stdio_dev {
wdenke831ad52002-10-17 21:52:26 +000025 int flags; /* Device flags: input/output/system */
26 int ext; /* Supported extensions */
Alexey Brodkindca5bf12015-02-25 21:26:46 +030027 char name[32]; /* Device name */
wdenke831ad52002-10-17 21:52:26 +000028
29/* GENERAL functions */
30
Simon Glass0d1e1f72014-07-23 06:54:59 -060031 int (*start)(struct stdio_dev *dev); /* To start the device */
32 int (*stop)(struct stdio_dev *dev); /* To stop the device */
wdenke831ad52002-10-17 21:52:26 +000033
34/* OUTPUT functions */
35
Simon Glass0d1e1f72014-07-23 06:54:59 -060036 /* To put a char */
37 void (*putc)(struct stdio_dev *dev, const char c);
38 /* To put a string (accelerator) */
39 void (*puts)(struct stdio_dev *dev, const char *s);
Pali Rohár5aceb262022-09-05 11:31:17 +020040#ifdef CONFIG_CONSOLE_FLUSH_SUPPORT
41 /* To flush output queue */
42 void (*flush)(struct stdio_dev *dev);
43#define STDIO_DEV_ASSIGN_FLUSH(dev, flush_func) ((dev)->flush = (flush_func))
44#else
45#define STDIO_DEV_ASSIGN_FLUSH(dev, flush_func)
46#endif
wdenke831ad52002-10-17 21:52:26 +000047
48/* INPUT functions */
49
Simon Glass0d1e1f72014-07-23 06:54:59 -060050 /* To test if a char is ready... */
51 int (*tstc)(struct stdio_dev *dev);
52 int (*getc)(struct stdio_dev *dev); /* To get that char */
wdenke831ad52002-10-17 21:52:26 +000053
54/* Other functions */
55
56 void *priv; /* Private extensions */
Jean-Christophe PLAGNIOL-VILLARD8a4a7842008-08-31 04:24:55 +020057 struct list_head list;
Jean-Christophe PLAGNIOL-VILLARD2a7a0312009-05-16 12:14:54 +020058};
wdenke831ad52002-10-17 21:52:26 +000059
60/*
wdenke831ad52002-10-17 21:52:26 +000061 * VARIABLES
62 */
Jean-Christophe PLAGNIOL-VILLARD2a7a0312009-05-16 12:14:54 +020063extern struct stdio_dev *stdio_devices[];
wdenke831ad52002-10-17 21:52:26 +000064extern char *stdio_names[MAX_FILES];
65
66/*
67 * PROTOTYPES
68 */
Simon Glass16c6a1c2020-08-11 11:23:38 -060069int stdio_register(struct stdio_dev *dev);
Simon Glass5d609ce2014-07-23 06:55:05 -060070int stdio_register_dev(struct stdio_dev *dev, struct stdio_dev **devp);
Simon Glass712da5e2014-09-03 17:37:01 -060071
72/**
73 * stdio_init_tables() - set up stdio tables ready for devices
74 *
75 * This does not add any devices, but just prepares stdio for use.
76 */
77int stdio_init_tables(void);
78
79/**
80 * stdio_add_devices() - Add stdio devices to the table
81 *
82 * This makes calls to all the various subsystems that use stdio, to make
83 * them register with stdio.
84 */
85int stdio_add_devices(void);
86
87/**
88 * stdio_init() - Sets up stdio ready for use
89 *
90 * This calls stdio_init_tables() and stdio_add_devices()
91 */
92int stdio_init(void);
93
Simon Glass16c6a1c2020-08-11 11:23:38 -060094void stdio_print_current_devices(void);
Simon Glass5b4c1222020-08-11 11:23:41 -060095
96/**
97 * stdio_deregister_dev() - deregister the device "devname".
98 *
99 * @dev: Stdio device to deregister
100 * @force: true to force deregistration even if in use
101 *
102 * returns 0 on success, -EBUSY if device is assigned
103 */
Hans de Goede1a586382014-09-20 16:54:37 +0200104int stdio_deregister_dev(struct stdio_dev *dev, int force);
Simon Glass16c6a1c2020-08-11 11:23:38 -0600105struct list_head *stdio_get_list(void);
106struct stdio_dev *stdio_get_by_name(const char *name);
107struct stdio_dev *stdio_clone(struct stdio_dev *dev);
Jean-Christophe PLAGNIOL-VILLARD8a4a7842008-08-31 04:24:55 +0200108
Simon Glass16c6a1c2020-08-11 11:23:38 -0600109int drv_lcd_init(void);
110int drv_video_init(void);
111int drv_keyboard_init(void);
112int drv_usbtty_init(void);
Loic Poulaineb78f832021-11-25 18:16:15 +0100113int drv_usbacm_init(void);
Simon Glass16c6a1c2020-08-11 11:23:38 -0600114int drv_nc_init(void);
115int drv_jtag_console_init(void);
Vadim Bendebury263a8bd2012-10-12 18:48:47 +0000116int cbmemc_init(void);
wdenke831ad52002-10-17 21:52:26 +0000117
Jean-Christophe PLAGNIOL-VILLARD2a7a0312009-05-16 12:14:54 +0200118#endif