mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 08:31:13 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: (79 commits) USB serial: update the console driver usb-serial: straighten out serial_open usb-serial: add missing tests and debug lines usb-serial: rename subroutines usb-serial: fix termios initialization logic usb-serial: acquire references when a new tty is installed usb-serial: change logic of serial lookups usb-serial: put subroutines in logical order usb-serial: change referencing of port and serial structures tty: Char: mxser, use THRE for ASPP_OQUEUE ioctl tty: Char: mxser, add support for CP112UL uartlite: support shared interrupt lines tty: USB: serial/mct_u232, fix tty refcnt tty: riscom8, fix tty refcnt tty: riscom8, fix shutdown declaration TTY: fix typos tty: Power: fix suspend vt regression tty: vt: use printk_once tty: handle VT specific compat ioctls in vt driver n_tty: move echoctl check and clean up logic ...
This commit is contained in:
commit
e11c675ede
118 changed files with 2578 additions and 3576 deletions
|
@ -499,6 +499,7 @@ struct cyclades_card {
|
|||
void __iomem *p9050;
|
||||
struct RUNTIME_9060 __iomem *p9060;
|
||||
} ctl_addr;
|
||||
struct BOARD_CTRL __iomem *board_ctrl; /* cyz specific */
|
||||
int irq;
|
||||
unsigned int num_chips; /* 0 if card absent, -1 if Z/PCI, else Y */
|
||||
unsigned int first_line; /* minor number of first channel on card */
|
||||
|
@ -541,6 +542,15 @@ struct cyclades_port {
|
|||
int magic;
|
||||
struct tty_port port;
|
||||
struct cyclades_card *card;
|
||||
union {
|
||||
struct {
|
||||
void __iomem *base_addr;
|
||||
} cyy;
|
||||
struct {
|
||||
struct CH_CTRL __iomem *ch_ctrl;
|
||||
struct BUF_CTRL __iomem *buf_ctrl;
|
||||
} cyz;
|
||||
} u;
|
||||
int line;
|
||||
int flags; /* defined in tty.h */
|
||||
int type; /* UART type */
|
||||
|
@ -568,7 +578,6 @@ struct cyclades_port {
|
|||
struct cyclades_idle_stats idle_stats;
|
||||
struct cyclades_icount icount;
|
||||
struct completion shutdown_wait;
|
||||
wait_queue_head_t delta_msr_wait;
|
||||
int throttle;
|
||||
};
|
||||
|
||||
|
|
|
@ -96,7 +96,6 @@ struct esp_struct {
|
|||
int xmit_head;
|
||||
int xmit_tail;
|
||||
int xmit_cnt;
|
||||
wait_queue_head_t delta_msr_wait;
|
||||
wait_queue_head_t break_wait;
|
||||
struct async_icount icount; /* kernel counters for the 4 input interrupts */
|
||||
struct hayes_esp_config config; /* port configuration */
|
||||
|
|
|
@ -38,7 +38,7 @@ extern struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask,
|
|||
spinlock_t *lock);
|
||||
extern void kfifo_free(struct kfifo *fifo);
|
||||
extern unsigned int __kfifo_put(struct kfifo *fifo,
|
||||
unsigned char *buffer, unsigned int len);
|
||||
const unsigned char *buffer, unsigned int len);
|
||||
extern unsigned int __kfifo_get(struct kfifo *fifo,
|
||||
unsigned char *buffer, unsigned int len);
|
||||
|
||||
|
@ -77,7 +77,7 @@ static inline void kfifo_reset(struct kfifo *fifo)
|
|||
* bytes copied.
|
||||
*/
|
||||
static inline unsigned int kfifo_put(struct kfifo *fifo,
|
||||
unsigned char *buffer, unsigned int len)
|
||||
const unsigned char *buffer, unsigned int len)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int ret;
|
||||
|
|
|
@ -122,6 +122,7 @@ struct serial_uart_config {
|
|||
|
||||
/* Internal flags used only by kernel */
|
||||
#define ASYNCB_INITIALIZED 31 /* Serial port was initialized */
|
||||
#define ASYNCB_SUSPENDED 30 /* Serial port is suspended */
|
||||
#define ASYNCB_NORMAL_ACTIVE 29 /* Normal device is active */
|
||||
#define ASYNCB_BOOT_AUTOCONF 28 /* Autoconfigure port on bootup */
|
||||
#define ASYNCB_CLOSING 27 /* Serial port is closing */
|
||||
|
@ -133,6 +134,7 @@ struct serial_uart_config {
|
|||
#define ASYNCB_FIRST_KERNEL 22
|
||||
|
||||
#define ASYNC_HUP_NOTIFY (1U << ASYNCB_HUP_NOTIFY)
|
||||
#define ASYNC_SUSPENDED (1U << ASYNCB_SUSPENDED)
|
||||
#define ASYNC_FOURPORT (1U << ASYNCB_FOURPORT)
|
||||
#define ASYNC_SAK (1U << ASYNCB_SAK)
|
||||
#define ASYNC_SPLIT_TERMIOS (1U << ASYNCB_SPLIT_TERMIOS)
|
||||
|
|
|
@ -22,6 +22,7 @@ struct plat_serial8250_port {
|
|||
void __iomem *membase; /* ioremap cookie or NULL */
|
||||
resource_size_t mapbase; /* resource base */
|
||||
unsigned int irq; /* interrupt number */
|
||||
unsigned long irqflags; /* request_irq flags */
|
||||
unsigned int uartclk; /* UART clock rate */
|
||||
void *private_data;
|
||||
unsigned char regshift; /* register shift */
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#ifndef LINUX_SERIAL_CORE_H
|
||||
#define LINUX_SERIAL_CORE_H
|
||||
|
||||
#include <linux/serial.h>
|
||||
|
||||
/*
|
||||
* The type definitions. These are from Ted Ts'o's serial.h
|
||||
*/
|
||||
|
@ -186,7 +188,6 @@
|
|||
#include <linux/sysrq.h>
|
||||
|
||||
struct uart_port;
|
||||
struct uart_info;
|
||||
struct serial_struct;
|
||||
struct device;
|
||||
|
||||
|
@ -265,6 +266,7 @@ struct uart_port {
|
|||
unsigned int (*serial_in)(struct uart_port *, int);
|
||||
void (*serial_out)(struct uart_port *, int, int);
|
||||
unsigned int irq; /* irq number */
|
||||
unsigned long irqflags; /* irq flags */
|
||||
unsigned int uartclk; /* base uart clock */
|
||||
unsigned int fifosize; /* tx fifo size */
|
||||
unsigned char x_char; /* xon/xoff char */
|
||||
|
@ -283,7 +285,7 @@ struct uart_port {
|
|||
|
||||
unsigned int read_status_mask; /* driver specific */
|
||||
unsigned int ignore_status_mask; /* driver specific */
|
||||
struct uart_info *info; /* pointer to parent info */
|
||||
struct uart_state *state; /* pointer to parent state */
|
||||
struct uart_icount icount; /* statistics */
|
||||
|
||||
struct console *cons; /* struct console, if any */
|
||||
|
@ -334,53 +336,17 @@ struct uart_port {
|
|||
void *private_data; /* generic platform data pointer */
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the state information which is only valid when the port
|
||||
* is open; it may be cleared the core driver once the device has
|
||||
* been closed. Either the low level driver or the core can modify
|
||||
* stuff here.
|
||||
*/
|
||||
typedef unsigned int __bitwise__ uif_t;
|
||||
|
||||
struct uart_info {
|
||||
struct tty_port port;
|
||||
struct circ_buf xmit;
|
||||
uif_t flags;
|
||||
|
||||
/*
|
||||
* Definitions for info->flags. These are _private_ to serial_core, and
|
||||
* are specific to this structure. They may be queried by low level drivers.
|
||||
*
|
||||
* FIXME: use the ASY_ definitions
|
||||
*/
|
||||
#define UIF_CHECK_CD ((__force uif_t) (1 << 25))
|
||||
#define UIF_CTS_FLOW ((__force uif_t) (1 << 26))
|
||||
#define UIF_NORMAL_ACTIVE ((__force uif_t) (1 << 29))
|
||||
#define UIF_INITIALIZED ((__force uif_t) (1 << 31))
|
||||
#define UIF_SUSPENDED ((__force uif_t) (1 << 30))
|
||||
|
||||
struct tasklet_struct tlet;
|
||||
wait_queue_head_t delta_msr_wait;
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the state information which is persistent across opens.
|
||||
* The low level driver must not to touch any elements contained
|
||||
* within.
|
||||
*/
|
||||
struct uart_state {
|
||||
unsigned int close_delay; /* msec */
|
||||
unsigned int closing_wait; /* msec */
|
||||
struct tty_port port;
|
||||
|
||||
#define USF_CLOSING_WAIT_INF (0)
|
||||
#define USF_CLOSING_WAIT_NONE (~0U)
|
||||
|
||||
int count;
|
||||
int pm_state;
|
||||
struct uart_info info;
|
||||
struct uart_port *port;
|
||||
struct circ_buf xmit;
|
||||
|
||||
struct mutex mutex;
|
||||
struct tasklet_struct tlet;
|
||||
struct uart_port *uart_port;
|
||||
};
|
||||
|
||||
#define UART_XMIT_SIZE PAGE_SIZE
|
||||
|
@ -461,7 +427,7 @@ int uart_resume_port(struct uart_driver *reg, struct uart_port *port);
|
|||
|
||||
static inline int uart_tx_stopped(struct uart_port *port)
|
||||
{
|
||||
struct tty_struct *tty = port->info->port.tty;
|
||||
struct tty_struct *tty = port->state->port.tty;
|
||||
if(tty->stopped || tty->hw_stopped)
|
||||
return 1;
|
||||
return 0;
|
||||
|
@ -476,7 +442,7 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
|
|||
#ifdef SUPPORT_SYSRQ
|
||||
if (port->sysrq) {
|
||||
if (ch && time_before(jiffies, port->sysrq)) {
|
||||
handle_sysrq(ch, port->info->port.tty);
|
||||
handle_sysrq(ch, port->state->port.tty);
|
||||
port->sysrq = 0;
|
||||
return 1;
|
||||
}
|
||||
|
@ -494,7 +460,7 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
|
|||
*/
|
||||
static inline int uart_handle_break(struct uart_port *port)
|
||||
{
|
||||
struct uart_info *info = port->info;
|
||||
struct uart_state *state = port->state;
|
||||
#ifdef SUPPORT_SYSRQ
|
||||
if (port->cons && port->cons->index == port->line) {
|
||||
if (!port->sysrq) {
|
||||
|
@ -505,7 +471,7 @@ static inline int uart_handle_break(struct uart_port *port)
|
|||
}
|
||||
#endif
|
||||
if (port->flags & UPF_SAK)
|
||||
do_SAK(info->port.tty);
|
||||
do_SAK(state->port.tty);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -515,22 +481,23 @@ static inline int uart_handle_break(struct uart_port *port)
|
|||
* @status: new carrier detect status, nonzero if active
|
||||
*/
|
||||
static inline void
|
||||
uart_handle_dcd_change(struct uart_port *port, unsigned int status)
|
||||
uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
|
||||
{
|
||||
struct uart_info *info = port->info;
|
||||
struct uart_state *state = uport->state;
|
||||
struct tty_port *port = &state->port;
|
||||
|
||||
port->icount.dcd++;
|
||||
uport->icount.dcd++;
|
||||
|
||||
#ifdef CONFIG_HARD_PPS
|
||||
if ((port->flags & UPF_HARDPPS_CD) && status)
|
||||
if ((uport->flags & UPF_HARDPPS_CD) && status)
|
||||
hardpps();
|
||||
#endif
|
||||
|
||||
if (info->flags & UIF_CHECK_CD) {
|
||||
if (port->flags & ASYNC_CHECK_CD) {
|
||||
if (status)
|
||||
wake_up_interruptible(&info->port.open_wait);
|
||||
else if (info->port.tty)
|
||||
tty_hangup(info->port.tty);
|
||||
wake_up_interruptible(&port->open_wait);
|
||||
else if (port->tty)
|
||||
tty_hangup(port->tty);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -540,24 +507,24 @@ uart_handle_dcd_change(struct uart_port *port, unsigned int status)
|
|||
* @status: new clear to send status, nonzero if active
|
||||
*/
|
||||
static inline void
|
||||
uart_handle_cts_change(struct uart_port *port, unsigned int status)
|
||||
uart_handle_cts_change(struct uart_port *uport, unsigned int status)
|
||||
{
|
||||
struct uart_info *info = port->info;
|
||||
struct tty_struct *tty = info->port.tty;
|
||||
struct tty_port *port = &uport->state->port;
|
||||
struct tty_struct *tty = port->tty;
|
||||
|
||||
port->icount.cts++;
|
||||
uport->icount.cts++;
|
||||
|
||||
if (info->flags & UIF_CTS_FLOW) {
|
||||
if (port->flags & ASYNC_CTS_FLOW) {
|
||||
if (tty->hw_stopped) {
|
||||
if (status) {
|
||||
tty->hw_stopped = 0;
|
||||
port->ops->start_tx(port);
|
||||
uart_write_wakeup(port);
|
||||
uport->ops->start_tx(uport);
|
||||
uart_write_wakeup(uport);
|
||||
}
|
||||
} else {
|
||||
if (!status) {
|
||||
tty->hw_stopped = 1;
|
||||
port->ops->stop_tx(port);
|
||||
uport->ops->stop_tx(uport);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -569,7 +536,7 @@ static inline void
|
|||
uart_insert_char(struct uart_port *port, unsigned int status,
|
||||
unsigned int overrun, unsigned int ch, unsigned int flag)
|
||||
{
|
||||
struct tty_struct *tty = port->info->port.tty;
|
||||
struct tty_struct *tty = port->state->port.tty;
|
||||
|
||||
if ((status & port->ignore_status_mask & ~overrun) == 0)
|
||||
tty_insert_flip_char(tty, ch, flag);
|
||||
|
|
|
@ -187,7 +187,12 @@ struct tty_port;
|
|||
struct tty_port_operations {
|
||||
/* Return 1 if the carrier is raised */
|
||||
int (*carrier_raised)(struct tty_port *port);
|
||||
/* Control the DTR line */
|
||||
void (*dtr_rts)(struct tty_port *port, int raise);
|
||||
/* Called when the last close completes or a hangup finishes
|
||||
IFF the port was initialized. Do not use to free resources */
|
||||
void (*shutdown)(struct tty_port *port);
|
||||
void (*drop)(struct tty_port *port);
|
||||
};
|
||||
|
||||
struct tty_port {
|
||||
|
@ -198,11 +203,12 @@ struct tty_port {
|
|||
int count; /* Usage count */
|
||||
wait_queue_head_t open_wait; /* Open waiters */
|
||||
wait_queue_head_t close_wait; /* Close waiters */
|
||||
wait_queue_head_t delta_msr_wait; /* Modem status change */
|
||||
unsigned long flags; /* TTY flags ASY_*/
|
||||
struct mutex mutex; /* Locking */
|
||||
unsigned char *xmit_buf; /* Optional buffer */
|
||||
int close_delay; /* Close port delay */
|
||||
int closing_wait; /* Delay for output */
|
||||
unsigned int close_delay; /* Close port delay */
|
||||
unsigned int closing_wait; /* Delay for output */
|
||||
int drain_delay; /* Set to zero if no pure time
|
||||
based drain is needed else
|
||||
set to size of fifo */
|
||||
|
@ -459,6 +465,12 @@ extern int tty_port_block_til_ready(struct tty_port *port,
|
|||
extern int tty_port_close_start(struct tty_port *port,
|
||||
struct tty_struct *tty, struct file *filp);
|
||||
extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty);
|
||||
extern void tty_port_close(struct tty_port *port,
|
||||
struct tty_struct *tty, struct file *filp);
|
||||
extern inline int tty_port_users(struct tty_port *port)
|
||||
{
|
||||
return port->count + port->blocked_open;
|
||||
}
|
||||
|
||||
extern int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc);
|
||||
extern int tty_unregister_ldisc(int disc);
|
||||
|
@ -524,5 +536,8 @@ extern int pcxe_open(struct tty_struct *tty, struct file *filp);
|
|||
extern int vt_ioctl(struct tty_struct *tty, struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
extern long vt_compat_ioctl(struct tty_struct *tty, struct file * file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif
|
||||
|
|
|
@ -238,9 +238,8 @@ struct usb_serial_driver {
|
|||
int (*resume)(struct usb_serial *serial);
|
||||
|
||||
/* serial function calls */
|
||||
/* Called by console with tty = NULL and by tty */
|
||||
int (*open)(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, struct file *filp);
|
||||
/* Called by console and by the tty layer */
|
||||
int (*open)(struct tty_struct *tty, struct usb_serial_port *port);
|
||||
void (*close)(struct usb_serial_port *port);
|
||||
int (*write)(struct tty_struct *tty, struct usb_serial_port *port,
|
||||
const unsigned char *buf, int count);
|
||||
|
@ -261,6 +260,9 @@ struct usb_serial_driver {
|
|||
be an attached tty at this point */
|
||||
void (*dtr_rts)(struct usb_serial_port *port, int on);
|
||||
int (*carrier_raised)(struct usb_serial_port *port);
|
||||
/* Called by the usb serial hooks to allow the user to rework the
|
||||
termios state */
|
||||
void (*init_termios)(struct tty_struct *tty);
|
||||
/* USB events */
|
||||
void (*read_int_callback)(struct urb *urb);
|
||||
void (*write_int_callback)(struct urb *urb);
|
||||
|
@ -300,7 +302,7 @@ static inline void usb_serial_console_disconnect(struct usb_serial *serial) {}
|
|||
extern struct usb_serial *usb_serial_get_by_index(unsigned int minor);
|
||||
extern void usb_serial_put(struct usb_serial *serial);
|
||||
extern int usb_serial_generic_open(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, struct file *filp);
|
||||
struct usb_serial_port *port);
|
||||
extern int usb_serial_generic_write(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, const unsigned char *buf, int count);
|
||||
extern void usb_serial_generic_close(struct usb_serial_port *port);
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
#ifndef _LINUX_VT_H
|
||||
#define _LINUX_VT_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
struct notifier_block;
|
||||
|
||||
struct vt_notifier_param {
|
||||
struct vc_data *vc; /* VC on which the update happened */
|
||||
unsigned int c; /* Printed char */
|
||||
};
|
||||
|
||||
extern int register_vt_notifier(struct notifier_block *nb);
|
||||
extern int unregister_vt_notifier(struct notifier_block *nb);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These constants are also useful for user-level apps (e.g., VC
|
||||
|
@ -74,4 +63,25 @@ struct vt_consize {
|
|||
#define VT_UNLOCKSWITCH 0x560C /* allow vt switching */
|
||||
#define VT_GETHIFONTMASK 0x560D /* return hi font mask */
|
||||
|
||||
struct vt_event {
|
||||
unsigned int event;
|
||||
#define VT_EVENT_SWITCH 0x0001 /* Console switch */
|
||||
#define VT_EVENT_BLANK 0x0002 /* Screen blank */
|
||||
#define VT_EVENT_UNBLANK 0x0004 /* Screen unblank */
|
||||
#define VT_EVENT_RESIZE 0x0008 /* Resize display */
|
||||
#define VT_MAX_EVENT 0x000F
|
||||
unsigned int old; /* Old console */
|
||||
unsigned int new; /* New console (if changing) */
|
||||
unsigned int pad[4]; /* Padding for expansion */
|
||||
};
|
||||
|
||||
#define VT_WAITEVENT 0x560E /* Wait for an event */
|
||||
|
||||
struct vt_setactivate {
|
||||
unsigned int console;
|
||||
struct vt_mode mode;
|
||||
};
|
||||
|
||||
#define VT_SETACTIVATE 0x560F /* Activate and set the mode of a console */
|
||||
|
||||
#endif /* _LINUX_VT_H */
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/console_struct.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/consolemap.h>
|
||||
#include <linux/notifier.h>
|
||||
|
||||
/*
|
||||
* Presently, a lot of graphics programs do not restore the contents of
|
||||
|
@ -91,7 +92,8 @@ int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc);
|
|||
#endif
|
||||
|
||||
/* vt.c */
|
||||
int vt_waitactive(int vt);
|
||||
void vt_event_post(unsigned int event, unsigned int old, unsigned int new);
|
||||
int vt_waitactive(int n);
|
||||
void change_console(struct vc_data *new_vc);
|
||||
void reset_vc(struct vc_data *vc);
|
||||
extern int unbind_con_driver(const struct consw *csw, int first, int last,
|
||||
|
@ -116,4 +118,16 @@ struct vt_spawn_console {
|
|||
};
|
||||
extern struct vt_spawn_console vt_spawn_con;
|
||||
|
||||
extern int vt_move_to_console(unsigned int vt, int alloc);
|
||||
|
||||
/* Interfaces for VC notification of character events (for accessibility etc) */
|
||||
|
||||
struct vt_notifier_param {
|
||||
struct vc_data *vc; /* VC on which the update happened */
|
||||
unsigned int c; /* Printed char */
|
||||
};
|
||||
|
||||
extern int register_vt_notifier(struct notifier_block *nb);
|
||||
extern int unregister_vt_notifier(struct notifier_block *nb);
|
||||
|
||||
#endif /* _VT_KERN_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue