Signed-off-by: Bart Hartgers --- Index: linux-2.6.32-rc4/drivers/usb/serial/ark3116.c =================================================================== --- linux-2.6.32-rc4.orig/drivers/usb/serial/ark3116.c 2009-10-18 16:20:17.000000000 +0200 +++ linux-2.6.32-rc4/drivers/usb/serial/ark3116.c 2009-10-18 16:20:20.000000000 +0200 @@ -570,6 +570,62 @@ static int ark3116_tiocmget(struct tty_s (ctrl & UART_MCR_OUT2 ? TIOCM_OUT2 : 0); } +static int ark3116_tiocmset(struct tty_struct *tty, struct file *file, + unsigned set, unsigned clr) +{ + struct usb_serial_port *port = tty->driver_data; + struct ark3116_private *priv = usb_get_serial_port_data(port); + unsigned setmask = 0; + unsigned clrmask = 0; + + if (set & TIOCM_RTS) + setmask |= UART_MCR_RTS; + if (set & TIOCM_DTR) + setmask |= UART_MCR_DTR; + if (set & TIOCM_OUT1) + setmask |= UART_MCR_OUT1; + if (set & TIOCM_OUT2) + setmask |= UART_MCR_OUT2; + if (clr & TIOCM_RTS) + clrmask |= UART_MCR_RTS; + if (clr & TIOCM_DTR) + clrmask |= UART_MCR_DTR; + if (clr & TIOCM_OUT1) + clrmask |= UART_MCR_OUT1; + if (clr & TIOCM_OUT2) + clrmask |= UART_MCR_OUT2; + + ark3116_atomic_set_clear(setmask, clrmask, &priv->mcr); + + /* unfortunately, we need the mutex, to make sure that the value + * in priv->mcr is actually the one that is in the hardware + */ + + mutex_lock(&priv->lock); + ark3116_write_reg(port->serial, UART_MCR, atomic_read(&priv->mcr)); + mutex_unlock(&priv->lock); + + return 0; +} + +static void ark3116_break_ctl(struct tty_struct *tty, int break_state) +{ + struct usb_serial_port *port = tty->driver_data; + struct ark3116_private *priv = usb_get_serial_port_data(port); + + /* LCR is also used for other things: protect access */ + mutex_lock(&priv->lock); + + if (break_state) + priv->lcr |= UART_LCR_SBC; + else + priv->lcr &= UART_LCR_SBC; + + ark3116_write_reg(port->serial, UART_LCR, priv->lcr); + + mutex_unlock(&priv->lock); +} + static struct usb_driver ark3116_driver = { .name = "ark3116", .probe = usb_serial_probe, @@ -592,8 +648,10 @@ static struct usb_serial_driver ark3116_ .init_termios = ark3116_init_termios, .ioctl = ark3116_ioctl, .tiocmget = ark3116_tiocmget, + .tiocmset = ark3116_tiocmset, .open = ark3116_open, .close = ark3116_close, + .break_ctl = ark3116_break_ctl, }; static int __init ark3116_init(void) -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/