summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@home.transmeta.com>2003-04-19 02:24:09 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2003-04-19 02:24:09 -0700
commit77ad1af84765f32bbda03e9c0040587ad7f952fa (patch)
treeb2ad9d66a984ef70ae7299be939aaf575866e71e
parente4a874f09dc496ed95829f679f5df6c9db6f037f (diff)
parent3bbb0896d422a2c5d5c6f8eb584e9bda3d3277a5 (diff)
Merge bk://bk.arm.linux.org.uk/linux-2.5-serial
into home.transmeta.com:/home/torvalds/v2.5/linux
-rw-r--r--drivers/char/tty_io.c57
-rw-r--r--drivers/net/irda/irtty-sir.c31
-rw-r--r--drivers/serial/68328serial.c3
-rw-r--r--drivers/serial/8250_pci.c7
-rw-r--r--drivers/serial/amba.c3
-rw-r--r--drivers/serial/anakin.c4
-rw-r--r--drivers/serial/clps711x.c3
-rw-r--r--drivers/serial/core.c70
-rw-r--r--drivers/serial/mcfserial.c3
-rw-r--r--drivers/serial/sa1100.c3
-rw-r--r--drivers/serial/uart00.c3
-rw-r--r--include/linux/tty_driver.h3
12 files changed, 117 insertions, 73 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index b5b29750dbf0..3f6589b8580a 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -1683,6 +1683,55 @@ static int send_break(struct tty_struct *tty, int duration)
return 0;
}
+static int
+tty_tiocmget(struct tty_struct *tty, struct file *file, unsigned long arg)
+{
+ int retval = -EINVAL;
+
+ if (tty->driver.tiocmget) {
+ retval = tty->driver.tiocmget(tty, file);
+
+ if (retval >= 0)
+ retval = put_user(retval, (int *)arg);
+ }
+ return retval;
+}
+
+static int
+tty_tiocmset(struct tty_struct *tty, struct file *file, unsigned int cmd,
+ unsigned long arg)
+{
+ int retval = -EINVAL;
+
+ if (tty->driver.tiocmset) {
+ unsigned int set, clear, val;
+
+ retval = get_user(val, (unsigned int *)arg);
+ if (retval)
+ return retval;
+
+ set = clear = 0;
+ switch (cmd) {
+ case TIOCMBIS:
+ set = val;
+ break;
+ case TIOCMBIC:
+ clear = val;
+ break;
+ case TIOCMSET:
+ set = val;
+ clear = ~val;
+ break;
+ }
+
+ set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2;
+ clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2;
+
+ retval = tty->driver.tiocmset(tty, file, set, clear);
+ }
+ return retval;
+}
+
/*
* Split this up, as gcc can choke on it otherwise..
*/
@@ -1808,6 +1857,14 @@ int tty_ioctl(struct inode * inode, struct file * file,
return 0;
case TCSBRKP: /* support for POSIX tcsendbreak() */
return send_break(tty, arg ? arg*(HZ/10) : HZ/4);
+
+ case TIOCMGET:
+ return tty_tiocmget(tty, file, arg);
+
+ case TIOCMSET:
+ case TIOCMBIC:
+ case TIOCMBIS:
+ return tty_tiocmset(tty, file, cmd, arg);
}
if (tty->driver.ioctl) {
int retval = (tty->driver.ioctl)(tty, file, cmd, arg);
diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c
index 3049b0f6e74f..90cb66d944c3 100644
--- a/drivers/net/irda/irtty-sir.c
+++ b/drivers/net/irda/irtty-sir.c
@@ -180,32 +180,29 @@ static int irtty_change_speed(struct sir_dev *dev, unsigned speed)
static int irtty_set_dtr_rts(struct sir_dev *dev, int dtr, int rts)
{
struct sirtty_cb *priv = dev->priv;
- int arg = 0;
+ int set = 0;
+ int clear = 0;
ASSERT(priv != NULL, return -1;);
ASSERT(priv->magic == IRTTY_MAGIC, return -1;);
-#ifdef TIOCM_OUT2 /* Not defined for ARM */
- arg = TIOCM_OUT2;
-#endif
if (rts)
- arg |= TIOCM_RTS;
+ set |= TIOCM_RTS;
+ else
+ clear |= TIOCM_RTS;
if (dtr)
- arg |= TIOCM_DTR;
+ set |= TIOCM_DTR;
+ else
+ clear |= TIOCM_DTR;
/*
- * The ioctl() function, or actually set_modem_info() in serial.c
- * expects a pointer to the argument in user space. This is working
- * here because we are always called from the kIrDAd thread which
- * has set_fs(KERNEL_DS) permanently set. Therefore copy_from_user()
- * is happy with our arg-parameter being local here in kernel space.
+ * We can't use ioctl() because it expects a non-null file structure,
+ * and we don't have that here.
+ * This function is not yet defined for all tty driver, so
+ * let's be careful... Jean II
*/
-
- lock_kernel();
- if (priv->tty->driver.ioctl(priv->tty, NULL, TIOCMSET, (unsigned long) &arg)) {
- IRDA_DEBUG(2, "%s(), error doing ioctl!\n", __FUNCTION__);
- }
- unlock_kernel();
+ ASSERT(priv->tty->driver.tiocmset != NULL, return -1;);
+ priv->tty->driver.tiocmset(priv->tty, NULL, set, clear);
return 0;
}
diff --git a/drivers/serial/68328serial.c b/drivers/serial/68328serial.c
index f70685593230..38d65f576934 100644
--- a/drivers/serial/68328serial.c
+++ b/drivers/serial/68328serial.c
@@ -1691,9 +1691,10 @@ static struct console m68328_driver = {
};
-static void __init m68328_console_init(void)
+static int __init m68328_console_init(void)
{
register_console(&m68328_driver);
+ return 0;
}
console_initcall(m68328_console_init);
diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
index 1edb34bf9cf4..954a362b4f07 100644
--- a/drivers/serial/8250_pci.c
+++ b/drivers/serial/8250_pci.c
@@ -1809,13 +1809,6 @@ static struct pci_device_id serial_pci_tbl[] __devinitdata = {
pbn_b1_1_115200 },
/*
- * 3Com US Robotics 56k Voice Internal PCI model 5610
- */
- { PCI_VENDOR_ID_USR, 0x1008,
- PCI_ANY_ID, PCI_ANY_ID, 0, 0,
- pbn_b0_1_115200 },
-
- /*
* Titan Electronic cards
* The 400L and 800L have a custom setup quirk.
*/
diff --git a/drivers/serial/amba.c b/drivers/serial/amba.c
index f940985242aa..543861f31464 100644
--- a/drivers/serial/amba.c
+++ b/drivers/serial/amba.c
@@ -705,9 +705,10 @@ static struct console amba_console = {
.index = -1,
};
-static void __init ambauart_console_init(void)
+static int __init ambauart_console_init(void)
{
register_console(&amba_console);
+ return 0;
}
console_initcall(ambauart_console_init);
diff --git a/drivers/serial/anakin.c b/drivers/serial/anakin.c
index 479807ae14f2..392e8b8430b4 100644
--- a/drivers/serial/anakin.c
+++ b/drivers/serial/anakin.c
@@ -502,10 +502,10 @@ static struct console anakin_console = {
.index = -1,
};
-static void __init
-anakin_console_init(void)
+static int __init anakin_console_init(void)
{
register_console(&anakin_console);
+ return 0;
}
console_initcall(anakin_console_init);
diff --git a/drivers/serial/clps711x.c b/drivers/serial/clps711x.c
index eae5933561ba..4549d2831bbc 100644
--- a/drivers/serial/clps711x.c
+++ b/drivers/serial/clps711x.c
@@ -567,9 +567,10 @@ static struct console clps711x_console = {
.index = -1,
};
-static void __init clps711xuart_console_init(void)
+static int __init clps711xuart_console_init(void)
{
register_console(&clps711x_console);
+ return 0;
}
console_initcall(clps711xuart_console_init);
diff --git a/drivers/serial/core.c b/drivers/serial/core.c
index cd71c9e65fb0..b461093a13cc 100644
--- a/drivers/serial/core.c
+++ b/drivers/serial/core.c
@@ -873,45 +873,38 @@ static int uart_get_lsr_info(struct uart_state *state, unsigned int *value)
return put_user(result, value);
}
-static int uart_get_modem_info(struct uart_port *port, unsigned int *value)
+static int uart_tiocmget(struct tty_struct *tty, struct file *file)
{
- unsigned int result = port->mctrl;
+ struct uart_state *state = tty->driver_data;
+ struct uart_port *port = state->port;
+ int result = -EIO;
- result |= port->ops->get_mctrl(port);
+ down(&state->sem);
+ if ((!file || !tty_hung_up_p(file)) &&
+ !(tty->flags & (1 << TTY_IO_ERROR))) {
+ result = port->mctrl;
+ result |= port->ops->get_mctrl(port);
+ }
+ up(&state->sem);
- return put_user(result, value);
+ return result;
}
static int
-uart_set_modem_info(struct uart_port *port, unsigned int cmd,
- unsigned int *value)
+uart_tiocmset(struct tty_struct *tty, struct file *file,
+ unsigned int set, unsigned int clear)
{
- unsigned int arg, set, clear;
- int ret = 0;
-
- if (get_user(arg, value))
- return -EFAULT;
-
- arg &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2;
+ struct uart_state *state = tty->driver_data;
+ struct uart_port *port = state->port;
+ int ret = -EIO;
- set = clear = 0;
- switch (cmd) {
- case TIOCMBIS:
- set = arg;
- break;
- case TIOCMBIC:
- clear = arg;
- break;
- case TIOCMSET:
- set = arg;
- clear = ~arg;
- break;
- default:
- ret = -EINVAL;
- break;
- }
- if (ret == 0)
+ down(&state->sem);
+ if ((!file || !tty_hung_up_p(file)) &&
+ !(tty->flags & (1 << TTY_IO_ERROR))) {
uart_update_mctrl(port, set, clear);
+ ret = 0;
+ }
+ up(&state->sem);
return ret;
}
@@ -922,8 +915,12 @@ static void uart_break_ctl(struct tty_struct *tty, int break_state)
BUG_ON(!kernel_locked());
+ down(&state->sem);
+
if (port->type != PORT_UNKNOWN)
port->ops->break_ctl(port, break_state);
+
+ up(&state->sem);
}
static int uart_do_autoconfig(struct uart_state *state)
@@ -1130,17 +1127,6 @@ uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd,
* protected against the tty being hung up.
*/
switch (cmd) {
- case TIOCMGET:
- ret = uart_get_modem_info(state->port, (unsigned int *)arg);
- break;
-
- case TIOCMBIS:
- case TIOCMBIC:
- case TIOCMSET:
- ret = uart_set_modem_info(state->port, cmd,
- (unsigned int *)arg);
- break;
-
case TIOCSERGETLSR: /* Get line status register */
ret = uart_get_lsr_info(state, (unsigned int *)arg);
break;
@@ -2162,6 +2148,8 @@ int uart_register_driver(struct uart_driver *drv)
#ifdef CONFIG_PROC_FS
normal->read_proc = uart_read_proc;
#endif
+ normal->tiocmget = uart_tiocmget;
+ normal->tiocmset = uart_tiocmset;
/*
* Initialise the UART state(s).
diff --git a/drivers/serial/mcfserial.c b/drivers/serial/mcfserial.c
index 914a2a45781b..5ec60685b87c 100644
--- a/drivers/serial/mcfserial.c
+++ b/drivers/serial/mcfserial.c
@@ -1853,9 +1853,10 @@ struct console mcfrs_console = {
.index = -1,
};
-static void __init mcfrs_console_init(void)
+static int __init mcfrs_console_init(void)
{
register_console(&mcfrs_console);
+ return 0;
}
console_initcall(mcfrs_console_init);
diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c
index b32608e75444..010cf9dc7571 100644
--- a/drivers/serial/sa1100.c
+++ b/drivers/serial/sa1100.c
@@ -836,10 +836,11 @@ static struct console sa1100_console = {
.index = -1,
};
-static void __init sa1100_rs_console_init(void)
+static int __init sa1100_rs_console_init(void)
{
sa1100_init_ports();
register_console(&sa1100_console);
+ return 0;
}
console_initcall(sa1100_rs_console_init);
diff --git a/drivers/serial/uart00.c b/drivers/serial/uart00.c
index deba4a10e439..2a7d39014919 100644
--- a/drivers/serial/uart00.c
+++ b/drivers/serial/uart00.c
@@ -645,9 +645,10 @@ static struct console uart00_console = {
.index = 0,
};
-static void __init uart00_console_init(void)
+static int __init uart00_console_init(void)
{
register_console(&uart00_console);
+ return 0;
}
console_initcall(uart00_console_init);
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
index 0070ed49813d..0e35590dc50c 100644
--- a/include/linux/tty_driver.h
+++ b/include/linux/tty_driver.h
@@ -172,6 +172,9 @@ struct tty_driver {
int count, int *eof, void *data);
int (*write_proc)(struct file *file, const char *buffer,
unsigned long count, void *data);
+ int (*tiocmget)(struct tty_struct *tty, struct file *file);
+ int (*tiocmset)(struct tty_struct *tty, struct file *file,
+ unsigned int set, unsigned int clear);
struct list_head tty_drivers;
};