|
@@ -1671,9 +1671,10 @@ static int pxa_udc_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
|
|
|
return -EOPNOTSUPP;
|
|
|
}
|
|
|
|
|
|
-static int pxa27x_udc_start(struct usb_gadget_driver *driver,
|
|
|
- int (*bind)(struct usb_gadget *, struct usb_gadget_driver *));
|
|
|
-static int pxa27x_udc_stop(struct usb_gadget_driver *driver);
|
|
|
+static int pxa27x_udc_start(struct usb_gadget *g,
|
|
|
+ struct usb_gadget_driver *driver);
|
|
|
+static int pxa27x_udc_stop(struct usb_gadget *g,
|
|
|
+ struct usb_gadget_driver *driver);
|
|
|
|
|
|
static const struct usb_gadget_ops pxa_udc_ops = {
|
|
|
.get_frame = pxa_udc_get_frame,
|
|
@@ -1681,8 +1682,8 @@ static const struct usb_gadget_ops pxa_udc_ops = {
|
|
|
.pullup = pxa_udc_pullup,
|
|
|
.vbus_session = pxa_udc_vbus_session,
|
|
|
.vbus_draw = pxa_udc_vbus_draw,
|
|
|
- .start = pxa27x_udc_start,
|
|
|
- .stop = pxa27x_udc_stop,
|
|
|
+ .udc_start = pxa27x_udc_start,
|
|
|
+ .udc_stop = pxa27x_udc_stop,
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -1802,20 +1803,12 @@ static void udc_enable(struct pxa_udc *udc)
|
|
|
*
|
|
|
* Returns 0 if no error, -EINVAL, -ENODEV, -EBUSY otherwise
|
|
|
*/
|
|
|
-static int pxa27x_udc_start(struct usb_gadget_driver *driver,
|
|
|
- int (*bind)(struct usb_gadget *, struct usb_gadget_driver *))
|
|
|
+static int pxa27x_udc_start(struct usb_gadget *g,
|
|
|
+ struct usb_gadget_driver *driver)
|
|
|
{
|
|
|
- struct pxa_udc *udc = the_controller;
|
|
|
+ struct pxa_udc *udc = to_pxa(g);
|
|
|
int retval;
|
|
|
|
|
|
- if (!driver || driver->max_speed < USB_SPEED_FULL || !bind
|
|
|
- || !driver->disconnect || !driver->setup)
|
|
|
- return -EINVAL;
|
|
|
- if (!udc)
|
|
|
- return -ENODEV;
|
|
|
- if (udc->driver)
|
|
|
- return -EBUSY;
|
|
|
-
|
|
|
/* first hook up the driver ... */
|
|
|
udc->driver = driver;
|
|
|
udc->gadget.dev.driver = &driver->driver;
|
|
@@ -1824,23 +1817,14 @@ static int pxa27x_udc_start(struct usb_gadget_driver *driver,
|
|
|
retval = device_add(&udc->gadget.dev);
|
|
|
if (retval) {
|
|
|
dev_err(udc->dev, "device_add error %d\n", retval);
|
|
|
- goto add_fail;
|
|
|
+ goto fail;
|
|
|
}
|
|
|
- retval = bind(&udc->gadget, driver);
|
|
|
- if (retval) {
|
|
|
- dev_err(udc->dev, "bind to driver %s --> error %d\n",
|
|
|
- driver->driver.name, retval);
|
|
|
- goto bind_fail;
|
|
|
- }
|
|
|
- dev_dbg(udc->dev, "registered gadget driver '%s'\n",
|
|
|
- driver->driver.name);
|
|
|
-
|
|
|
if (!IS_ERR_OR_NULL(udc->transceiver)) {
|
|
|
retval = otg_set_peripheral(udc->transceiver->otg,
|
|
|
&udc->gadget);
|
|
|
if (retval) {
|
|
|
dev_err(udc->dev, "can't bind to transceiver\n");
|
|
|
- goto transceiver_fail;
|
|
|
+ goto fail;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1848,12 +1832,7 @@ static int pxa27x_udc_start(struct usb_gadget_driver *driver,
|
|
|
udc_enable(udc);
|
|
|
return 0;
|
|
|
|
|
|
-transceiver_fail:
|
|
|
- if (driver->unbind)
|
|
|
- driver->unbind(&udc->gadget);
|
|
|
-bind_fail:
|
|
|
- device_del(&udc->gadget.dev);
|
|
|
-add_fail:
|
|
|
+fail:
|
|
|
udc->driver = NULL;
|
|
|
udc->gadget.dev.driver = NULL;
|
|
|
return retval;
|
|
@@ -1878,9 +1857,6 @@ static void stop_activity(struct pxa_udc *udc, struct usb_gadget_driver *driver)
|
|
|
|
|
|
for (i = 0; i < NR_USB_ENDPOINTS; i++)
|
|
|
pxa_ep_disable(&udc->udc_usb_ep[i].usb_ep);
|
|
|
-
|
|
|
- if (driver)
|
|
|
- driver->disconnect(&udc->gadget);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1889,25 +1865,18 @@ static void stop_activity(struct pxa_udc *udc, struct usb_gadget_driver *driver)
|
|
|
*
|
|
|
* Returns 0 if no error, -ENODEV, -EINVAL otherwise
|
|
|
*/
|
|
|
-static int pxa27x_udc_stop(struct usb_gadget_driver *driver)
|
|
|
+static int pxa27x_udc_stop(struct usb_gadget *g,
|
|
|
+ struct usb_gadget_driver *driver)
|
|
|
{
|
|
|
- struct pxa_udc *udc = the_controller;
|
|
|
-
|
|
|
- if (!udc)
|
|
|
- return -ENODEV;
|
|
|
- if (!driver || driver != udc->driver || !driver->unbind)
|
|
|
- return -EINVAL;
|
|
|
+ struct pxa_udc *udc = to_pxa(g);
|
|
|
|
|
|
stop_activity(udc, driver);
|
|
|
udc_disable(udc);
|
|
|
dplus_pullup(udc, 0);
|
|
|
|
|
|
- driver->unbind(&udc->gadget);
|
|
|
udc->driver = NULL;
|
|
|
|
|
|
device_del(&udc->gadget.dev);
|
|
|
- dev_info(udc->dev, "unregistered gadget driver '%s'\n",
|
|
|
- driver->driver.name);
|
|
|
|
|
|
if (!IS_ERR_OR_NULL(udc->transceiver))
|
|
|
return otg_set_peripheral(udc->transceiver->otg, NULL);
|