Commit 77ad1af8 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://bk.arm.linux.org.uk/linux-2.5-serial

into home.transmeta.com:/home/torvalds/v2.5/linux
parents e4a874f0 3bbb0896
......@@ -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);
......
......@@ -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;
}
......
......@@ -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);
......@@ -1808,13 +1808,6 @@ static struct pci_device_id serial_pci_tbl[] __devinitdata = {
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
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.
......
......@@ -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);
......
......@@ -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);
......
......@@ -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);
......
......@@ -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;
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).
......
......@@ -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);
......
......@@ -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);
......
......@@ -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);
......
......@@ -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;
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment