diff options
| author | Takashi Iwai <tiwai@suse.de> | 2014-11-27 12:40:51 +0100 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2014-11-27 12:40:51 +0100 | 
| commit | acf403ecc4155153e5e2c1640be90fc166e56ba7 (patch) | |
| tree | e9655b84776cec00a4da077f5dd1e336dfd9c7c0 /drivers/usb/class/cdc-acm.c | |
| parent | 69eba10e606a80665f8573221fec589430d9d1cb (diff) | |
| parent | b61f90eac1ff9d1b30497e611aba4651d4066706 (diff) | |
Merge branch 'topic/usb-resume' into for-next
Merge the proper mixer resume support for quirk codes.
Diffstat (limited to 'drivers/usb/class/cdc-acm.c')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 25 | 
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index e934e19f49f5..077d58ac3dcb 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -60,6 +60,9 @@ static struct acm *acm_table[ACM_TTY_MINORS];  static DEFINE_MUTEX(acm_table_lock); +static void acm_tty_set_termios(struct tty_struct *tty, +				struct ktermios *termios_old); +  /*   * acm_table accessors   */ @@ -145,8 +148,15 @@ static int acm_ctrl_msg(struct acm *acm, int request, int value,  /* devices aren't required to support these requests.   * the cdc acm descriptor tells whether they do...   */ -#define acm_set_control(acm, control) \ -	acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, control, NULL, 0) +static inline int acm_set_control(struct acm *acm, int control) +{ +	if (acm->quirks & QUIRK_CONTROL_LINE_STATE) +		return -EOPNOTSUPP; + +	return acm_ctrl_msg(acm, USB_CDC_REQ_SET_CONTROL_LINE_STATE, +			control, NULL, 0); +} +  #define acm_set_line(acm, line) \  	acm_ctrl_msg(acm, USB_CDC_REQ_SET_LINE_CODING, 0, line, sizeof *(line))  #define acm_send_break(acm, ms) \ @@ -554,6 +564,8 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)  		goto error_submit_urb;  	} +	acm_tty_set_termios(tty, NULL); +  	/*  	 * Unthrottle device in case the TTY was closed while throttled.  	 */ @@ -980,11 +992,12 @@ static void acm_tty_set_termios(struct tty_struct *tty,  	/* FIXME: Needs to clear unsupported bits in the termios */  	acm->clocal = ((termios->c_cflag & CLOCAL) != 0); -	if (!newline.dwDTERate) { +	if (C_BAUD(tty) == B0) {  		newline.dwDTERate = acm->line.dwDTERate;  		newctrl &= ~ACM_CTRL_DTR; -	} else +	} else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) {  		newctrl |=  ACM_CTRL_DTR; +	}  	if (newctrl != acm->ctrlout)  		acm_set_control(acm, acm->ctrlout = newctrl); @@ -1314,6 +1327,7 @@ made_compressed_probe:  	tty_port_init(&acm->port);  	acm->port.ops = &acm_port_ops;  	init_usb_anchor(&acm->delayed); +	acm->quirks = quirks;  	buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);  	if (!buf) { @@ -1681,6 +1695,9 @@ static const struct usb_device_id acm_ids[] = {  	{ USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */  	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */  	}, +	{ USB_DEVICE(0x20df, 0x0001), /* Simtec Electronics Entropy Key */ +	.driver_info = QUIRK_CONTROL_LINE_STATE, }, +	{ USB_DEVICE(0x2184, 0x001c) },	/* GW Instek AFG-2225 */  	{ USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */  	},  	/* Motorola H24 HSPA module: */  | 
