diff options
| author | Linus Torvalds <torvalds@home.transmeta.com> | 2003-04-19 02:24:09 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2003-04-19 02:24:09 -0700 |
| commit | 77ad1af84765f32bbda03e9c0040587ad7f952fa (patch) | |
| tree | b2ad9d66a984ef70ae7299be939aaf575866e71e | |
| parent | e4a874f09dc496ed95829f679f5df6c9db6f037f (diff) | |
| parent | 3bbb0896d422a2c5d5c6f8eb584e9bda3d3277a5 (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.c | 57 | ||||
| -rw-r--r-- | drivers/net/irda/irtty-sir.c | 31 | ||||
| -rw-r--r-- | drivers/serial/68328serial.c | 3 | ||||
| -rw-r--r-- | drivers/serial/8250_pci.c | 7 | ||||
| -rw-r--r-- | drivers/serial/amba.c | 3 | ||||
| -rw-r--r-- | drivers/serial/anakin.c | 4 | ||||
| -rw-r--r-- | drivers/serial/clps711x.c | 3 | ||||
| -rw-r--r-- | drivers/serial/core.c | 70 | ||||
| -rw-r--r-- | drivers/serial/mcfserial.c | 3 | ||||
| -rw-r--r-- | drivers/serial/sa1100.c | 3 | ||||
| -rw-r--r-- | drivers/serial/uart00.c | 3 | ||||
| -rw-r--r-- | include/linux/tty_driver.h | 3 |
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; }; |
