aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2015-01-20 17:56:05 -0500
committerFelipe Balbi <balbi@ti.com>2015-01-27 10:39:51 -0500
commitd21daf1e90514cee8e3fb11c8e28acee3fb87edf (patch)
treea44d5731b4bf452d65a5710d9f87e97945ce2573
parent1f8d9b9b503070e5450f49e0a341ac3b43d9164d (diff)
usb: isp1760: Fix USB disabled check
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>
-rw-r--r--drivers/usb/isp1760/isp1760-core.c24
-rw-r--r--drivers/usb/isp1760/isp1760-hcd.c3
-rw-r--r--drivers/usb/isp1760/isp1760-udc.c3
3 files changed, 21 insertions, 9 deletions
diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c
index 727e90ad15bd..b9827556455f 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,
112 struct device *dev, unsigned int devflags) 112 struct device *dev, unsigned int devflags)
113{ 113{
114 struct isp1760_device *isp; 114 struct isp1760_device *isp;
115 bool udc_disabled = !(devflags & ISP1760_FLAG_ISP1761);
115 int ret; 116 int ret;
116 117
117 if (usb_disabled()) 118 /*
119 * If neither the HCD not the UDC is enabled return an error, as no
120 * device would be registered.
121 */
122 if ((!IS_ENABLED(CONFIG_USB_ISP1760_HCD) || usb_disabled()) &&
123 (!IS_ENABLED(CONFIG_USB_ISP1761_UDC) || udc_disabled))
118 return -ENODEV; 124 return -ENODEV;
119 125
120 /* prevent usb-core allocating DMA pages */ 126 /* prevent usb-core allocating DMA pages */
@@ -137,12 +143,14 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
137 143
138 isp1760_init_core(isp); 144 isp1760_init_core(isp);
139 145
140 ret = isp1760_hcd_register(&isp->hcd, isp->regs, mem, irq, 146 if (IS_ENABLED(CONFIG_USB_ISP1760_HCD) && !usb_disabled()) {
141 irqflags | IRQF_SHARED, dev); 147 ret = isp1760_hcd_register(&isp->hcd, isp->regs, mem, irq,
142 if (ret < 0) 148 irqflags | IRQF_SHARED, dev);
143 return ret; 149 if (ret < 0)
150 return ret;
151 }
144 152
145 if (devflags & ISP1760_FLAG_ISP1761) { 153 if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && !udc_disabled) {
146 ret = isp1760_udc_register(isp, irq, irqflags | IRQF_SHARED | 154 ret = isp1760_udc_register(isp, irq, irqflags | IRQF_SHARED |
147 IRQF_DISABLED); 155 IRQF_DISABLED);
148 if (ret < 0) { 156 if (ret < 0) {
@@ -160,9 +168,7 @@ void isp1760_unregister(struct device *dev)
160{ 168{
161 struct isp1760_device *isp = dev_get_drvdata(dev); 169 struct isp1760_device *isp = dev_get_drvdata(dev);
162 170
163 if (isp->devflags & ISP1760_FLAG_ISP1761) 171 isp1760_udc_unregister(isp);
164 isp1760_udc_unregister(isp);
165
166 isp1760_hcd_unregister(&isp->hcd); 172 isp1760_hcd_unregister(&isp->hcd);
167} 173}
168 174
diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c
index 568446c9ce8d..996b2c157d12 100644
--- a/drivers/usb/isp1760/isp1760-hcd.c
+++ b/drivers/usb/isp1760/isp1760-hcd.c
@@ -2226,6 +2226,9 @@ error:
2226 2226
2227void isp1760_hcd_unregister(struct isp1760_hcd *priv) 2227void isp1760_hcd_unregister(struct isp1760_hcd *priv)
2228{ 2228{
2229 if (!priv->hcd)
2230 return;
2231
2229 usb_remove_hcd(priv->hcd); 2232 usb_remove_hcd(priv->hcd);
2230 usb_put_hcd(priv->hcd); 2233 usb_put_hcd(priv->hcd);
2231} 2234}
diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c
index 6bfda3082807..9612d7990565 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)
1488{ 1488{
1489 struct isp1760_udc *udc = &isp->udc; 1489 struct isp1760_udc *udc = &isp->udc;
1490 1490
1491 if (!udc->isp)
1492 return;
1493
1491 usb_del_gadget_udc(&udc->gadget); 1494 usb_del_gadget_udc(&udc->gadget);
1492 1495
1493 free_irq(udc->irq, udc); 1496 free_irq(udc->irq, udc);