diff options
Diffstat (limited to 'drivers/usb/gadget/at91_udc.c')
-rw-r--r-- | drivers/usb/gadget/at91_udc.c | 121 |
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; |