diff options
Diffstat (limited to 'drivers/usb/serial/cp210x.c')
| -rw-r--r-- | drivers/usb/serial/cp210x.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 698252a4dc5..bd254ec97d1 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c @@ -50,6 +50,8 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *,  static void cp210x_break_ctl(struct tty_struct *, int);  static int cp210x_startup(struct usb_serial *);  static void cp210x_disconnect(struct usb_serial *); +static void cp210x_dtr_rts(struct usb_serial_port *p, int on); +static int cp210x_carrier_raised(struct usb_serial_port *p);  static int debug; @@ -143,6 +145,8 @@ static struct usb_serial_driver cp210x_device = {  	.tiocmset		= cp210x_tiocmset,  	.attach			= cp210x_startup,  	.disconnect		= cp210x_disconnect, +	.dtr_rts		= cp210x_dtr_rts, +	.carrier_raised		= cp210x_carrier_raised  };  /* Config request types */ @@ -746,6 +750,14 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *file,  	return cp210x_set_config(port, CP210X_SET_MHS, &control, 2);  } +static void cp210x_dtr_rts(struct usb_serial_port *p, int on) +{ +	if (on) +		cp210x_tiocmset_port(p, NULL,  TIOCM_DTR|TIOCM_RTS, 0); +	else +		cp210x_tiocmset_port(p, NULL,  0, TIOCM_DTR|TIOCM_RTS); +} +  static int cp210x_tiocmget (struct tty_struct *tty, struct file *file)  {  	struct usb_serial_port *port = tty->driver_data; @@ -768,6 +780,15 @@ static int cp210x_tiocmget (struct tty_struct *tty, struct file *file)  	return result;  } +static int cp210x_carrier_raised(struct usb_serial_port *p) +{ +	unsigned int control; +	cp210x_get_config(p, CP210X_GET_MDMSTS, &control, 1); +	if (control & CONTROL_DCD) +		return 1; +	return 0; +} +  static void cp210x_break_ctl (struct tty_struct *tty, int break_state)  {  	struct usb_serial_port *port = tty->driver_data;  |