mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 13:43:21 -04:00
Merge tag 'tty-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull tty / serial driver updates from Greg KH:
"Here is the big set of TTY/Serial driver updates and cleanups for
6.9-rc1. Included in here are:
- more tty cleanups from Jiri
- loads of 8250 driver cleanups from Andy
- max310x driver updates
- samsung serial driver updates
- uart_prepare_sysrq_char() updates for many drivers
- platform driver remove callback void cleanups
- stm32 driver updates
- other small tty/serial driver updates
All of these have been in linux-next for a long time with no reported
issues"
* tag 'tty-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (199 commits)
dt-bindings: serial: stm32: add power-domains property
serial: 8250_dw: Replace ACPI device check by a quirk
serial: Lock console when calling into driver before registration
serial: 8250_uniphier: Switch to use uart_read_port_properties()
serial: 8250_tegra: Switch to use uart_read_port_properties()
serial: 8250_pxa: Switch to use uart_read_port_properties()
serial: 8250_omap: Switch to use uart_read_port_properties()
serial: 8250_of: Switch to use uart_read_port_properties()
serial: 8250_lpc18xx: Switch to use uart_read_port_properties()
serial: 8250_ingenic: Switch to use uart_read_port_properties()
serial: 8250_dw: Switch to use uart_read_port_properties()
serial: 8250_bcm7271: Switch to use uart_read_port_properties()
serial: 8250_bcm2835aux: Switch to use uart_read_port_properties()
serial: 8250_aspeed_vuart: Switch to use uart_read_port_properties()
serial: port: Introduce a common helper to read properties
serial: core: Add UPIO_UNKNOWN constant for unknown port type
serial: core: Move struct uart_port::quirks closer to possible values
serial: sh-sci: Call sci_serial_{in,out}() directly
serial: core: only stop transmit when HW fifo is empty
serial: pch: Use uart_prepare_sysrq_char().
...
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
#include <linux/bits.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/vesa.h>
|
||||
|
||||
struct vc_data;
|
||||
struct console_font_op;
|
||||
@@ -36,63 +37,91 @@ enum vc_intensity;
|
||||
/**
|
||||
* struct consw - callbacks for consoles
|
||||
*
|
||||
* @owner: the module to get references of when this console is used
|
||||
* @con_startup: set up the console and return its name (like VGA, EGA, ...)
|
||||
* @con_init: initialize the console on @vc. @init is true for the very first
|
||||
* call on this @vc.
|
||||
* @con_deinit: deinitialize the console from @vc.
|
||||
* @con_clear: erase @count characters at [@x, @y] on @vc. @count >= 1.
|
||||
* @con_putc: emit one character with attributes @ca to [@x, @y] on @vc.
|
||||
* (optional -- @con_putcs would be called instead)
|
||||
* @con_putcs: emit @count characters with attributes @s to [@x, @y] on @vc.
|
||||
* @con_cursor: enable/disable cursor depending on @enable
|
||||
* @con_scroll: move lines from @top to @bottom in direction @dir by @lines.
|
||||
* Return true if no generic handling should be done.
|
||||
* Invoked by csi_M and printing to the console.
|
||||
* @con_set_palette: sets the palette of the console to @table (optional)
|
||||
* @con_switch: notifier about the console switch; it is supposed to return
|
||||
* true if a redraw is needed.
|
||||
* @con_blank: blank/unblank the console. The target mode is passed in @blank.
|
||||
* @mode_switch is set if changing from/to text/graphics. The hook
|
||||
* is supposed to return true if a redraw is needed.
|
||||
* @con_font_set: set console @vc font to @font with height @vpitch. @flags can
|
||||
* be %KD_FONT_FLAG_DONT_RECALC. (optional)
|
||||
* @con_font_get: fetch the current font on @vc of height @vpitch into @font.
|
||||
* (optional)
|
||||
* @con_font_default: set default font on @vc. @name can be %NULL or font name
|
||||
* to search for. @font can be filled back. (optional)
|
||||
* @con_resize: resize the @vc console to @width x @height. @from_user is true
|
||||
* when this change comes from the user space.
|
||||
* @con_set_palette: sets the palette of the console @vc to @table (optional)
|
||||
* @con_scrolldelta: the contents of the console should be scrolled by @lines.
|
||||
* Invoked by user. (optional)
|
||||
* @con_set_origin: set origin (see &vc_data::vc_origin) of the @vc. If not
|
||||
* provided or returns false, the origin is set to
|
||||
* @vc->vc_screenbuf. (optional)
|
||||
* @con_save_screen: save screen content into @vc->vc_screenbuf. Called e.g.
|
||||
* upon entering graphics. (optional)
|
||||
* @con_build_attr: build attributes based on @color, @intensity and other
|
||||
* parameters. The result is used for both normal and erase
|
||||
* characters. (optional)
|
||||
* @con_invert_region: invert a region of length @count on @vc starting at @p.
|
||||
* (optional)
|
||||
* @con_debug_enter: prepare the console for the debugger. This includes, but
|
||||
* is not limited to, unblanking the console, loading an
|
||||
* appropriate palette, and allowing debugger generated output.
|
||||
* (optional)
|
||||
* @con_debug_leave: restore the console to its pre-debug state as closely as
|
||||
* possible. (optional)
|
||||
*/
|
||||
struct consw {
|
||||
struct module *owner;
|
||||
const char *(*con_startup)(void);
|
||||
void (*con_init)(struct vc_data *vc, int init);
|
||||
void (*con_init)(struct vc_data *vc, bool init);
|
||||
void (*con_deinit)(struct vc_data *vc);
|
||||
void (*con_clear)(struct vc_data *vc, int sy, int sx, int height,
|
||||
int width);
|
||||
void (*con_putc)(struct vc_data *vc, int c, int ypos, int xpos);
|
||||
void (*con_putcs)(struct vc_data *vc, const unsigned short *s,
|
||||
int count, int ypos, int xpos);
|
||||
void (*con_cursor)(struct vc_data *vc, int mode);
|
||||
void (*con_clear)(struct vc_data *vc, unsigned int y,
|
||||
unsigned int x, unsigned int count);
|
||||
void (*con_putc)(struct vc_data *vc, u16 ca, unsigned int y,
|
||||
unsigned int x);
|
||||
void (*con_putcs)(struct vc_data *vc, const u16 *s,
|
||||
unsigned int count, unsigned int ypos,
|
||||
unsigned int xpos);
|
||||
void (*con_cursor)(struct vc_data *vc, bool enable);
|
||||
bool (*con_scroll)(struct vc_data *vc, unsigned int top,
|
||||
unsigned int bottom, enum con_scroll dir,
|
||||
unsigned int lines);
|
||||
int (*con_switch)(struct vc_data *vc);
|
||||
int (*con_blank)(struct vc_data *vc, int blank, int mode_switch);
|
||||
int (*con_font_set)(struct vc_data *vc, struct console_font *font,
|
||||
unsigned int vpitch, unsigned int flags);
|
||||
bool (*con_switch)(struct vc_data *vc);
|
||||
bool (*con_blank)(struct vc_data *vc, enum vesa_blank_mode blank,
|
||||
bool mode_switch);
|
||||
int (*con_font_set)(struct vc_data *vc,
|
||||
const struct console_font *font,
|
||||
unsigned int vpitch, unsigned int flags);
|
||||
int (*con_font_get)(struct vc_data *vc, struct console_font *font,
|
||||
unsigned int vpitch);
|
||||
int (*con_font_default)(struct vc_data *vc,
|
||||
struct console_font *font, char *name);
|
||||
struct console_font *font, const char *name);
|
||||
int (*con_resize)(struct vc_data *vc, unsigned int width,
|
||||
unsigned int height, unsigned int user);
|
||||
unsigned int height, bool from_user);
|
||||
void (*con_set_palette)(struct vc_data *vc,
|
||||
const unsigned char *table);
|
||||
void (*con_scrolldelta)(struct vc_data *vc, int lines);
|
||||
int (*con_set_origin)(struct vc_data *vc);
|
||||
bool (*con_set_origin)(struct vc_data *vc);
|
||||
void (*con_save_screen)(struct vc_data *vc);
|
||||
u8 (*con_build_attr)(struct vc_data *vc, u8 color,
|
||||
enum vc_intensity intensity,
|
||||
bool blink, bool underline, bool reverse, bool italic);
|
||||
void (*con_invert_region)(struct vc_data *vc, u16 *p, int count);
|
||||
u16 *(*con_screen_pos)(const struct vc_data *vc, int offset);
|
||||
unsigned long (*con_getxy)(struct vc_data *vc, unsigned long position,
|
||||
int *px, int *py);
|
||||
/*
|
||||
* Flush the video console driver's scrollback buffer
|
||||
*/
|
||||
void (*con_flush_scrollback)(struct vc_data *vc);
|
||||
/*
|
||||
* Prepare the console for the debugger. This includes, but is not
|
||||
* limited to, unblanking the console, loading an appropriate
|
||||
* palette, and allowing debugger generated output.
|
||||
*/
|
||||
int (*con_debug_enter)(struct vc_data *vc);
|
||||
/*
|
||||
* Restore the console to its pre-debug state as closely as possible.
|
||||
*/
|
||||
int (*con_debug_leave)(struct vc_data *vc);
|
||||
void (*con_debug_enter)(struct vc_data *vc);
|
||||
void (*con_debug_leave)(struct vc_data *vc);
|
||||
};
|
||||
|
||||
extern const struct consw *conswitchp;
|
||||
@@ -112,32 +141,21 @@ int con_is_bound(const struct consw *csw);
|
||||
int do_unregister_con_driver(const struct consw *csw);
|
||||
int do_take_over_console(const struct consw *sw, int first, int last, int deflt);
|
||||
void give_up_console(const struct consw *sw);
|
||||
#ifdef CONFIG_HW_CONSOLE
|
||||
int con_debug_enter(struct vc_data *vc);
|
||||
int con_debug_leave(void);
|
||||
#ifdef CONFIG_VT
|
||||
void con_debug_enter(struct vc_data *vc);
|
||||
void con_debug_leave(void);
|
||||
#else
|
||||
static inline int con_debug_enter(struct vc_data *vc)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int con_debug_leave(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void con_debug_enter(struct vc_data *vc) { }
|
||||
static inline void con_debug_leave(void) { }
|
||||
#endif
|
||||
|
||||
/* cursor */
|
||||
#define CM_DRAW (1)
|
||||
#define CM_ERASE (2)
|
||||
#define CM_MOVE (3)
|
||||
|
||||
/*
|
||||
* The interface for a console, or any other device that wants to capture
|
||||
* console messages (printer driver?)
|
||||
*/
|
||||
|
||||
/**
|
||||
* cons_flags - General console flags
|
||||
* enum cons_flags - General console flags
|
||||
* @CON_PRINTBUFFER: Used by newly registered consoles to avoid duplicate
|
||||
* output of messages that were already shown by boot
|
||||
* consoles or read by userspace via syslog() syscall.
|
||||
@@ -218,7 +236,7 @@ struct nbcon_state {
|
||||
static_assert(sizeof(struct nbcon_state) <= sizeof(int));
|
||||
|
||||
/**
|
||||
* nbcon_prio - console owner priority for nbcon consoles
|
||||
* enum nbcon_prio - console owner priority for nbcon consoles
|
||||
* @NBCON_PRIO_NONE: Unused
|
||||
* @NBCON_PRIO_NORMAL: Normal (non-emergency) usage
|
||||
* @NBCON_PRIO_EMERGENCY: Emergency output (WARN/OOPS...)
|
||||
@@ -450,7 +468,7 @@ static inline bool console_is_registered(const struct console *con)
|
||||
* for_each_console() - Iterator over registered consoles
|
||||
* @con: struct console pointer used as loop cursor
|
||||
*
|
||||
* The console list and the console->flags are immutable while iterating.
|
||||
* The console list and the &console.flags are immutable while iterating.
|
||||
*
|
||||
* Requires console_list_lock to be held.
|
||||
*/
|
||||
@@ -520,12 +538,6 @@ void vcs_remove_sysfs(int index);
|
||||
*/
|
||||
extern atomic_t ignore_console_lock_warning;
|
||||
|
||||
/* VESA Blanking Levels */
|
||||
#define VESA_NO_BLANKING 0
|
||||
#define VESA_VSYNC_SUSPEND 1
|
||||
#define VESA_HSYNC_SUSPEND 2
|
||||
#define VESA_POWERDOWN 3
|
||||
|
||||
extern void console_init(void);
|
||||
|
||||
/* For deferred console takeover */
|
||||
|
||||
@@ -151,7 +151,6 @@ struct vc_data {
|
||||
DECLARE_BITMAP(vc_tab_stop, VC_TABSTOPS_COUNT); /* Tab stops. 256 columns. */
|
||||
unsigned char vc_palette[16*3]; /* Colour palette for VGA+ */
|
||||
unsigned short * vc_translate;
|
||||
unsigned int vc_resize_user; /* resize request from user */
|
||||
unsigned int vc_bell_pitch; /* Console bell pitch */
|
||||
unsigned int vc_bell_duration; /* Console bell duration */
|
||||
unsigned short vc_cur_blink_ms; /* Cursor blink duration */
|
||||
|
||||
@@ -14,17 +14,16 @@
|
||||
struct tty_struct;
|
||||
struct vc_data;
|
||||
|
||||
extern void clear_selection(void);
|
||||
extern int set_selection_user(const struct tiocl_selection __user *sel,
|
||||
struct tty_struct *tty);
|
||||
extern int set_selection_kernel(struct tiocl_selection *v,
|
||||
struct tty_struct *tty);
|
||||
extern int paste_selection(struct tty_struct *tty);
|
||||
extern int sel_loadlut(char __user *p);
|
||||
extern int mouse_reporting(void);
|
||||
extern void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry);
|
||||
void clear_selection(void);
|
||||
int set_selection_user(const struct tiocl_selection __user *sel,
|
||||
struct tty_struct *tty);
|
||||
int set_selection_kernel(struct tiocl_selection *v, struct tty_struct *tty);
|
||||
int paste_selection(struct tty_struct *tty);
|
||||
int sel_loadlut(u32 __user *lut);
|
||||
int mouse_reporting(void);
|
||||
void mouse_report(struct tty_struct *tty, int butt, int mrx, int mry);
|
||||
|
||||
bool vc_is_sel(struct vc_data *vc);
|
||||
bool vc_is_sel(const struct vc_data *vc);
|
||||
|
||||
extern int console_blanked;
|
||||
|
||||
@@ -33,24 +32,21 @@ extern unsigned char default_red[];
|
||||
extern unsigned char default_grn[];
|
||||
extern unsigned char default_blu[];
|
||||
|
||||
extern unsigned short *screen_pos(const struct vc_data *vc, int w_offset,
|
||||
bool viewed);
|
||||
extern u16 screen_glyph(const struct vc_data *vc, int offset);
|
||||
extern u32 screen_glyph_unicode(const struct vc_data *vc, int offset);
|
||||
extern void complement_pos(struct vc_data *vc, int offset);
|
||||
extern void invert_screen(struct vc_data *vc, int offset, int count, bool viewed);
|
||||
unsigned short *screen_pos(const struct vc_data *vc, int w_offset, bool viewed);
|
||||
u16 screen_glyph(const struct vc_data *vc, int offset);
|
||||
u32 screen_glyph_unicode(const struct vc_data *vc, int offset);
|
||||
void complement_pos(struct vc_data *vc, int offset);
|
||||
void invert_screen(struct vc_data *vc, int offset, int count, bool viewed);
|
||||
|
||||
extern void getconsxy(const struct vc_data *vc, unsigned char xy[static 2]);
|
||||
extern void putconsxy(struct vc_data *vc, unsigned char xy[static const 2]);
|
||||
void getconsxy(const struct vc_data *vc, unsigned char xy[static 2]);
|
||||
void putconsxy(struct vc_data *vc, unsigned char xy[static const 2]);
|
||||
|
||||
extern u16 vcs_scr_readw(const struct vc_data *vc, const u16 *org);
|
||||
extern void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org);
|
||||
extern void vcs_scr_updated(struct vc_data *vc);
|
||||
u16 vcs_scr_readw(const struct vc_data *vc, const u16 *org);
|
||||
void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org);
|
||||
void vcs_scr_updated(struct vc_data *vc);
|
||||
|
||||
extern int vc_uniscr_check(struct vc_data *vc);
|
||||
extern void vc_uniscr_copy_line(const struct vc_data *vc, void *dest,
|
||||
bool viewed,
|
||||
unsigned int row, unsigned int col,
|
||||
unsigned int nr);
|
||||
int vc_uniscr_check(struct vc_data *vc);
|
||||
void vc_uniscr_copy_line(const struct vc_data *vc, void *dest, bool viewed,
|
||||
unsigned int row, unsigned int col, unsigned int nr);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -27,7 +27,7 @@ struct serdev_device;
|
||||
* not sleep.
|
||||
*/
|
||||
struct serdev_device_ops {
|
||||
ssize_t (*receive_buf)(struct serdev_device *, const u8 *, size_t);
|
||||
size_t (*receive_buf)(struct serdev_device *, const u8 *, size_t);
|
||||
void (*write_wakeup)(struct serdev_device *);
|
||||
};
|
||||
|
||||
@@ -185,9 +185,9 @@ static inline void serdev_controller_write_wakeup(struct serdev_controller *ctrl
|
||||
serdev->ops->write_wakeup(serdev);
|
||||
}
|
||||
|
||||
static inline ssize_t serdev_controller_receive_buf(struct serdev_controller *ctrl,
|
||||
const u8 *data,
|
||||
size_t count)
|
||||
static inline size_t serdev_controller_receive_buf(struct serdev_controller *ctrl,
|
||||
const u8 *data,
|
||||
size_t count)
|
||||
{
|
||||
struct serdev_device *serdev = ctrl->serdev;
|
||||
|
||||
|
||||
@@ -210,6 +210,12 @@ int serial8250_console_exit(struct uart_port *port);
|
||||
void serial8250_set_isa_configurator(void (*v)(int port, struct uart_port *up,
|
||||
u32 *capabilities));
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
||||
extern int hp300_setup_serial_console(void) __init;
|
||||
#else
|
||||
static inline int hp300_setup_serial_console(void) { return 0; }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_RT288X
|
||||
int rt288x_setup(struct uart_port *p);
|
||||
int au_platform_setup(struct plat_serial8250_port *p);
|
||||
|
||||
@@ -467,9 +467,10 @@ struct uart_port {
|
||||
unsigned int fifosize; /* tx fifo size */
|
||||
unsigned char x_char; /* xon/xoff char */
|
||||
unsigned char regshift; /* reg offset shift */
|
||||
unsigned char iotype; /* io access style */
|
||||
unsigned char quirks; /* internal quirks */
|
||||
|
||||
unsigned char iotype; /* io access style */
|
||||
|
||||
#define UPIO_UNKNOWN ((unsigned char)~0U) /* UCHAR_MAX */
|
||||
#define UPIO_PORT (SERIAL_IO_PORT) /* 8b I/O port access */
|
||||
#define UPIO_HUB6 (SERIAL_IO_HUB6) /* Hub6 ISA card */
|
||||
#define UPIO_MEM (SERIAL_IO_MEM) /* driver-specific */
|
||||
@@ -479,7 +480,9 @@ struct uart_port {
|
||||
#define UPIO_MEM32BE (SERIAL_IO_MEM32BE) /* 32b big endian */
|
||||
#define UPIO_MEM16 (SERIAL_IO_MEM16) /* 16b little endian */
|
||||
|
||||
/* quirks must be updated while holding port mutex */
|
||||
unsigned char quirks; /* internal quirks */
|
||||
|
||||
/* internal quirks must be updated while holding port mutex */
|
||||
#define UPQ_NO_TXEN_TEST BIT(0)
|
||||
|
||||
unsigned int read_status_mask; /* driver specific */
|
||||
@@ -786,7 +789,8 @@ enum UART_TX_FLAGS {
|
||||
if (pending < WAKEUP_CHARS) { \
|
||||
uart_write_wakeup(__port); \
|
||||
\
|
||||
if (!((flags) & UART_TX_NOSTOP) && pending == 0) \
|
||||
if (!((flags) & UART_TX_NOSTOP) && pending == 0 && \
|
||||
__port->ops->tx_empty(__port)) \
|
||||
__port->ops->stop_tx(__port); \
|
||||
} \
|
||||
\
|
||||
@@ -959,6 +963,8 @@ int uart_register_driver(struct uart_driver *uart);
|
||||
void uart_unregister_driver(struct uart_driver *uart);
|
||||
int uart_add_one_port(struct uart_driver *reg, struct uart_port *port);
|
||||
void uart_remove_one_port(struct uart_driver *reg, struct uart_port *port);
|
||||
int uart_read_port_properties(struct uart_port *port);
|
||||
int uart_read_and_validate_port_properties(struct uart_port *port);
|
||||
bool uart_match_port(const struct uart_port *port1,
|
||||
const struct uart_port *port2);
|
||||
|
||||
|
||||
@@ -178,6 +178,7 @@ struct geni_se {
|
||||
#define M_GP_IRQ_3_EN BIT(12)
|
||||
#define M_GP_IRQ_4_EN BIT(13)
|
||||
#define M_GP_IRQ_5_EN BIT(14)
|
||||
#define M_TX_FIFO_NOT_EMPTY_EN BIT(21)
|
||||
#define M_IO_DATA_DEASSERT_EN BIT(22)
|
||||
#define M_IO_DATA_ASSERT_EN BIT(23)
|
||||
#define M_RX_FIFO_RD_ERR_EN BIT(24)
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#include <linux/major.h>
|
||||
#include <linux/termios.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/tty_buffer.h>
|
||||
#include <linux/tty_driver.h>
|
||||
#include <linux/tty_ldisc.h>
|
||||
#include <linux/tty_port.h>
|
||||
|
||||
@@ -25,7 +25,8 @@ extern int fg_console, last_console, want_console;
|
||||
|
||||
int vc_allocate(unsigned int console);
|
||||
int vc_cons_allocated(unsigned int console);
|
||||
int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines);
|
||||
int __vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines,
|
||||
bool from_user);
|
||||
struct vc_data *vc_deallocate(unsigned int console);
|
||||
void reset_palette(struct vc_data *vc);
|
||||
void do_blank_screen(int entering_gfx);
|
||||
@@ -42,6 +43,12 @@ void redraw_screen(struct vc_data *vc, int is_switch);
|
||||
#define update_screen(x) redraw_screen(x, 0)
|
||||
#define switch_screen(x) redraw_screen(x, 1)
|
||||
|
||||
static inline int vc_resize(struct vc_data *vc, unsigned int cols,
|
||||
unsigned int lines)
|
||||
{
|
||||
return __vc_resize(vc, cols, lines, false);
|
||||
}
|
||||
|
||||
struct tty_struct;
|
||||
int tioclinux(struct tty_struct *tty, unsigned long arg);
|
||||
|
||||
@@ -168,7 +175,4 @@ void vt_set_led_state(unsigned int console, int leds);
|
||||
void vt_kbd_con_start(unsigned int console);
|
||||
void vt_kbd_con_stop(unsigned int console);
|
||||
|
||||
void vc_scrolldelta_helper(struct vc_data *c, int lines,
|
||||
unsigned int rolled_over, void *_base, unsigned int size);
|
||||
|
||||
#endif /* _VT_KERN_H */
|
||||
|
||||
Reference in New Issue
Block a user