summaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/at91_udc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/at91_udc.c')
-rw-r--r--drivers/usb/gadget/at91_udc.c121
1 files changed, 47 insertions, 74 deletions
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c
index 2768dddc26..2b19be94f0 100644
--- a/drivers/usb/gadget/at91_udc.c
+++ b/drivers/usb/gadget/at91_udc.c
@@ -749,20 +749,6 @@ static int at91_set_selfpowered(struct usb_gadget *gadget, int is_on)
return 0;
}
-static const struct usb_gadget_ops at91_udc_ops = {
- .get_frame = at91_get_frame,
- .wakeup = at91_wakeup,
- .set_selfpowered = at91_set_selfpowered,
- .vbus_session = at91_vbus_session,
- .pullup = at91_pullup,
-
- /*
- * VBUS-powered devices may also also want to support bigger
- * power budgets after an appropriate SET_CONFIGURATION.
- */
- /* .vbus_power = at91_vbus_power, */
-};
-
/*-------------------------------------------------------------------------*/
static int handle_ep(struct at91_ep *ep)
@@ -1244,6 +1230,49 @@ static void at91_udc_irq (void *_udc)
}
}
+static int at91_udc_start(struct usb_gadget *gadget, struct usb_gadget_driver *driver)
+{
+ struct at91_udc *udc = container_of(gadget, struct at91_udc, gadget);
+
+ if (!udc->iclk)
+ return -ENODEV;
+
+ udc->driver = driver;
+ udc->enabled = 1;
+ udc->selfpowered = 1;
+
+ DBG(udc, "bound to %s\n", driver->function);
+ return 0;
+}
+
+static int at91_udc_stop(struct usb_gadget *gadget, struct usb_gadget_driver *driver)
+{
+ struct at91_udc *udc = container_of(gadget, struct at91_udc, gadget);
+
+ udc->enabled = 0;
+ at91_udp_write(udc, AT91_UDP_IDR, ~0);
+ udc->driver = NULL;
+
+ DBG(udc, "unbound from %s\n", driver->function);
+ return 0;
+}
+
+static const struct usb_gadget_ops at91_udc_ops = {
+ .get_frame = at91_get_frame,
+ .wakeup = at91_wakeup,
+ .set_selfpowered = at91_set_selfpowered,
+ .vbus_session = at91_vbus_session,
+ .pullup = at91_pullup,
+
+ /*
+ * VBUS-powered devices may also also want to support bigger
+ * power budgets after an appropriate SET_CONFIGURATION.
+ */
+ /* .vbus_power = at91_vbus_power, */
+ .udc_start = at91_udc_start,
+ .udc_stop = at91_udc_stop,
+};
+
/*-------------------------------------------------------------------------*/
static struct at91_udc controller = {
@@ -1346,66 +1375,6 @@ int usb_gadget_poll(void)
return value;
}
-int usb_gadget_register_driver(struct usb_gadget_driver *driver)
-{
- struct at91_udc *udc = &controller;
- int retval;
-
- if (!udc->iclk)
- return -ENODEV;
-
- if (!driver
- || driver->speed < USB_SPEED_FULL
- || !driver->bind
- || !driver->setup) {
- DBG(udc, "bad parameter.\n");
- return -EINVAL;
- }
-
- if (udc->driver) {
- DBG(udc, "UDC already has a gadget driver\n");
- return -EBUSY;
- }
-
- udc->driver = driver;
- udc->enabled = 1;
- udc->selfpowered = 1;
-
- retval = driver->bind(&udc->gadget);
- if (retval) {
- DBG(udc, "bind() returned %d\n", retval);
- udc->driver = NULL;
- udc->enabled = 0;
- udc->selfpowered = 0;
- return retval;
- }
-
- pullup(udc, 1);
-
- DBG(udc, "bound to %s\n", driver->function);
- return 0;
-}
-EXPORT_SYMBOL (usb_gadget_register_driver);
-
-int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
-{
- struct at91_udc *udc = &controller;
-
- if (!driver || driver != udc->driver || !driver->unbind)
- return -EINVAL;
-
- udc->enabled = 0;
- at91_udp_write(udc, AT91_UDP_IDR, ~0);
- pullup(udc, 0);
-
- driver->unbind(&udc->gadget);
- udc->driver = NULL;
-
- DBG(udc, "unbound from %s\n", driver->function);
- return 0;
-}
-EXPORT_SYMBOL (usb_gadget_unregister_driver);
-
/*-------------------------------------------------------------------------*/
static void at91_udc_poller(struct poller_struct *poller)
@@ -1513,6 +1482,10 @@ static int __init at91udc_probe(struct device_d *dev)
poller_register(&poller);
+ retval = usb_add_gadget_udc_release(dev, &udc->gadget, NULL);
+ if (retval)
+ goto fail0a;
+
INFO(udc, "%s version %s\n", driver_name, DRIVER_VERSION);
return 0;