diff options
Diffstat (limited to 'drivers/usb/serial/qcserial.c')
| -rw-r--r-- | drivers/usb/serial/qcserial.c | 33 | 
1 files changed, 17 insertions, 16 deletions
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index c3ddb65c05f..aa148c21ea4 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c @@ -138,7 +138,6 @@ MODULE_DEVICE_TABLE(usb, id_table);  static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)  { -	struct usb_wwan_intf_private *data;  	struct usb_host_interface *intf = serial->interface->cur_altsetting;  	struct device *dev = &serial->dev->dev;  	int retval = -ENODEV; @@ -154,13 +153,6 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)  	ifnum = intf->desc.bInterfaceNumber;  	dev_dbg(dev, "This Interface = %d\n", ifnum); -	data = kzalloc(sizeof(struct usb_wwan_intf_private), -					 GFP_KERNEL); -	if (!data) -		return -ENOMEM; - -	spin_lock_init(&data->susp_lock); -  	if (nintf == 1) {  		/* QDL mode */  		/* Gobi 2000 has a single altsetting, older ones have two */ @@ -253,20 +245,28 @@ done:  		}  	} -	/* Set serial->private if not returning error */ -	if (retval == 0) -		usb_set_serial_data(serial, data); -	else -		kfree(data); -  	return retval;  } +static int qc_attach(struct usb_serial *serial) +{ +	struct usb_wwan_intf_private *data; + +	data = kzalloc(sizeof(*data), GFP_KERNEL); +	if (!data) +		return -ENOMEM; + +	spin_lock_init(&data->susp_lock); + +	usb_set_serial_data(serial, data); + +	return 0; +} +  static void qc_release(struct usb_serial *serial)  {  	struct usb_wwan_intf_private *priv = usb_get_serial_data(serial); -	/* Free the private data allocated in qcprobe */  	usb_set_serial_data(serial, NULL);  	kfree(priv);  } @@ -285,8 +285,9 @@ static struct usb_serial_driver qcdevice = {  	.write		     = usb_wwan_write,  	.write_room	     = usb_wwan_write_room,  	.chars_in_buffer     = usb_wwan_chars_in_buffer, -	.attach		     = usb_wwan_startup, +	.attach              = qc_attach,  	.release	     = qc_release, +	.port_probe          = usb_wwan_port_probe,  	.port_remove	     = usb_wwan_port_remove,  #ifdef CONFIG_PM  	.suspend	     = usb_wwan_suspend,  |