[PATCH v4 26/26] usb: isp1760: Fix USB disabled check

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxxx>
---
 drivers/usb/isp1760/isp1760-core.c | 24 +++++++++++++++---------
 drivers/usb/isp1760/isp1760-hcd.c  |  3 +++
 drivers/usb/isp1760/isp1760-udc.c  |  3 +++
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c
index 727e90a..b982755 100644
--- a/drivers/usb/isp1760/isp1760-core.c
+++ b/drivers/usb/isp1760/isp1760-core.c
@@ -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);
 }
 
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
index 568446c..996b2c1 100644
--- a/drivers/usb/isp1760/isp1760-hcd.c
+++ b/drivers/usb/isp1760/isp1760-hcd.c
@@ -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);
 }
diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c
index 6bfda30..9612d79 100644
--- a/drivers/usb/isp1760/isp1760-udc.c
+++ b/drivers/usb/isp1760/isp1760-udc.c
@@ -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);
-- 
2.0.5

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux