usb: isp1760: Fix USB disabled check
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 20 Jan 2015 22:56:05 +0000 (00:56 +0200)
committerFelipe Balbi <balbi@ti.com>
Tue, 27 Jan 2015 15:39:51 +0000 (09:39 -0600)
The isp1760 driver registration function returns an error if USB is
disabled. This made sense when the driver only supported host
controllers, but now that it supports peripheral controllers host
support isn't mandatory anymore.

Fix this by returning an error only when both the HCD and UDC functions
are disabled, either through the kernel configuration or at runtime.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/isp1760/isp1760-core.c
drivers/usb/isp1760/isp1760-hcd.c
drivers/usb/isp1760/isp1760-udc.c

index 727e90ad15bd0a392e76f6934bcfd08dc6fa8970..b9827556455f74dad64adbb4e785f14330f3371a 100644 (file)
@@ -112,9 +112,15 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
                     struct device *dev, unsigned int devflags)
 {
        struct isp1760_device *isp;
+       bool udc_disabled = !(devflags & ISP1760_FLAG_ISP1761);
        int ret;
 
-       if (usb_disabled())
+       /*
+        * If neither the HCD not the UDC is enabled return an error, as no
+        * device would be registered.
+        */
+       if ((!IS_ENABLED(CONFIG_USB_ISP1760_HCD) || usb_disabled()) &&
+           (!IS_ENABLED(CONFIG_USB_ISP1761_UDC) || udc_disabled))
                return -ENODEV;
 
        /* prevent usb-core allocating DMA pages */
@@ -137,12 +143,14 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
 
        isp1760_init_core(isp);
 
-       ret = isp1760_hcd_register(&isp->hcd, isp->regs, mem, irq,
-                                  irqflags | IRQF_SHARED, dev);
-       if (ret < 0)
-               return ret;
+       if (IS_ENABLED(CONFIG_USB_ISP1760_HCD) && !usb_disabled()) {
+               ret = isp1760_hcd_register(&isp->hcd, isp->regs, mem, irq,
+                                          irqflags | IRQF_SHARED, dev);
+               if (ret < 0)
+                       return ret;
+       }
 
-       if (devflags & ISP1760_FLAG_ISP1761) {
+       if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && !udc_disabled) {
                ret = isp1760_udc_register(isp, irq, irqflags | IRQF_SHARED |
                                           IRQF_DISABLED);
                if (ret < 0) {
@@ -160,9 +168,7 @@ void isp1760_unregister(struct device *dev)
 {
        struct isp1760_device *isp = dev_get_drvdata(dev);
 
-       if (isp->devflags & ISP1760_FLAG_ISP1761)
-               isp1760_udc_unregister(isp);
-
+       isp1760_udc_unregister(isp);
        isp1760_hcd_unregister(&isp->hcd);
 }
 
index 568446c9ce8d99d21a6f3588b99304ab66c7b91e..996b2c157d12c662bc1fffe9956781e0be95156e 100644 (file)
@@ -2226,6 +2226,9 @@ error:
 
 void isp1760_hcd_unregister(struct isp1760_hcd *priv)
 {
+       if (!priv->hcd)
+               return;
+
        usb_remove_hcd(priv->hcd);
        usb_put_hcd(priv->hcd);
 }
index 6bfda3082807ea8ddb3d2429f9801d0e6a523d25..9612d7990565c81a75a5310742c793e85e9b8057 100644 (file)
@@ -1488,6 +1488,9 @@ void isp1760_udc_unregister(struct isp1760_device *isp)
 {
        struct isp1760_udc *udc = &isp->udc;
 
+       if (!udc->isp)
+               return;
+
        usb_del_gadget_udc(&udc->gadget);
 
        free_irq(udc->irq, udc);