aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2012-07-15 16:47:38 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-07-16 17:17:59 -0700
commit0dfbf65eb070a6dda535fcfec6028a7412698358 (patch)
treec55a8a0a6e4a3b6e9750349ad8f7ed7e275ca1e2 /drivers/usb
parentUSB: qcserial: centralize probe exit path (diff)
downloadlinux-dev-0dfbf65eb070a6dda535fcfec6028a7412698358.tar.xz
linux-dev-0dfbf65eb070a6dda535fcfec6028a7412698358.zip
USB: qcserial: make probe more flexible
Preparing qcprobe support for more than just strict Gobi 1k or 2k+ devices. Many newer Qualcomm based devices provide the same serial ports, but using varying USB interface layouts. Signed-off-by: Bjørn Mork <bjorn@mork.no> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/serial/qcserial.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c
index 7556f343c0f3..a9c4dc4eb05f 100644
--- a/drivers/usb/serial/qcserial.c
+++ b/drivers/usb/serial/qcserial.c
@@ -143,14 +143,13 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)
spin_lock_init(&data->susp_lock);
- switch (nintf) {
- case 1:
+ if (nintf == 1) {
/* QDL mode */
/* Gobi 2000 has a single altsetting, older ones have two */
if (serial->interface->num_altsetting == 2)
intf = &serial->interface->altsetting[1];
else if (serial->interface->num_altsetting > 2)
- break;
+ goto done;
if (intf->desc.bNumEndpoints == 2 &&
usb_endpoint_is_bulk_in(&intf->endpoint[0].desc) &&
@@ -162,10 +161,18 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)
else
altsetting = 1;
}
- break;
+ goto done;
- case 3:
- case 4:
+ }
+
+ if (nintf < 3 || nintf > 4) {
+ dev_err(dev, "unknown number of interfaces: %d\n", nintf);
+ goto done;
+ }
+
+ /* default to enabling interface */
+ altsetting = 0;
+ switch (ifnum) {
/* Composite mode; don't bind to the QMI/net interface as that
* gets handled by other drivers.
*/
@@ -183,27 +190,28 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)
* 3: NMEA
*/
- if (ifnum == 1 && !is_gobi1k) {
+ case 1:
+ if (is_gobi1k)
+ altsetting = -1;
+ else
dev_dbg(dev, "Gobi 2K+ DM/DIAG interface found\n");
- altsetting = 0;
- } else if (ifnum == 2) {
- dev_dbg(dev, "Modem port found\n");
- altsetting = 0;
- } else if (ifnum==3 && !is_gobi1k) {
+ break;
+ case 2:
+ dev_dbg(dev, "Modem port found\n");
+ break;
+ case 3:
+ if (is_gobi1k)
+ altsetting = -1;
+ else
/*
* NMEA (serial line 9600 8N1)
* # echo "\$GPS_START" > /dev/ttyUSBx
* # echo "\$GPS_STOP" > /dev/ttyUSBx
*/
dev_dbg(dev, "Gobi 2K+ NMEA GPS interface found\n");
- altsetting = 0;
- }
- break;
-
- default:
- dev_err(dev, "unknown number of interfaces: %d\n", nintf);
}
+done:
if (altsetting >= 0) {
retval = usb_set_interface(serial->dev, ifnum, altsetting);
if (retval < 0) {