usb: gadget: convert all users to the new udc infrastructure
peripheral drivers are using usb_add_gadget()/usb_del_gadget() to register/unregister to the udc-core. The udc-core will take the first available gadget driver and attach function driver which is calling usb_gadget_register_driver(). This is the same behaviour we have right now. Only dummy_hcd was tested, the others were compiled tested. Cc: Alan Stern <stern@rowland.harvard.edu> Cc: Anton Tikhomirov <av.tikhomirov@samsung.com> Cc: Ben Dooks <ben-linux@fluff.org> Cc: Dan Carpenter <error27@gmail.com> Cc: Darius Augulis <augulis.darius@gmail.com> Cc: Eric Miao <eric.y.miao@gmail.com> Cc: Jingoo Han <jg1.han@samsung.com> Cc: Kukjin Kim <kgene.kim@samsung.com> Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Cc: Li Yang <leoli@freescale.com> Cc: Michael Hennerich <michael.hennerich@analog.com> Acked-by: Mike Frysinger <vapier@gentoo.org> Cc: Nicolas Ferre <nicolas.ferre@atmel.com> Cc: Pavankumar Kondeti <pkondeti@codeaurora.org> Cc: Roy Huang <roy.huang@analog.com> Cc: Russell King <linux@arm.linux.org.uk> Cc: Toshiharu Okada <toshiharu-linux@dsn.okisemi.com> Cc: Xiaochen Shen <xiaochen.shen@intel.com> Cc: Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com> Cc: Yuan-Hsin Chen <yhchen@faraday-tech.com> Cc: cxie4 <cxie4@marvell.com> Cc: linux-geode@lists.infradead.org Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Родитель
2ccea03a8f
Коммит
0f91349b89
|
@ -3,6 +3,7 @@
|
|||
#
|
||||
ccflags-$(CONFIG_USB_GADGET_DEBUG) := -DDEBUG
|
||||
|
||||
obj-$(CONFIG_USB_GADGET) += udc-core.o
|
||||
obj-$(CONFIG_USB_DUMMY_HCD) += dummy_hcd.o
|
||||
obj-$(CONFIG_USB_NET2272) += net2272.o
|
||||
obj-$(CONFIG_USB_NET2280) += net2280.o
|
||||
|
|
|
@ -1438,10 +1438,15 @@ static int udc_wakeup(struct usb_gadget *gadget)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int amd5536_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int amd5536_stop(struct usb_gadget_driver *driver);
|
||||
/* gadget operations */
|
||||
static const struct usb_gadget_ops udc_ops = {
|
||||
.wakeup = udc_wakeup,
|
||||
.get_frame = udc_get_frame,
|
||||
.start = amd5536_start,
|
||||
.stop = amd5536_stop,
|
||||
};
|
||||
|
||||
/* Setups endpoint parameters, adds endpoints to linked list */
|
||||
|
@ -1955,7 +1960,7 @@ static int setup_ep0(struct udc *dev)
|
|||
}
|
||||
|
||||
/* Called by gadget driver to register itself */
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int amd5536_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct udc *dev = udc;
|
||||
|
@ -2002,7 +2007,6 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
/* shutdown requests and disconnect from gadget */
|
||||
static void
|
||||
|
@ -2027,7 +2031,7 @@ __acquires(dev->lock)
|
|||
}
|
||||
|
||||
/* Called by gadget driver to unregister itself */
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int amd5536_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct udc *dev = udc;
|
||||
unsigned long flags;
|
||||
|
@ -2057,8 +2061,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
|
||||
/* Clear pending NAK bits */
|
||||
static void udc_process_cnak_queue(struct udc *dev)
|
||||
|
@ -3134,6 +3136,7 @@ static void udc_pci_remove(struct pci_dev *pdev)
|
|||
|
||||
dev = pci_get_drvdata(pdev);
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
/* gadget driver must not be registered */
|
||||
BUG_ON(dev->driver != NULL);
|
||||
|
||||
|
@ -3382,8 +3385,13 @@ static int udc_probe(struct udc *dev)
|
|||
"driver version: %s(for Geode5536 B1)\n", tmp);
|
||||
udc = dev;
|
||||
|
||||
retval = usb_add_gadget_udc(&udc->pdev->dev, &dev->gadget);
|
||||
if (retval)
|
||||
goto finished;
|
||||
|
||||
retval = device_register(&dev->gadget.dev);
|
||||
if (retval) {
|
||||
usb_del_gadget_udc(&dev->gadget);
|
||||
put_device(&dev->gadget.dev);
|
||||
goto finished;
|
||||
}
|
||||
|
|
|
@ -985,12 +985,18 @@ static int at91_set_selfpowered(struct usb_gadget *gadget, int is_on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int at91_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int at91_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
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,
|
||||
.start = at91_start,
|
||||
.stop = at91_stop,
|
||||
|
||||
/*
|
||||
* VBUS-powered devices may also also want to support bigger
|
||||
|
@ -1628,7 +1634,7 @@ static void at91_vbus_timer(unsigned long data)
|
|||
schedule_work(&udc->vbus_timer_work);
|
||||
}
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int at91_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct at91_udc *udc = &controller;
|
||||
|
@ -1672,9 +1678,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
DBG("bound to %s\n", driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
|
||||
static int at91_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct at91_udc *udc = &controller;
|
||||
unsigned long flags;
|
||||
|
@ -1696,7 +1701,6 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
|
|||
DBG("unbound from %s\n", driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL (usb_gadget_unregister_driver);
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
|
@ -1854,13 +1858,18 @@ static int __init at91udc_probe(struct platform_device *pdev)
|
|||
DBG("no VBUS detection, assuming always-on\n");
|
||||
udc->vbus = 1;
|
||||
}
|
||||
retval = usb_add_gadget_udc(dev, &udc->gadget);
|
||||
if (retval)
|
||||
goto fail4;
|
||||
dev_set_drvdata(dev, udc);
|
||||
device_init_wakeup(dev, 1);
|
||||
create_debug_file(udc);
|
||||
|
||||
INFO("%s version %s\n", driver_name, DRIVER_VERSION);
|
||||
return 0;
|
||||
|
||||
fail4:
|
||||
if (udc->board.vbus_pin > 0 && !udc->board.vbus_polled)
|
||||
free_irq(udc->board.vbus_pin, udc);
|
||||
fail3:
|
||||
if (udc->board.vbus_pin > 0)
|
||||
gpio_free(udc->board.vbus_pin);
|
||||
|
@ -1887,6 +1896,7 @@ static int __exit at91udc_remove(struct platform_device *pdev)
|
|||
|
||||
DBG("remove\n");
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
if (udc->driver)
|
||||
return -EBUSY;
|
||||
|
||||
|
|
|
@ -1007,10 +1007,16 @@ usba_udc_set_selfpowered(struct usb_gadget *gadget, int is_selfpowered)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int atmel_usba_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int atmel_usba_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static const struct usb_gadget_ops usba_udc_ops = {
|
||||
.get_frame = usba_udc_get_frame,
|
||||
.wakeup = usba_udc_wakeup,
|
||||
.set_selfpowered = usba_udc_set_selfpowered,
|
||||
.start = atmel_usba_start,
|
||||
.stop = atmel_usba_stop,
|
||||
};
|
||||
|
||||
static struct usb_endpoint_descriptor usba_ep0_desc = {
|
||||
|
@ -1789,7 +1795,7 @@ out:
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int atmel_usba_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct usba_udc *udc = &the_udc;
|
||||
|
@ -1842,9 +1848,8 @@ err_driver_bind:
|
|||
udc->gadget.dev.driver = NULL;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int atmel_usba_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct usba_udc *udc = &the_udc;
|
||||
unsigned long flags;
|
||||
|
@ -1880,7 +1885,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
static int __init usba_udc_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
@ -2021,12 +2025,24 @@ static int __init usba_udc_probe(struct platform_device *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
|
||||
if (ret)
|
||||
goto err_add_udc;
|
||||
|
||||
usba_init_debugfs(udc);
|
||||
for (i = 1; i < pdata->num_ep; i++)
|
||||
usba_ep_init_debugfs(udc, &usba_ep[i]);
|
||||
|
||||
return 0;
|
||||
|
||||
err_add_udc:
|
||||
if (gpio_is_valid(pdata->vbus_pin)) {
|
||||
free_irq(gpio_to_irq(udc->vbus_pin), udc);
|
||||
gpio_free(udc->vbus_pin);
|
||||
}
|
||||
|
||||
device_unregister(&udc->gadget.dev);
|
||||
|
||||
err_device_add:
|
||||
free_irq(irq, udc);
|
||||
err_request_irq:
|
||||
|
@ -2053,6 +2069,8 @@ static int __exit usba_udc_remove(struct platform_device *pdev)
|
|||
|
||||
udc = platform_get_drvdata(pdev);
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
|
||||
for (i = 1; i < pdata->num_ep; i++)
|
||||
usba_ep_cleanup_debugfs(&usba_ep[i]);
|
||||
usba_cleanup_debugfs(udc);
|
||||
|
|
|
@ -857,7 +857,7 @@ static void dbg_print(u8 addr, const char *name, int status, const char *extra)
|
|||
stamp = stamp * 1000000 + tval.tv_usec;
|
||||
|
||||
scnprintf(dbg_data.buf[dbg_data.idx], DBG_DATA_MSG,
|
||||
"%04X\t» %02X %-7.7s %4i «\t%s\n",
|
||||
"%04X\t? %02X %-7.7s %4i ?\t%s\n",
|
||||
stamp, addr, name, status, extra);
|
||||
|
||||
dbg_inc(&dbg_data.idx);
|
||||
|
@ -865,7 +865,7 @@ static void dbg_print(u8 addr, const char *name, int status, const char *extra)
|
|||
write_unlock_irqrestore(&dbg_data.lck, flags);
|
||||
|
||||
if (dbg_data.tty != 0)
|
||||
pr_notice("%04X\t» %02X %-7.7s %4i «\t%s\n",
|
||||
pr_notice("%04X\t? %02X %-7.7s %4i ?\t%s\n",
|
||||
stamp, addr, name, status, extra);
|
||||
}
|
||||
|
||||
|
@ -1025,15 +1025,15 @@ static ssize_t show_inters(struct device *dev, struct device_attribute *attr,
|
|||
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "*test = %d\n",
|
||||
isr_statistics.test);
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "» ui = %d\n",
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "? ui = %d\n",
|
||||
isr_statistics.ui);
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "» uei = %d\n",
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "? uei = %d\n",
|
||||
isr_statistics.uei);
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "» pci = %d\n",
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "? pci = %d\n",
|
||||
isr_statistics.pci);
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "» uri = %d\n",
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "? uri = %d\n",
|
||||
isr_statistics.uri);
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "» sli = %d\n",
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "? sli = %d\n",
|
||||
isr_statistics.sli);
|
||||
n += scnprintf(buf + n, PAGE_SIZE - n, "*none = %d\n",
|
||||
isr_statistics.none);
|
||||
|
@ -2515,6 +2515,9 @@ static int ci13xxx_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
|
|||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static int ci13xxx_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int ci13xxx_stop(struct usb_gadget_driver *driver);
|
||||
/**
|
||||
* Device operations part of the API to the USB controller hardware,
|
||||
* which don't involve endpoints (or i/o)
|
||||
|
@ -2524,17 +2527,19 @@ static const struct usb_gadget_ops usb_gadget_ops = {
|
|||
.vbus_session = ci13xxx_vbus_session,
|
||||
.wakeup = ci13xxx_wakeup,
|
||||
.vbus_draw = ci13xxx_vbus_draw,
|
||||
.start = ci13xxx_start,
|
||||
.stop = ci13xxx_stop,
|
||||
};
|
||||
|
||||
/**
|
||||
* usb_gadget_probe_driver: register a gadget driver
|
||||
* ci13xxx_start: register a gadget driver
|
||||
* @driver: the driver being registered
|
||||
* @bind: the driver's bind callback
|
||||
*
|
||||
* Check usb_gadget_probe_driver() at <linux/usb/gadget.h> for details.
|
||||
* Check ci13xxx_start() at <linux/usb/gadget.h> for details.
|
||||
* Interrupts are enabled here.
|
||||
*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int ci13xxx_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct ci13xxx *udc = _udc;
|
||||
|
@ -2657,14 +2662,13 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
spin_unlock_irqrestore(udc->lock, flags);
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
/**
|
||||
* usb_gadget_unregister_driver: unregister a gadget driver
|
||||
* ci13xxx_stop: unregister a gadget driver
|
||||
*
|
||||
* Check usb_gadget_unregister_driver() at "usb_gadget.h" for details
|
||||
*/
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int ci13xxx_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct ci13xxx *udc = _udc;
|
||||
unsigned long i, flags;
|
||||
|
@ -2726,7 +2730,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
/******************************************************************************
|
||||
* BUS block
|
||||
|
@ -2901,12 +2904,23 @@ static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev,
|
|||
if (retval)
|
||||
goto remove_dbg;
|
||||
}
|
||||
|
||||
retval = usb_add_gadget_udc(dev, &udc->gadget);
|
||||
if (retval)
|
||||
goto remove_trans;
|
||||
|
||||
pm_runtime_no_callbacks(&udc->gadget.dev);
|
||||
pm_runtime_enable(&udc->gadget.dev);
|
||||
|
||||
_udc = udc;
|
||||
return retval;
|
||||
|
||||
remove_trans:
|
||||
if (udc->transceiver) {
|
||||
otg_set_peripheral(udc->transceiver, &udc->gadget);
|
||||
otg_put_transceiver(udc->transceiver);
|
||||
}
|
||||
|
||||
err("error = %i", retval);
|
||||
remove_dbg:
|
||||
#ifdef CONFIG_USB_GADGET_DEBUG_FILES
|
||||
|
@ -2936,6 +2950,7 @@ static void udc_remove(void)
|
|||
err("EINVAL");
|
||||
return;
|
||||
}
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
|
||||
if (udc->transceiver) {
|
||||
otg_set_peripheral(udc->transceiver, &udc->gadget);
|
||||
|
|
|
@ -710,11 +710,17 @@ static int dummy_pullup (struct usb_gadget *_gadget, int value)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int dummy_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int dummy_udc_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static const struct usb_gadget_ops dummy_ops = {
|
||||
.get_frame = dummy_g_get_frame,
|
||||
.wakeup = dummy_wakeup,
|
||||
.set_selfpowered = dummy_set_selfpowered,
|
||||
.pullup = dummy_pullup,
|
||||
.start = dummy_udc_start,
|
||||
.stop = dummy_udc_stop,
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
@ -747,8 +753,7 @@ static DEVICE_ATTR (function, S_IRUGO, show_function, NULL);
|
|||
* for each driver that registers: just add to a big root hub.
|
||||
*/
|
||||
|
||||
int
|
||||
usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int dummy_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct dummy *dum = the_controller;
|
||||
|
@ -812,10 +817,8 @@ usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
usb_hcd_poll_rh_status (dummy_to_hcd (dum));
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int
|
||||
usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
|
||||
static int dummy_udc_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct dummy *dum = the_controller;
|
||||
unsigned long flags;
|
||||
|
@ -845,7 +848,6 @@ usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
|
|||
usb_hcd_poll_rh_status (dummy_to_hcd (dum));
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL (usb_gadget_unregister_driver);
|
||||
|
||||
#undef is_enabled
|
||||
|
||||
|
@ -892,18 +894,28 @@ static int dummy_udc_probe (struct platform_device *pdev)
|
|||
return rc;
|
||||
}
|
||||
|
||||
rc = usb_add_gadget_udc(&pdev->dev, &dum->gadget);
|
||||
if (rc < 0)
|
||||
goto err_udc;
|
||||
|
||||
rc = device_create_file (&dum->gadget.dev, &dev_attr_function);
|
||||
if (rc < 0)
|
||||
device_unregister (&dum->gadget.dev);
|
||||
else
|
||||
goto err_dev;
|
||||
platform_set_drvdata(pdev, dum);
|
||||
return rc;
|
||||
|
||||
err_dev:
|
||||
usb_del_gadget_udc(&dum->gadget);
|
||||
err_udc:
|
||||
device_unregister(&dum->gadget.dev);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int dummy_udc_remove (struct platform_device *pdev)
|
||||
{
|
||||
struct dummy *dum = platform_get_drvdata (pdev);
|
||||
|
||||
usb_del_gadget_udc(&dum->gadget);
|
||||
platform_set_drvdata (pdev, NULL);
|
||||
device_remove_file (&dum->gadget.dev, &dev_attr_function);
|
||||
device_unregister (&dum->gadget.dev);
|
||||
|
@ -1863,7 +1875,6 @@ static void dummy_stop (struct usb_hcd *hcd)
|
|||
dum = hcd_to_dummy (hcd);
|
||||
|
||||
device_remove_file (dummy_dev(dum), &dev_attr_urbs);
|
||||
usb_gadget_unregister_driver (dum->driver);
|
||||
dev_info (dummy_dev(dum), "stopped\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -1927,6 +1927,10 @@ static int qe_pullup(struct usb_gadget *gadget, int is_on)
|
|||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static int fsl_qe_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int fsl_qe_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
/* defined in usb_gadget.h */
|
||||
static struct usb_gadget_ops qe_gadget_ops = {
|
||||
.get_frame = qe_get_frame,
|
||||
|
@ -1935,6 +1939,8 @@ static struct usb_gadget_ops qe_gadget_ops = {
|
|||
.vbus_session = qe_vbus_session,
|
||||
.vbus_draw = qe_vbus_draw,
|
||||
.pullup = qe_pullup,
|
||||
.start = fsl_qe_start,
|
||||
.stop = fsl_qe_stop,
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
|
@ -2320,7 +2326,7 @@ static irqreturn_t qe_udc_irq(int irq, void *_udc)
|
|||
/*-------------------------------------------------------------------------
|
||||
Gadget driver probe and unregister.
|
||||
--------------------------------------------------------------------------*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int fsl_qe_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
int retval;
|
||||
|
@ -2369,9 +2375,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
udc_controller->gadget.name, driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int fsl_qe_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct qe_ep *loop_ep;
|
||||
unsigned long flags;
|
||||
|
@ -2411,7 +2416,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
/* udc structure's alloc and setup, include ep-param alloc */
|
||||
static struct qe_udc __devinit *qe_udc_config(struct platform_device *ofdev)
|
||||
|
@ -2662,11 +2666,17 @@ static int __devinit qe_udc_probe(struct platform_device *ofdev)
|
|||
if (ret)
|
||||
goto err6;
|
||||
|
||||
ret = usb_add_gadget_udc(&ofdev->dev, &udc_controller->gadget);
|
||||
if (ret)
|
||||
goto err7;
|
||||
|
||||
dev_info(udc_controller->dev,
|
||||
"%s USB controller initialized as device\n",
|
||||
(udc_controller->soc_type == PORT_QE) ? "QE" : "CPM");
|
||||
return 0;
|
||||
|
||||
err7:
|
||||
device_unregister(&udc_controller->gadget.dev);
|
||||
err6:
|
||||
free_irq(udc_controller->usb_irq, udc_controller);
|
||||
err5:
|
||||
|
@ -2721,6 +2731,8 @@ static int __devexit qe_udc_remove(struct platform_device *ofdev)
|
|||
if (!udc_controller)
|
||||
return -ENODEV;
|
||||
|
||||
usb_del_gadget_udc(&udc_controller->gadget);
|
||||
|
||||
udc_controller->done = &done;
|
||||
tasklet_disable(&udc_controller->rx_tasklet);
|
||||
|
||||
|
|
|
@ -1232,6 +1232,9 @@ static int fsl_pullup(struct usb_gadget *gadget, int is_on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int fsl_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int fsl_stop(struct usb_gadget_driver *driver);
|
||||
/* defined in gadget.h */
|
||||
static struct usb_gadget_ops fsl_gadget_ops = {
|
||||
.get_frame = fsl_get_frame,
|
||||
|
@ -1240,6 +1243,8 @@ static struct usb_gadget_ops fsl_gadget_ops = {
|
|||
.vbus_session = fsl_vbus_session,
|
||||
.vbus_draw = fsl_vbus_draw,
|
||||
.pullup = fsl_pullup,
|
||||
.start = fsl_start,
|
||||
.stop = fsl_stop,
|
||||
};
|
||||
|
||||
/* Set protocol stall on ep0, protocol stall will automatically be cleared
|
||||
|
@ -1908,7 +1913,7 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)
|
|||
* Hook to gadget drivers
|
||||
* Called by initialization code of gadget drivers
|
||||
*----------------------------------------------------------------*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int fsl_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
int retval = -ENODEV;
|
||||
|
@ -1976,10 +1981,9 @@ out:
|
|||
retval);
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
/* Disconnect from gadget driver */
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int fsl_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct fsl_ep *loop_ep;
|
||||
unsigned long flags;
|
||||
|
@ -2022,7 +2026,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
PROC File System Support
|
||||
|
@ -2578,9 +2581,16 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
|
|||
ret = -ENOMEM;
|
||||
goto err_unregister;
|
||||
}
|
||||
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &udc_controller->gadget);
|
||||
if (ret)
|
||||
goto err_del_udc;
|
||||
|
||||
create_proc_file();
|
||||
return 0;
|
||||
|
||||
err_del_udc:
|
||||
dma_pool_destroy(udc_controller->td_pool);
|
||||
err_unregister:
|
||||
device_unregister(&udc_controller->gadget.dev);
|
||||
err_free_irq:
|
||||
|
@ -2612,6 +2622,8 @@ static int __exit fsl_udc_remove(struct platform_device *pdev)
|
|||
|
||||
if (!udc_controller)
|
||||
return -ENODEV;
|
||||
|
||||
usb_del_gadget_udc(&udc_controller->gadget);
|
||||
udc_controller->done = &done;
|
||||
|
||||
fsl_udc_clk_release();
|
||||
|
|
|
@ -1495,7 +1495,7 @@ static void init_controller(struct fusb300 *fusb300)
|
|||
/*------------------------------------------------------------------------*/
|
||||
static struct fusb300 *the_controller;
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int fusb300_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct fusb300 *fusb300 = the_controller;
|
||||
|
@ -1539,9 +1539,8 @@ error:
|
|||
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int fusb300_udc_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct fusb300 *fusb300 = the_controller;
|
||||
|
||||
|
@ -1557,7 +1556,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
static int fusb300_udc_pullup(struct usb_gadget *_gadget, int is_active)
|
||||
|
@ -1567,12 +1565,15 @@ static int fusb300_udc_pullup(struct usb_gadget *_gadget, int is_active)
|
|||
|
||||
static struct usb_gadget_ops fusb300_gadget_ops = {
|
||||
.pullup = fusb300_udc_pullup,
|
||||
.start = fusb300_udc_start,
|
||||
.stop = fusb300_udc_stop,
|
||||
};
|
||||
|
||||
static int __exit fusb300_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct fusb300 *fusb300 = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
usb_del_gadget_udc(&fusb300->gadget);
|
||||
iounmap(fusb300->reg);
|
||||
free_irq(platform_get_irq(pdev, 0), fusb300);
|
||||
|
||||
|
@ -1697,9 +1698,15 @@ static int __init fusb300_probe(struct platform_device *pdev)
|
|||
goto clean_up3;
|
||||
|
||||
init_controller(fusb300);
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &fusb300->gadget);
|
||||
if (ret)
|
||||
goto err_add_udc;
|
||||
|
||||
dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION);
|
||||
|
||||
return 0;
|
||||
err_add_udc:
|
||||
fusb300_free_request(&fusb300->ep[0]->ep, fusb300->ep0_req);
|
||||
|
||||
clean_up3:
|
||||
free_irq(ires->start, fusb300);
|
||||
|
|
|
@ -996,8 +996,14 @@ static int goku_get_frame(struct usb_gadget *_gadget)
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static int goku_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int goku_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static const struct usb_gadget_ops goku_ops = {
|
||||
.get_frame = goku_get_frame,
|
||||
.start = goku_start,
|
||||
.stop = goku_stop,
|
||||
// no remote wakeup
|
||||
// not selfpowered
|
||||
};
|
||||
|
@ -1344,7 +1350,7 @@ static struct goku_udc *the_controller;
|
|||
* disconnect is reported. then a host may connect again, or
|
||||
* the driver might get unbound.
|
||||
*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int goku_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct goku_udc *dev = the_controller;
|
||||
|
@ -1382,7 +1388,6 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
DBG(dev, "registered gadget driver '%s'\n", driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
static void
|
||||
stop_activity(struct goku_udc *dev, struct usb_gadget_driver *driver)
|
||||
|
@ -1408,7 +1413,7 @@ stop_activity(struct goku_udc *dev, struct usb_gadget_driver *driver)
|
|||
udc_enable(dev);
|
||||
}
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int goku_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct goku_udc *dev = the_controller;
|
||||
unsigned long flags;
|
||||
|
@ -1429,8 +1434,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
DBG(dev, "unregistered driver '%s'\n", driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
|
@ -1730,6 +1733,8 @@ static void goku_remove(struct pci_dev *pdev)
|
|||
|
||||
DBG(dev, "%s\n", __func__);
|
||||
|
||||
usb_del_gadget_udc(&dev->gadget);
|
||||
|
||||
BUG_ON(dev->driver);
|
||||
|
||||
#ifdef CONFIG_USB_GADGET_DEBUG_FILES
|
||||
|
@ -1854,6 +1859,10 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
goto err;
|
||||
}
|
||||
dev->registered = 1;
|
||||
retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
|
||||
if (retval)
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
|
|
|
@ -1237,9 +1237,14 @@ irq_handler_t intr_handler(int i)
|
|||
*******************************************************************************
|
||||
*/
|
||||
|
||||
static int imx_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int imx_udc_stop(struct usb_gadget_driver *driver);
|
||||
static const struct usb_gadget_ops imx_udc_ops = {
|
||||
.get_frame = imx_udc_get_frame,
|
||||
.wakeup = imx_udc_wakeup,
|
||||
.start = imx_udc_start,
|
||||
.stop = imx_udc_stop,
|
||||
};
|
||||
|
||||
static struct imx_udc_struct controller = {
|
||||
|
@ -1324,7 +1329,7 @@ static struct imx_udc_struct controller = {
|
|||
* USB gadget driver functions
|
||||
*******************************************************************************
|
||||
*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int imx_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct imx_udc_struct *imx_usb = &controller;
|
||||
|
@ -1368,9 +1373,8 @@ fail:
|
|||
imx_usb->gadget.dev.driver = NULL;
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int imx_udc_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct imx_udc_struct *imx_usb = &controller;
|
||||
|
||||
|
@ -1394,7 +1398,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
/*******************************************************************************
|
||||
* Module functions
|
||||
|
@ -1504,8 +1507,14 @@ static int __init imx_udc_probe(struct platform_device *pdev)
|
|||
imx_usb->timer.function = handle_config;
|
||||
imx_usb->timer.data = (unsigned long)imx_usb;
|
||||
|
||||
return 0;
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &imx_usb->gadget);
|
||||
if (ret)
|
||||
goto fail4;
|
||||
|
||||
return 0;
|
||||
fail4:
|
||||
for (i = 0; i < IMX_USB_NB_EP + 1; i++)
|
||||
free_irq(imx_usb->usbd_int[i], imx_usb);
|
||||
fail3:
|
||||
clk_put(clk);
|
||||
clk_disable(clk);
|
||||
|
@ -1525,6 +1534,7 @@ static int __exit imx_udc_remove(struct platform_device *pdev)
|
|||
struct imxusb_platform_data *pdata = pdev->dev.platform_data;
|
||||
int i;
|
||||
|
||||
usb_del_gadget_udc(&imx_usb->gadget);
|
||||
imx_udc_disable(imx_usb);
|
||||
del_timer(&imx_usb->timer);
|
||||
|
||||
|
|
|
@ -1321,7 +1321,9 @@ static int langwell_pullup(struct usb_gadget *_gadget, int is_on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int langwell_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int langwell_stop(struct usb_gadget_driver *driver);
|
||||
/* device controller usb_gadget_ops structure */
|
||||
static const struct usb_gadget_ops langwell_ops = {
|
||||
|
||||
|
@ -1342,6 +1344,9 @@ static const struct usb_gadget_ops langwell_ops = {
|
|||
|
||||
/* D+ pullup, software-controlled connect/disconnect to USB host */
|
||||
.pullup = langwell_pullup,
|
||||
|
||||
.start = langwell_start,
|
||||
.stop = langwell_stop,
|
||||
};
|
||||
|
||||
|
||||
|
@ -1852,7 +1857,7 @@ static DEVICE_ATTR(remote_wakeup, S_IWUSR, NULL, store_remote_wakeup);
|
|||
* the driver might get unbound.
|
||||
*/
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int langwell_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct langwell_udc *dev = the_controller;
|
||||
|
@ -1914,11 +1919,9 @@ err_unbind:
|
|||
dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
|
||||
/* unregister gadget driver */
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int langwell_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct langwell_udc *dev = the_controller;
|
||||
unsigned long flags;
|
||||
|
@ -1965,8 +1968,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
|
@ -3373,6 +3374,10 @@ static int langwell_udc_probe(struct pci_dev *pdev,
|
|||
if (retval)
|
||||
goto error;
|
||||
|
||||
retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
|
||||
if (retval)
|
||||
goto error;
|
||||
|
||||
retval = device_create_file(&pdev->dev, &dev_attr_langwell_udc);
|
||||
if (retval)
|
||||
goto error;
|
||||
|
@ -3403,6 +3408,7 @@ static int langwell_udc_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
|
||||
dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__);
|
||||
|
||||
usb_del_gadget_udc(&dev->gadget);
|
||||
/* disable interrupt and set controller to stop state */
|
||||
langwell_udc_stop(dev);
|
||||
|
||||
|
|
|
@ -1454,7 +1454,7 @@ static struct usb_ep_ops m66592_ep_ops = {
|
|||
/*-------------------------------------------------------------------------*/
|
||||
static struct m66592 *the_controller;
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int m66592_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct m66592 *m66592 = the_controller;
|
||||
|
@ -1506,9 +1506,8 @@ error:
|
|||
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int m66592_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct m66592 *m66592 = the_controller;
|
||||
unsigned long flags;
|
||||
|
@ -1533,7 +1532,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
m66592->driver = NULL;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int m66592_get_frame(struct usb_gadget *_gadget)
|
||||
|
@ -1544,12 +1542,16 @@ static int m66592_get_frame(struct usb_gadget *_gadget)
|
|||
|
||||
static struct usb_gadget_ops m66592_gadget_ops = {
|
||||
.get_frame = m66592_get_frame,
|
||||
.start = m66592_start,
|
||||
.stop = m66592_stop,
|
||||
};
|
||||
|
||||
static int __exit m66592_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct m66592 *m66592 = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
usb_del_gadget_udc(&m66592->gadget);
|
||||
|
||||
del_timer_sync(&m66592->timer);
|
||||
iounmap(m66592->reg);
|
||||
free_irq(platform_get_irq(pdev, 0), m66592);
|
||||
|
@ -1691,9 +1693,16 @@ static int __init m66592_probe(struct platform_device *pdev)
|
|||
|
||||
init_controller(m66592);
|
||||
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &m66592->gadget);
|
||||
if (ret)
|
||||
goto err_add_udc;
|
||||
|
||||
dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION);
|
||||
return 0;
|
||||
|
||||
err_add_udc:
|
||||
m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
|
||||
|
||||
clean_up3:
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
if (m66592->pdata->on_chip) {
|
||||
|
|
|
@ -1128,6 +1128,9 @@ static int mv_udc_pullup(struct usb_gadget *gadget, int is_on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mv_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int mv_udc_stop(struct usb_gadget_driver *driver);
|
||||
/* device controller usb_gadget_ops structure */
|
||||
static const struct usb_gadget_ops mv_ops = {
|
||||
|
||||
|
@ -1139,6 +1142,8 @@ static const struct usb_gadget_ops mv_ops = {
|
|||
|
||||
/* D+ pullup, software-controlled connect/disconnect to USB host */
|
||||
.pullup = mv_udc_pullup,
|
||||
.start = mv_udc_start,
|
||||
.stop = mv_udc_stop,
|
||||
};
|
||||
|
||||
static void mv_udc_testmode(struct mv_udc *udc, u16 index, bool enter)
|
||||
|
@ -1230,7 +1235,7 @@ static void stop_activity(struct mv_udc *udc, struct usb_gadget_driver *driver)
|
|||
}
|
||||
}
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int mv_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct mv_udc *udc = the_controller;
|
||||
|
@ -1270,9 +1275,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int mv_udc_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct mv_udc *udc = the_controller;
|
||||
unsigned long flags;
|
||||
|
@ -1296,7 +1300,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
static int
|
||||
udc_prime_status(struct mv_udc *udc, u8 direction, u16 status, bool empty)
|
||||
|
@ -1880,9 +1883,10 @@ static void gadget_release(struct device *_dev)
|
|||
static int mv_udc_remove(struct platform_device *dev)
|
||||
{
|
||||
struct mv_udc *udc = the_controller;
|
||||
|
||||
DECLARE_COMPLETION(done);
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
|
||||
udc->done = &done;
|
||||
|
||||
/* free memory allocated in probe */
|
||||
|
@ -2074,11 +2078,12 @@ int mv_udc_probe(struct platform_device *dev)
|
|||
|
||||
the_controller = udc;
|
||||
|
||||
goto out;
|
||||
retval = usb_add_gadget_udc(&dev->dev, &udc->gadget);
|
||||
if (!retval)
|
||||
return retval;
|
||||
error:
|
||||
if (udc)
|
||||
mv_udc_remove(udc->dev);
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
@ -1172,11 +1172,17 @@ net2272_pullup(struct usb_gadget *_gadget, int is_on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int net2272_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int net2272_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static const struct usb_gadget_ops net2272_ops = {
|
||||
.get_frame = net2272_get_frame,
|
||||
.wakeup = net2272_wakeup,
|
||||
.set_selfpowered = net2272_set_selfpowered,
|
||||
.pullup = net2272_pullup
|
||||
.pullup = net2272_pullup,
|
||||
.start = net2272_start,
|
||||
.stop = net2272_stop,
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
@ -1447,7 +1453,7 @@ net2272_ep0_start(struct net2272 *dev)
|
|||
* disconnect is reported. then a host may connect again, or
|
||||
* the driver might get unbound.
|
||||
*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int net2272_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct net2272 *dev = the_controller;
|
||||
|
@ -1487,7 +1493,6 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
static void
|
||||
stop_activity(struct net2272 *dev, struct usb_gadget_driver *driver)
|
||||
|
@ -1515,7 +1520,7 @@ stop_activity(struct net2272 *dev, struct usb_gadget_driver *driver)
|
|||
net2272_usb_reinit(dev);
|
||||
}
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int net2272_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct net2272 *dev = the_controller;
|
||||
unsigned long flags;
|
||||
|
@ -1538,7 +1543,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
dev_dbg(dev->dev, "unregistered driver '%s'\n", driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* handle ep-a/ep-b dma completions */
|
||||
|
@ -2217,6 +2221,8 @@ net2272_gadget_release(struct device *_dev)
|
|||
static void __devexit
|
||||
net2272_remove(struct net2272 *dev)
|
||||
{
|
||||
usb_del_gadget_udc(&dev->gadget);
|
||||
|
||||
/* start with the driver above us */
|
||||
if (dev->driver) {
|
||||
/* should have been done already by driver model core */
|
||||
|
@ -2310,8 +2316,14 @@ net2272_probe_fin(struct net2272 *dev, unsigned int irqflags)
|
|||
if (ret)
|
||||
goto err_dev_reg;
|
||||
|
||||
ret = usb_add_gadget_udc(dev->dev, &dev->gadget);
|
||||
if (ret)
|
||||
goto err_add_udc;
|
||||
|
||||
return 0;
|
||||
|
||||
err_add_udc:
|
||||
device_remove_file(dev->dev, &dev_attr_registers);
|
||||
err_dev_reg:
|
||||
device_unregister(&dev->gadget.dev);
|
||||
err_irq:
|
||||
|
|
|
@ -1410,11 +1410,17 @@ static int net2280_pullup(struct usb_gadget *_gadget, int is_on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int net2280_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int net2280_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static const struct usb_gadget_ops net2280_ops = {
|
||||
.get_frame = net2280_get_frame,
|
||||
.wakeup = net2280_wakeup,
|
||||
.set_selfpowered = net2280_set_selfpowered,
|
||||
.pullup = net2280_pullup,
|
||||
.start = net2280_start,
|
||||
.stop = net2280_stop,
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
@ -1930,7 +1936,7 @@ static void ep0_start (struct net2280 *dev)
|
|||
* disconnect is reported. then a host may connect again, or
|
||||
* the driver might get unbound.
|
||||
*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int net2280_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct net2280 *dev = the_controller;
|
||||
|
@ -1994,7 +2000,6 @@ err_unbind:
|
|||
dev->driver = NULL;
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
static void
|
||||
stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver)
|
||||
|
@ -2022,7 +2027,7 @@ stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver)
|
|||
usb_reinit (dev);
|
||||
}
|
||||
|
||||
int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
|
||||
static int net2280_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct net2280 *dev = the_controller;
|
||||
unsigned long flags;
|
||||
|
@ -2049,8 +2054,6 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
|
|||
DEBUG (dev, "unregistered driver '%s'\n", driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL (usb_gadget_unregister_driver);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
|
@ -2732,6 +2735,8 @@ static void net2280_remove (struct pci_dev *pdev)
|
|||
{
|
||||
struct net2280 *dev = pci_get_drvdata (pdev);
|
||||
|
||||
usb_del_gadget_udc(&dev->gadget);
|
||||
|
||||
BUG_ON(dev->driver);
|
||||
|
||||
/* then clean up the resources we allocated during probe() */
|
||||
|
@ -2916,6 +2921,9 @@ static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
retval = device_create_file (&pdev->dev, &dev_attr_registers);
|
||||
if (retval) goto done;
|
||||
|
||||
retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
|
||||
if (retval)
|
||||
goto done;
|
||||
return 0;
|
||||
|
||||
done:
|
||||
|
|
|
@ -1375,6 +1375,10 @@ static int omap_pullup(struct usb_gadget *gadget, int is_on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int omap_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int omap_udc_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static struct usb_gadget_ops omap_gadget_ops = {
|
||||
.get_frame = omap_get_frame,
|
||||
.wakeup = omap_wakeup,
|
||||
|
@ -1382,6 +1386,8 @@ static struct usb_gadget_ops omap_gadget_ops = {
|
|||
.vbus_session = omap_vbus_session,
|
||||
.vbus_draw = omap_vbus_draw,
|
||||
.pullup = omap_pullup,
|
||||
.start = omap_udc_start,
|
||||
.stop = omap_udc_stop,
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
@ -2102,7 +2108,7 @@ static inline int machine_without_vbus_sense(void)
|
|||
);
|
||||
}
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int omap_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
int status = -ENODEV;
|
||||
|
@ -2186,9 +2192,8 @@ done:
|
|||
omap_udc_enable_clock(0);
|
||||
return status;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
|
||||
static int omap_udc_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
unsigned long flags;
|
||||
int status = -ENODEV;
|
||||
|
@ -2222,8 +2227,6 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
|
|||
DBG("unregistered driver '%s'\n", driver->driver.name);
|
||||
return status;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
|
@ -2991,9 +2994,16 @@ known:
|
|||
|
||||
create_proc_file();
|
||||
status = device_add(&udc->gadget.dev);
|
||||
if (status)
|
||||
goto cleanup4;
|
||||
|
||||
status = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
|
||||
if (!status)
|
||||
return status;
|
||||
/* If fail, fall through */
|
||||
cleanup4:
|
||||
remove_proc_file();
|
||||
|
||||
#ifdef USE_ISO
|
||||
cleanup3:
|
||||
free_irq(pdev->resource[2].start, udc);
|
||||
|
@ -3029,6 +3039,8 @@ static int __exit omap_udc_remove(struct platform_device *pdev)
|
|||
|
||||
if (!udc)
|
||||
return -ENODEV;
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
if (udc->driver)
|
||||
return -EBUSY;
|
||||
|
||||
|
|
|
@ -1176,6 +1176,9 @@ static int pch_udc_pcd_vbus_draw(struct usb_gadget *gadget, unsigned int mA)
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static int pch_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int pch_udc_stop(struct usb_gadget_driver *driver);
|
||||
static const struct usb_gadget_ops pch_udc_ops = {
|
||||
.get_frame = pch_udc_pcd_get_frame,
|
||||
.wakeup = pch_udc_pcd_wakeup,
|
||||
|
@ -1183,6 +1186,8 @@ static const struct usb_gadget_ops pch_udc_ops = {
|
|||
.pullup = pch_udc_pcd_pullup,
|
||||
.vbus_session = pch_udc_pcd_vbus_session,
|
||||
.vbus_draw = pch_udc_pcd_vbus_draw,
|
||||
.start = pch_udc_start,
|
||||
.stop = pch_udc_stop,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -2690,7 +2695,7 @@ static int init_dma_pools(struct pch_udc_dev *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int pch_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct pch_udc_dev *dev = pch_udc;
|
||||
|
@ -2733,9 +2738,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
dev->connected = 1;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int pch_udc_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct pch_udc_dev *dev = pch_udc;
|
||||
|
||||
|
@ -2761,7 +2765,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
pch_udc_set_disconnect(dev);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
static void pch_udc_shutdown(struct pci_dev *pdev)
|
||||
{
|
||||
|
@ -2778,6 +2781,8 @@ static void pch_udc_remove(struct pci_dev *pdev)
|
|||
{
|
||||
struct pch_udc_dev *dev = pci_get_drvdata(pdev);
|
||||
|
||||
usb_del_gadget_udc(&dev->gadget);
|
||||
|
||||
/* gadget driver must not be registered */
|
||||
if (dev->driver)
|
||||
dev_err(&pdev->dev,
|
||||
|
@ -2953,6 +2958,9 @@ static int pch_udc_probe(struct pci_dev *pdev,
|
|||
|
||||
/* Put the device in disconnected state till a driver is bound */
|
||||
pch_udc_set_disconnect(dev);
|
||||
retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
|
||||
if (retval)
|
||||
goto finished;
|
||||
return 0;
|
||||
|
||||
finished:
|
||||
|
|
|
@ -1011,12 +1011,18 @@ static int pxa25x_udc_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static int pxa25x_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int pxa25x_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static const struct usb_gadget_ops pxa25x_udc_ops = {
|
||||
.get_frame = pxa25x_udc_get_frame,
|
||||
.wakeup = pxa25x_udc_wakeup,
|
||||
.vbus_session = pxa25x_udc_vbus_session,
|
||||
.pullup = pxa25x_udc_pullup,
|
||||
.vbus_draw = pxa25x_udc_vbus_draw,
|
||||
.start = pxa25x_start,
|
||||
.stop = pxa25x_stop,
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
@ -1263,7 +1269,7 @@ static void udc_enable (struct pxa25x_udc *dev)
|
|||
* disconnect is reported. then a host may connect again, or
|
||||
* the driver might get unbound.
|
||||
*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int pxa25x_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct pxa25x_udc *dev = the_controller;
|
||||
|
@ -1322,7 +1328,6 @@ fail:
|
|||
bind_fail:
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
static void
|
||||
stop_activity(struct pxa25x_udc *dev, struct usb_gadget_driver *driver)
|
||||
|
@ -1351,7 +1356,7 @@ stop_activity(struct pxa25x_udc *dev, struct usb_gadget_driver *driver)
|
|||
udc_reinit(dev);
|
||||
}
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int pxa25x_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct pxa25x_udc *dev = the_controller;
|
||||
|
||||
|
@ -1379,8 +1384,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
dump_state(dev);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
|
@ -2231,8 +2234,11 @@ static int __init pxa25x_udc_probe(struct platform_device *pdev)
|
|||
#endif
|
||||
create_debug_files(dev);
|
||||
|
||||
return 0;
|
||||
retval = usb_add_gadget_udc(&pdev->dev, &dev->gadget);
|
||||
if (!retval)
|
||||
return retval;
|
||||
|
||||
remove_debug_files(dev);
|
||||
#ifdef CONFIG_ARCH_LUBBOCK
|
||||
lubbock_fail0:
|
||||
free_irq(LUBBOCK_USB_DISC_IRQ, dev);
|
||||
|
@ -2261,6 +2267,7 @@ static int __exit pxa25x_udc_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct pxa25x_udc *dev = platform_get_drvdata(pdev);
|
||||
|
||||
usb_del_gadget_udc(&dev->gadget);
|
||||
if (dev->driver)
|
||||
return -EBUSY;
|
||||
|
||||
|
|
|
@ -1680,12 +1680,18 @@ 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 *));
|
||||
static int pxa27x_udc_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static const struct usb_gadget_ops pxa_udc_ops = {
|
||||
.get_frame = pxa_udc_get_frame,
|
||||
.wakeup = pxa_udc_wakeup,
|
||||
.pullup = pxa_udc_pullup,
|
||||
.vbus_session = pxa_udc_vbus_session,
|
||||
.vbus_draw = pxa_udc_vbus_draw,
|
||||
.start = pxa27x_udc_start,
|
||||
.stop = pxa27x_udc_stop,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1791,7 +1797,7 @@ static void udc_enable(struct pxa_udc *udc)
|
|||
}
|
||||
|
||||
/**
|
||||
* usb_gadget_probe_driver - Register gadget driver
|
||||
* pxa27x_start - Register gadget driver
|
||||
* @driver: gadget driver
|
||||
* @bind: bind function
|
||||
*
|
||||
|
@ -1805,7 +1811,7 @@ static void udc_enable(struct pxa_udc *udc)
|
|||
*
|
||||
* Returns 0 if no error, -EINVAL, -ENODEV, -EBUSY otherwise
|
||||
*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int pxa27x_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct pxa_udc *udc = the_controller;
|
||||
|
@ -1860,8 +1866,6 @@ add_fail:
|
|||
udc->gadget.dev.driver = NULL;
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
|
||||
/**
|
||||
* stop_activity - Stops udc endpoints
|
||||
|
@ -1888,12 +1892,12 @@ static void stop_activity(struct pxa_udc *udc, struct usb_gadget_driver *driver)
|
|||
}
|
||||
|
||||
/**
|
||||
* usb_gadget_unregister_driver - Unregister the gadget driver
|
||||
* pxa27x_udc_stop - Unregister the gadget driver
|
||||
* @driver: gadget driver
|
||||
*
|
||||
* Returns 0 if no error, -ENODEV, -EINVAL otherwise
|
||||
*/
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int pxa27x_udc_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct pxa_udc *udc = the_controller;
|
||||
|
||||
|
@ -1917,7 +1921,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
return otg_set_peripheral(udc->transceiver, NULL);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
/**
|
||||
* handle_ep0_ctrl_req - handle control endpoint control request
|
||||
|
@ -2516,9 +2519,14 @@ static int __init pxa_udc_probe(struct platform_device *pdev)
|
|||
driver_name, IRQ_USB, retval);
|
||||
goto err_irq;
|
||||
}
|
||||
retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
|
||||
if (retval)
|
||||
goto err_add_udc;
|
||||
|
||||
pxa_init_debugfs(udc);
|
||||
return 0;
|
||||
err_add_udc:
|
||||
free_irq(udc->irq, udc);
|
||||
err_irq:
|
||||
iounmap(udc->regs);
|
||||
err_map:
|
||||
|
@ -2537,6 +2545,7 @@ static int __exit pxa_udc_remove(struct platform_device *_dev)
|
|||
struct pxa_udc *udc = platform_get_drvdata(_dev);
|
||||
int gpio = udc->mach->gpio_pullup;
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
usb_gadget_unregister_driver(udc->driver);
|
||||
free_irq(udc->irq, udc);
|
||||
pxa_cleanup_debugfs(udc);
|
||||
|
|
|
@ -1410,7 +1410,7 @@ static struct usb_ep_ops r8a66597_ep_ops = {
|
|||
/*-------------------------------------------------------------------------*/
|
||||
static struct r8a66597 *the_controller;
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int r8a66597_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct r8a66597 *r8a66597 = the_controller;
|
||||
|
@ -1462,9 +1462,8 @@ error:
|
|||
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int r8a66597_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct r8a66597 *r8a66597 = the_controller;
|
||||
unsigned long flags;
|
||||
|
@ -1488,7 +1487,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
r8a66597->driver = NULL;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int r8a66597_get_frame(struct usb_gadget *_gadget)
|
||||
|
@ -1499,12 +1497,15 @@ static int r8a66597_get_frame(struct usb_gadget *_gadget)
|
|||
|
||||
static struct usb_gadget_ops r8a66597_gadget_ops = {
|
||||
.get_frame = r8a66597_get_frame,
|
||||
.start = r8a66597_start,
|
||||
.stop = r8a66597_stop,
|
||||
};
|
||||
|
||||
static int __exit r8a66597_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct r8a66597 *r8a66597 = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
usb_del_gadget_udc(&r8a66597->gadget);
|
||||
del_timer_sync(&r8a66597->timer);
|
||||
iounmap(r8a66597->reg);
|
||||
free_irq(platform_get_irq(pdev, 0), r8a66597);
|
||||
|
@ -1647,9 +1648,15 @@ static int __init r8a66597_probe(struct platform_device *pdev)
|
|||
|
||||
init_controller(r8a66597);
|
||||
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &r8a66597->gadget);
|
||||
if (ret)
|
||||
goto err_add_udc;
|
||||
|
||||
dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION);
|
||||
return 0;
|
||||
|
||||
err_add_udc:
|
||||
r8a66597_free_request(&r8a66597->ep[0].ep, r8a66597->ep0_req);
|
||||
clean_up3:
|
||||
free_irq(irq, r8a66597);
|
||||
clean_up2:
|
||||
|
|
|
@ -2574,7 +2574,7 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int s3c_hsotg_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct s3c_hsotg *hsotg = our_hsotg;
|
||||
|
@ -2745,9 +2745,8 @@ err:
|
|||
hsotg->gadget.dev.driver = NULL;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int s3c_hsotg_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct s3c_hsotg *hsotg = our_hsotg;
|
||||
int ep;
|
||||
|
@ -2775,7 +2774,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
static int s3c_hsotg_gadget_getframe(struct usb_gadget *gadget)
|
||||
{
|
||||
|
@ -2784,6 +2782,8 @@ static int s3c_hsotg_gadget_getframe(struct usb_gadget *gadget)
|
|||
|
||||
static struct usb_gadget_ops s3c_hsotg_gadget_ops = {
|
||||
.get_frame = s3c_hsotg_gadget_getframe,
|
||||
.start = s3c_hsotg_start,
|
||||
.stop = s3c_hsotg_stop,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -3403,6 +3403,10 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
|
|||
for (epnum = 0; epnum < S3C_HSOTG_EPS; epnum++)
|
||||
s3c_hsotg_initep(hsotg, &hsotg->eps[epnum], epnum);
|
||||
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget);
|
||||
if (ret)
|
||||
goto err_add_udc;
|
||||
|
||||
s3c_hsotg_create_debug(hsotg);
|
||||
|
||||
s3c_hsotg_dump(hsotg);
|
||||
|
@ -3410,6 +3414,11 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
|
|||
our_hsotg = hsotg;
|
||||
return 0;
|
||||
|
||||
err_add_udc:
|
||||
s3c_hsotg_gate(pdev, false);
|
||||
clk_disable(hsotg->clk);
|
||||
clk_put(hsotg->clk);
|
||||
|
||||
err_regs:
|
||||
iounmap(hsotg->regs);
|
||||
|
||||
|
@ -3427,6 +3436,8 @@ static int __devexit s3c_hsotg_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct s3c_hsotg *hsotg = platform_get_drvdata(pdev);
|
||||
|
||||
usb_del_gadget_udc(&hsotg->gadget);
|
||||
|
||||
s3c_hsotg_delete_debug(hsotg);
|
||||
|
||||
usb_gadget_unregister_driver(hsotg->driver);
|
||||
|
|
|
@ -1133,7 +1133,7 @@ static irqreturn_t s3c_hsudc_irq(int irq, void *_dev)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int s3c_hsudc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct s3c_hsudc *hsudc = the_controller;
|
||||
|
@ -1181,9 +1181,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int s3c_hsudc_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct s3c_hsudc *hsudc = the_controller;
|
||||
unsigned long flags;
|
||||
|
@ -1210,7 +1209,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
driver->driver.name);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
static inline u32 s3c_hsudc_read_frameno(struct s3c_hsudc *hsudc)
|
||||
{
|
||||
|
@ -1224,6 +1222,8 @@ static int s3c_hsudc_gadget_getframe(struct usb_gadget *gadget)
|
|||
|
||||
static struct usb_gadget_ops s3c_hsudc_gadget_ops = {
|
||||
.get_frame = s3c_hsudc_gadget_getframe,
|
||||
.start = s3c_hsudc_start,
|
||||
.stop = s3c_hsudc_stop,
|
||||
};
|
||||
|
||||
static int s3c_hsudc_probe(struct platform_device *pdev)
|
||||
|
@ -1311,7 +1311,15 @@ static int s3c_hsudc_probe(struct platform_device *pdev)
|
|||
|
||||
disable_irq(hsudc->irq);
|
||||
local_irq_enable();
|
||||
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &hsudc->gadget);
|
||||
if (ret)
|
||||
goto err_add_udc;
|
||||
|
||||
return 0;
|
||||
err_add_udc:
|
||||
clk_disable(hsudc->uclk);
|
||||
clk_put(hsudc->uclk);
|
||||
err_clk:
|
||||
free_irq(hsudc->irq, hsudc);
|
||||
err_irq:
|
||||
|
|
|
@ -1552,6 +1552,10 @@ static int s3c2410_vbus_draw(struct usb_gadget *_gadget, unsigned ma)
|
|||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static int s3c2410_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int s3c2410_udc_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static const struct usb_gadget_ops s3c2410_ops = {
|
||||
.get_frame = s3c2410_udc_get_frame,
|
||||
.wakeup = s3c2410_udc_wakeup,
|
||||
|
@ -1559,6 +1563,8 @@ static const struct usb_gadget_ops s3c2410_ops = {
|
|||
.pullup = s3c2410_udc_pullup,
|
||||
.vbus_session = s3c2410_udc_vbus_session,
|
||||
.vbus_draw = s3c2410_vbus_draw,
|
||||
.start = s3c2410_udc_start,
|
||||
.stop = s3c2410_udc_stop,
|
||||
};
|
||||
|
||||
static void s3c2410_udc_command(enum s3c2410_udc_cmd_e cmd)
|
||||
|
@ -1672,10 +1678,7 @@ static void s3c2410_udc_enable(struct s3c2410_udc *dev)
|
|||
s3c2410_udc_command(S3C2410_UDC_P_ENABLE);
|
||||
}
|
||||
|
||||
/*
|
||||
* usb_gadget_probe_driver
|
||||
*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int s3c2410_udc_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct s3c2410_udc *udc = the_controller;
|
||||
|
@ -1730,12 +1733,8 @@ register_error:
|
|||
udc->gadget.dev.driver = NULL;
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
/*
|
||||
* usb_gadget_unregister_driver
|
||||
*/
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int s3c2410_udc_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct s3c2410_udc *udc = the_controller;
|
||||
|
||||
|
@ -1955,6 +1954,10 @@ static int s3c2410_udc_probe(struct platform_device *pdev)
|
|||
goto err_vbus_irq;
|
||||
}
|
||||
|
||||
retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget);
|
||||
if (retval)
|
||||
goto err_add_udc;
|
||||
|
||||
if (s3c2410_udc_debugfs_root) {
|
||||
udc->regs_info = debugfs_create_file("registers", S_IRUGO,
|
||||
s3c2410_udc_debugfs_root,
|
||||
|
@ -1967,6 +1970,10 @@ static int s3c2410_udc_probe(struct platform_device *pdev)
|
|||
|
||||
return 0;
|
||||
|
||||
err_add_udc:
|
||||
if (udc_info && !udc_info->udc_command &&
|
||||
gpio_is_valid(udc_info->pullup_pin))
|
||||
gpio_free(udc_info->pullup_pin);
|
||||
err_vbus_irq:
|
||||
if (udc_info && udc_info->vbus_pin > 0)
|
||||
free_irq(gpio_to_irq(udc_info->vbus_pin), udc);
|
||||
|
@ -1992,6 +1999,8 @@ static int s3c2410_udc_remove(struct platform_device *pdev)
|
|||
unsigned int irq;
|
||||
|
||||
dev_dbg(&pdev->dev, "%s()\n", __func__);
|
||||
|
||||
usb_del_gadget_udc(&udc->gadget);
|
||||
if (udc->driver)
|
||||
return -EBUSY;
|
||||
|
||||
|
@ -2105,8 +2114,6 @@ static void __exit udc_exit(void)
|
|||
debugfs_remove(s3c2410_udc_debugfs_root);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
module_init(udc_init);
|
||||
module_exit(udc_exit);
|
||||
|
||||
|
|
|
@ -1704,6 +1704,10 @@ static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int musb_gadget_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *));
|
||||
static int musb_gadget_stop(struct usb_gadget_driver *driver);
|
||||
|
||||
static const struct usb_gadget_ops musb_gadget_operations = {
|
||||
.get_frame = musb_gadget_get_frame,
|
||||
.wakeup = musb_gadget_wakeup,
|
||||
|
@ -1711,6 +1715,8 @@ static const struct usb_gadget_ops musb_gadget_operations = {
|
|||
/* .vbus_session = musb_gadget_vbus_session, */
|
||||
.vbus_draw = musb_gadget_vbus_draw,
|
||||
.pullup = musb_gadget_pullup,
|
||||
.start = musb_gadget_start,
|
||||
.stop = musb_gadget_stop,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
@ -1835,7 +1841,16 @@ int __init musb_gadget_setup(struct musb *musb)
|
|||
if (status != 0) {
|
||||
put_device(&musb->g.dev);
|
||||
the_gadget = NULL;
|
||||
return status;
|
||||
}
|
||||
status = usb_add_gadget_udc(musb->controller, &musb->g);
|
||||
if (status)
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
device_unregister(&musb->g.dev);
|
||||
the_gadget = NULL;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1844,6 +1859,7 @@ void musb_gadget_cleanup(struct musb *musb)
|
|||
if (musb != the_gadget)
|
||||
return;
|
||||
|
||||
usb_del_gadget_udc(&musb->g);
|
||||
device_unregister(&musb->g.dev);
|
||||
the_gadget = NULL;
|
||||
}
|
||||
|
@ -1860,7 +1876,7 @@ void musb_gadget_cleanup(struct musb *musb)
|
|||
* @param bind the driver's bind function
|
||||
* @return <0 if error, 0 if everything is fine
|
||||
*/
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int musb_gadget_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct musb *musb = the_gadget;
|
||||
|
@ -1962,7 +1978,6 @@ err1:
|
|||
err0:
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
static void stop_activity(struct musb *musb, struct usb_gadget_driver *driver)
|
||||
{
|
||||
|
@ -2012,7 +2027,7 @@ static void stop_activity(struct musb *musb, struct usb_gadget_driver *driver)
|
|||
*
|
||||
* @param driver the gadget driver to unregister
|
||||
*/
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int musb_gadget_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct musb *musb = the_gadget;
|
||||
unsigned long flags;
|
||||
|
@ -2071,8 +2086,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
|
|
|
@ -725,7 +725,7 @@ static int usbhsg_try_stop(struct usbhs_priv *priv, u32 status)
|
|||
*
|
||||
*/
|
||||
struct usbhsg_gpriv *the_controller;
|
||||
int usb_gadget_probe_driver(struct usb_gadget_driver *driver,
|
||||
static int usbhsg_gadget_start(struct usb_gadget_driver *driver,
|
||||
int (*bind)(struct usb_gadget *))
|
||||
{
|
||||
struct usbhsg_gpriv *gpriv = the_controller;
|
||||
|
@ -775,9 +775,8 @@ add_fail:
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_probe_driver);
|
||||
|
||||
int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
||||
static int usbhsg_gadget_stop(struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct usbhsg_gpriv *gpriv = the_controller;
|
||||
struct usbhs_priv *priv;
|
||||
|
@ -806,7 +805,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_gadget_unregister_driver);
|
||||
|
||||
/*
|
||||
* usb gadget ops
|
||||
|
@ -821,6 +819,8 @@ static int usbhsg_get_frame(struct usb_gadget *gadget)
|
|||
|
||||
static struct usb_gadget_ops usbhsg_gadget_ops = {
|
||||
.get_frame = usbhsg_get_frame,
|
||||
.start = usbhsg_gadget_start,
|
||||
.stop = usbhsg_gadget_stop,
|
||||
};
|
||||
|
||||
static int usbhsg_start(struct usbhs_priv *priv)
|
||||
|
@ -840,6 +840,7 @@ int __devinit usbhs_mod_gadget_probe(struct usbhs_priv *priv)
|
|||
struct device *dev = usbhs_priv_to_dev(priv);
|
||||
int pipe_size = usbhs_get_dparam(priv, pipe_size);
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
gpriv = kzalloc(sizeof(struct usbhsg_gpriv), GFP_KERNEL);
|
||||
if (!gpriv) {
|
||||
|
@ -850,6 +851,7 @@ int __devinit usbhs_mod_gadget_probe(struct usbhs_priv *priv)
|
|||
uep = kzalloc(sizeof(struct usbhsg_uep) * pipe_size, GFP_KERNEL);
|
||||
if (!uep) {
|
||||
dev_err(dev, "Could not allocate ep\n");
|
||||
ret = -ENOMEM;
|
||||
goto usbhs_mod_gadget_probe_err_gpriv;
|
||||
}
|
||||
|
||||
|
@ -911,20 +913,28 @@ int __devinit usbhs_mod_gadget_probe(struct usbhs_priv *priv)
|
|||
|
||||
the_controller = gpriv;
|
||||
|
||||
ret = usb_add_gadget_udc(dev, &gpriv->gadget);
|
||||
if (ret)
|
||||
goto err_add_udc;
|
||||
|
||||
|
||||
dev_info(dev, "gadget probed\n");
|
||||
|
||||
return 0;
|
||||
err_add_udc:
|
||||
kfree(gpriv->uep);
|
||||
|
||||
usbhs_mod_gadget_probe_err_gpriv:
|
||||
kfree(gpriv);
|
||||
|
||||
return -ENOMEM;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void __devexit usbhs_mod_gadget_remove(struct usbhs_priv *priv)
|
||||
{
|
||||
struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv);
|
||||
|
||||
usb_del_gadget_udc(&gpriv->gadget);
|
||||
kfree(gpriv->uep);
|
||||
kfree(gpriv);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче