Input: bcm5974 - only setup button urb for TYPE1 devices
[sfrench/cifs-2.6.git] / drivers / input / mouse / bcm5974.c
index d528c23e194f6efcbe7efbe8651d218aa6ef7965..39ac9ff3da81159f2c501bc28d51bde9a048ebea 100644 (file)
@@ -742,9 +742,11 @@ static int bcm5974_start_traffic(struct bcm5974 *dev)
                goto err_out;
        }
 
-       error = usb_submit_urb(dev->bt_urb, GFP_KERNEL);
-       if (error)
-               goto err_reset_mode;
+       if (dev->bt_urb) {
+               error = usb_submit_urb(dev->bt_urb, GFP_KERNEL);
+               if (error)
+                       goto err_reset_mode;
+       }
 
        error = usb_submit_urb(dev->tp_urb, GFP_KERNEL);
        if (error)
@@ -868,19 +870,23 @@ static int bcm5974_probe(struct usb_interface *iface,
        mutex_init(&dev->pm_mutex);
 
        /* setup urbs */
-       dev->bt_urb = usb_alloc_urb(0, GFP_KERNEL);
-       if (!dev->bt_urb)
-               goto err_free_devs;
+       if (cfg->tp_type == TYPE1) {
+               dev->bt_urb = usb_alloc_urb(0, GFP_KERNEL);
+               if (!dev->bt_urb)
+                       goto err_free_devs;
+       }
 
        dev->tp_urb = usb_alloc_urb(0, GFP_KERNEL);
        if (!dev->tp_urb)
                goto err_free_bt_urb;
 
-       dev->bt_data = usb_alloc_coherent(dev->udev,
+       if (dev->bt_urb) {
+               dev->bt_data = usb_alloc_coherent(dev->udev,
                                          dev->cfg.bt_datalen, GFP_KERNEL,
                                          &dev->bt_urb->transfer_dma);
-       if (!dev->bt_data)
-               goto err_free_urb;
+               if (!dev->bt_data)
+                       goto err_free_urb;
+       }
 
        dev->tp_data = usb_alloc_coherent(dev->udev,
                                          dev->cfg.tp_datalen, GFP_KERNEL,
@@ -888,10 +894,11 @@ static int bcm5974_probe(struct usb_interface *iface,
        if (!dev->tp_data)
                goto err_free_bt_buffer;
 
-       usb_fill_int_urb(dev->bt_urb, udev,
-                        usb_rcvintpipe(udev, cfg->bt_ep),
-                        dev->bt_data, dev->cfg.bt_datalen,
-                        bcm5974_irq_button, dev, 1);
+       if (dev->bt_urb)
+               usb_fill_int_urb(dev->bt_urb, udev,
+                                usb_rcvintpipe(udev, cfg->bt_ep),
+                                dev->bt_data, dev->cfg.bt_datalen,
+                                bcm5974_irq_button, dev, 1);
 
        usb_fill_int_urb(dev->tp_urb, udev,
                         usb_rcvintpipe(udev, cfg->tp_ep),
@@ -929,8 +936,9 @@ err_free_buffer:
        usb_free_coherent(dev->udev, dev->cfg.tp_datalen,
                dev->tp_data, dev->tp_urb->transfer_dma);
 err_free_bt_buffer:
-       usb_free_coherent(dev->udev, dev->cfg.bt_datalen,
-               dev->bt_data, dev->bt_urb->transfer_dma);
+       if (dev->bt_urb)
+               usb_free_coherent(dev->udev, dev->cfg.bt_datalen,
+                                 dev->bt_data, dev->bt_urb->transfer_dma);
 err_free_urb:
        usb_free_urb(dev->tp_urb);
 err_free_bt_urb:
@@ -951,8 +959,9 @@ static void bcm5974_disconnect(struct usb_interface *iface)
        input_unregister_device(dev->input);
        usb_free_coherent(dev->udev, dev->cfg.tp_datalen,
                          dev->tp_data, dev->tp_urb->transfer_dma);
-       usb_free_coherent(dev->udev, dev->cfg.bt_datalen,
-                         dev->bt_data, dev->bt_urb->transfer_dma);
+       if (dev->bt_urb)
+               usb_free_coherent(dev->udev, dev->cfg.bt_datalen,
+                                 dev->bt_data, dev->bt_urb->transfer_dma);
        usb_free_urb(dev->tp_urb);
        usb_free_urb(dev->bt_urb);
        kfree(dev);