Merge tag 'tty-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull TTY changes from Greg Kroah-Hartman: "As we skipped the merge window for 3.6-rc1 for the tty tree, everything is now settled down and working properly, so we are ready for 3.7-rc1. Here's the patchset, it's big, but the large changes are removing a firmware file and adding a staging tty driver (it depended on the tty core changes, so it's going through this tree instead of the staging tree.) All of these patches have been in the linux-next tree for a while. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>" Fix up more-or-less trivial conflicts in - drivers/char/pcmcia/synclink_cs.c: tty NULL dereference fix vs tty_port_cts_enabled() helper function - drivers/staging/{Kconfig,Makefile}: add-add conflict (dgrp driver added close to other staging drivers) - drivers/staging/ipack/devices/ipoctal.c: "split ipoctal_channel from iopctal" vs "TTY: use tty_port_register_device" * tag 'tty-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (235 commits) tty/serial: Add kgdb_nmi driver tty/serial/amba-pl011: Quiesce interrupts in poll_get_char tty/serial/amba-pl011: Implement poll_init callback tty/serial/core: Introduce poll_init callback kdb: Turn KGDB_KDB=n stubs into static inlines kdb: Implement disable_nmi command kernel/debug: Mask KGDB NMI upon entry serial: pl011: handle corruption at high clock speeds serial: sccnxp: Make 'default' choice in switch last serial: sccnxp: Remove mask termios caps for SW flow control serial: sccnxp: Report actual baudrate back to core serial: samsung: Add poll_get_char & poll_put_char Powerpc 8xx CPM_UART setting MAXIDL register proportionaly to baud rate Powerpc 8xx CPM_UART maxidl should not depend on fifo size Powerpc 8xx CPM_UART too many interrupts Powerpc 8xx CPM_UART desynchronisation serial: set correct baud_base for EXSYS EX-41092 Dual 16950 serial: omap: fix the reciever line error case 8250: blacklist Winbond CIR port 8250_pnp: do pnp probe before legacy probe ...
This commit is contained in:
@@ -716,10 +716,17 @@ static int raw3215_probe (struct ccw_device *cdev)
|
||||
static void raw3215_remove (struct ccw_device *cdev)
|
||||
{
|
||||
struct raw3215_info *raw;
|
||||
unsigned int line;
|
||||
|
||||
ccw_device_set_offline(cdev);
|
||||
raw = dev_get_drvdata(&cdev->dev);
|
||||
if (raw) {
|
||||
spin_lock(&raw3215_device_lock);
|
||||
for (line = 0; line < NR_3215; line++)
|
||||
if (raw3215[line] == raw)
|
||||
break;
|
||||
raw3215[line] = NULL;
|
||||
spin_unlock(&raw3215_device_lock);
|
||||
dev_set_drvdata(&cdev->dev, NULL);
|
||||
raw3215_free_info(raw);
|
||||
}
|
||||
@@ -935,6 +942,19 @@ static int __init con3215_init(void)
|
||||
console_initcall(con3215_init);
|
||||
#endif
|
||||
|
||||
static int tty3215_install(struct tty_driver *driver, struct tty_struct *tty)
|
||||
{
|
||||
struct raw3215_info *raw;
|
||||
|
||||
raw = raw3215[tty->index];
|
||||
if (raw == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
tty->driver_data = raw;
|
||||
|
||||
return tty_port_install(&raw->port, driver, tty);
|
||||
}
|
||||
|
||||
/*
|
||||
* tty3215_open
|
||||
*
|
||||
@@ -942,14 +962,9 @@ console_initcall(con3215_init);
|
||||
*/
|
||||
static int tty3215_open(struct tty_struct *tty, struct file * filp)
|
||||
{
|
||||
struct raw3215_info *raw;
|
||||
struct raw3215_info *raw = tty->driver_data;
|
||||
int retval;
|
||||
|
||||
raw = raw3215[tty->index];
|
||||
if (raw == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
tty->driver_data = raw;
|
||||
tty_port_tty_set(&raw->port, tty);
|
||||
|
||||
tty->low_latency = 0; /* don't use bottom half for pushing chars */
|
||||
@@ -1110,6 +1125,7 @@ static void tty3215_start(struct tty_struct *tty)
|
||||
}
|
||||
|
||||
static const struct tty_operations tty3215_ops = {
|
||||
.install = tty3215_install,
|
||||
.open = tty3215_open,
|
||||
.close = tty3215_close,
|
||||
.write = tty3215_write,
|
||||
|
@@ -567,6 +567,7 @@ sclp_tty_init(void)
|
||||
driver->init_termios.c_lflag = ISIG | ECHO;
|
||||
driver->flags = TTY_DRIVER_REAL_RAW;
|
||||
tty_set_operations(driver, &sclp_ops);
|
||||
tty_port_link_device(&sclp_port, driver, 0);
|
||||
rc = tty_register_driver(driver);
|
||||
if (rc) {
|
||||
put_tty_driver(driver);
|
||||
|
@@ -691,6 +691,7 @@ static int __init sclp_vt220_tty_init(void)
|
||||
driver->init_termios = tty_std_termios;
|
||||
driver->flags = TTY_DRIVER_REAL_RAW;
|
||||
tty_set_operations(driver, &sclp_vt220_ops);
|
||||
tty_port_link_device(&sclp_vt220_port, driver, 0);
|
||||
|
||||
rc = tty_register_driver(driver);
|
||||
if (rc)
|
||||
|
@@ -842,17 +842,14 @@ static struct raw3270_fn tty3270_fn = {
|
||||
};
|
||||
|
||||
/*
|
||||
* This routine is called whenever a 3270 tty is opened.
|
||||
* This routine is called whenever a 3270 tty is opened first time.
|
||||
*/
|
||||
static int
|
||||
tty3270_open(struct tty_struct *tty, struct file * filp)
|
||||
static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
|
||||
{
|
||||
struct raw3270_view *view;
|
||||
struct tty3270 *tp;
|
||||
int i, rc;
|
||||
|
||||
if (tty->count > 1)
|
||||
return 0;
|
||||
/* Check if the tty3270 is already there. */
|
||||
view = raw3270_find_view(&tty3270_fn,
|
||||
tty->index + RAW3270_FIRSTMINOR);
|
||||
@@ -865,7 +862,7 @@ tty3270_open(struct tty_struct *tty, struct file * filp)
|
||||
/* why to reassign? */
|
||||
tty_port_tty_set(&tp->port, tty);
|
||||
tp->inattr = TF_INPUT;
|
||||
return 0;
|
||||
return tty_port_install(&tp->port, driver, tty);
|
||||
}
|
||||
if (tty3270_max_index < tty->index + 1)
|
||||
tty3270_max_index = tty->index + 1;
|
||||
@@ -895,7 +892,6 @@ tty3270_open(struct tty_struct *tty, struct file * filp)
|
||||
|
||||
tty_port_tty_set(&tp->port, tty);
|
||||
tty->low_latency = 0;
|
||||
tty->driver_data = tp;
|
||||
tty->winsize.ws_row = tp->view.rows - 2;
|
||||
tty->winsize.ws_col = tp->view.cols;
|
||||
|
||||
@@ -915,6 +911,15 @@ tty3270_open(struct tty_struct *tty, struct file * filp)
|
||||
kbd_ascebc(tp->kbd, tp->view.ascebc);
|
||||
|
||||
raw3270_activate_view(&tp->view);
|
||||
|
||||
rc = tty_port_install(&tp->port, driver, tty);
|
||||
if (rc) {
|
||||
raw3270_put_view(&tp->view);
|
||||
return rc;
|
||||
}
|
||||
|
||||
tty->driver_data = tp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -932,10 +937,17 @@ tty3270_close(struct tty_struct *tty, struct file * filp)
|
||||
if (tp) {
|
||||
tty->driver_data = NULL;
|
||||
tty_port_tty_set(&tp->port, NULL);
|
||||
raw3270_put_view(&tp->view);
|
||||
}
|
||||
}
|
||||
|
||||
static void tty3270_cleanup(struct tty_struct *tty)
|
||||
{
|
||||
struct tty3270 *tp = tty->driver_data;
|
||||
|
||||
if (tp)
|
||||
raw3270_put_view(&tp->view);
|
||||
}
|
||||
|
||||
/*
|
||||
* We always have room.
|
||||
*/
|
||||
@@ -1737,7 +1749,8 @@ static long tty3270_compat_ioctl(struct tty_struct *tty,
|
||||
#endif
|
||||
|
||||
static const struct tty_operations tty3270_ops = {
|
||||
.open = tty3270_open,
|
||||
.install = tty3270_install,
|
||||
.cleanup = tty3270_cleanup,
|
||||
.close = tty3270_close,
|
||||
.write = tty3270_write,
|
||||
.put_char = tty3270_put_char,
|
||||
@@ -1781,7 +1794,7 @@ static int __init tty3270_init(void)
|
||||
driver->type = TTY_DRIVER_TYPE_SYSTEM;
|
||||
driver->subtype = SYSTEM_TYPE_TTY;
|
||||
driver->init_termios = tty_std_termios;
|
||||
driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_DYNAMIC_DEV;
|
||||
driver->flags = TTY_DRIVER_RESET_TERMIOS;
|
||||
tty_set_operations(driver, &tty3270_ops);
|
||||
ret = tty_register_driver(driver);
|
||||
if (ret) {
|
||||
@@ -1800,6 +1813,7 @@ tty3270_exit(void)
|
||||
driver = tty3270_driver;
|
||||
tty3270_driver = NULL;
|
||||
tty_unregister_driver(driver);
|
||||
put_tty_driver(driver);
|
||||
tty3270_del_views();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user