[PATCH 5/7] ark3116: (3rd try) Add cmset and break

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Bart Hartgers <bart.hartgers@xxxxxxxxx>
---
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-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux