usb gadget: introduce usb_gadget_probe_driver
Subsystems (6)
RFC PATCH 1/1 usb gadget: introduce usb_gadget_probe_driver
This is like usb_gadget_register_driver with the only difference that it gets the bind function as parameter instead of using driver->bind. This allows fixing section mismatches like
WARNING: drivers/usb/gadget/g_printer.o(.data+0xc): Section mismatch in reference from the variable printer_driver to the function .init.text:printer_bind()
The variable printer_driver references
the function __init printer_bind()
by using usb_gadget_probe_driver with driver->bind = NULL. When all drivers are fixed to use the new function the bind member of struct usb_gadget_driver can go away.
---
Hello,
there is an alternative patch in Greg's tree [1], but IMHO mine is better as it doesn't need __ref.
Thoughts?
Uwe
drivers/usb/gadget/amd5536udc.c | 9 +++++---- drivers/usb/gadget/at91_udc.c | 9 +++++---- drivers/usb/gadget/atmel_usba_udc.c | 7 ++++--- drivers/usb/gadget/ci13xxx_udc.c | 16 ++++++++-------- drivers/usb/gadget/dummy_hcd.c | 8 ++++---- drivers/usb/gadget/fsl_qe_udc.c | 12 ++++++------ drivers/usb/gadget/fsl_udc_core.c | 10 +++++----- drivers/usb/gadget/goku_udc.c | 9 +++++---- drivers/usb/gadget/imx_udc.c | 9 +++++---- drivers/usb/gadget/langwell_udc.c | 9 +++++---- drivers/usb/gadget/lh7a40x_udc.c | 9 +++++---- drivers/usb/gadget/m66592-udc.c | 9 +++++---- drivers/usb/gadget/net2280.c | 8 ++++---- drivers/usb/gadget/omap_udc.c | 10 +++++----- drivers/usb/gadget/pxa25x_udc.c | 9 +++++---- drivers/usb/gadget/pxa27x_udc.c | 12 +++++++----- drivers/usb/gadget/r8a66597-udc.c | 9 +++++---- drivers/usb/gadget/s3c-hsotg.c | 9 +++++---- drivers/usb/gadget/s3c2410_udc.c | 14 +++++++------- drivers/usb/musb/musb_gadget.c | 8 ++++---- include/linux/usb/gadget.h | 27 ++++++++++++++++++++++++--- 21 files changed, 128 insertions(+), 94 deletions(-)
drivers/usb/gadget/amd5536udc.c +5 -4
@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp; -if (!driver || !driver->bind || !driver->setup +if (!driver || bind || !driver->setup || driver->speed !=USB_SPEED_HIGH )return -EINVAL ;if (!dev)
@@ -1972,7 +1973,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) dev->driver = driver; dev->gadget.dev.driver = &driver->driver; - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);/* Some gadget drivers use both ep0 directions. * NOTE: to gadget driver, ep0 is just one endpoint...
@@ -2000,7 +2001,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* shutdown requests and disconnect from gadget */ static void
drivers/usb/gadget/at91_udc.c +5 -4
@@ -1570,14 +1570,15 @@ static irqreturn_t at91_vbus_irq(int irq, void *_udc)return IRQ_HANDLED ; } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct at91_udc *udc = &controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->setup) {DBG ("bad parameter.\n" );return -EINVAL ;
@@ -1594,9 +1595,9 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver) udc->enabled =1 ; udc->selfpowered =1 ; - retval = driver->bind (&udc->gadget); + retval =bind (&udc->gadget);if (retval) { -DBG ("driver->bind() returned %d\n" , retval); +DBG ("bind() returned %d\n" , retval); udc->driver =NULL ; udc->gadget.dev.driver =NULL ;dev_set_drvdata (&udc->gadget.dev,NULL );
drivers/usb/gadget/atmel_usba_udc.c +4 -3
@@ -1789,7 +1789,8 @@ out:return IRQ_HANDLED ; } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct usba_udc *udc = &the_udc;unsigned long flags;
@@ -1812,7 +1813,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)clk_enable (udc->pclk);clk_enable (udc->hclk); - ret = driver->bind (&udc->gadget); + ret =bind (&udc->gadget);if (ret) {DBG (DBG_ERR ,"Could not bind to driver %s: error %d\n" , driver->driver.name, ret);
@@ -1841,7 +1842,7 @@ err_driver_bind: udc->gadget.dev.driver =NULL ;return ret; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/ci13xxx_udc.c +8 -8
@@ -2340,12 +2340,13 @@ static const struct usb_ep_ops usb_ep_ops = {static const struct usb_gadget_ops usb_gadget_ops;/** -* usb_gadget_register_driver: register a gadget driver +* usb_gadget_probe_driver: register a gadget driver * -* Check usb_gadget_register_driver() at "usb_gadget.h" for details -* Interrupts are enabled here +* Check usb_gadget_probe_driver() at "usb_gadget.h" for details. +* Interrupts are enabled here. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct ci13xxx *udc = _udc;unsigned long i, k, flags;
@@ -2354,7 +2355,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)trace ("%p" , driver); if (driver == NULL || - driver->bind == NULL || + bind == NULL || driver->unbind == NULL || driver->setup == NULL || driver->disconnect == NULL ||
@@ -2430,7 +2431,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc->gadget.dev.driver = &driver->driver;spin_unlock_irqrestore (udc->lock, flags); - retval = driver->bind (&udc->gadget);/* MAY SLEEP */ + retval =bind (&udc->gadget);/* MAY SLEEP */ spin_lock_irqsave (udc->lock, flags);if (retval) {
@@ -2447,7 +2448,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)usb_gadget_unregister_driver (driver);return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/** * usb_gadget_unregister_driver: unregister a gadget driver
@@ -2462,7 +2463,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)trace ("%p" , driver); if (driver == NULL || - driver->bind == NULL || driver->unbind == NULL || driver->setup == NULL || driver->disconnect == NULL ||
drivers/usb/gadget/dummy_hcd.c +4 -4
@@ -748,7 +748,8 @@ static DEVICE_ATTR (function, S_IRUGO, show_function, NULL);*/ int -usb_gadget_register_driver (struct usb_gadget_driver *driver) +usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct dummy *dum = the_controller;int retval, i;
@@ -757,8 +758,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver)return -EINVAL ;if (dum->driver)return -EBUSY ; -if (!driver->bind || !driver->setup - || driver->speed ==USB_SPEED_UNKNOWN ) +if (!bind || !driver->setup || driver->speed ==USB_SPEED_UNKNOWN )return -EINVAL ;/*
@@ -796,7 +796,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver) dum->gadget.dev.driver = &driver->driver;dev_dbg (udc_dev (dum),"binding gadget driver '%s'\n" , driver->driver.name); - retval = driver->bind (&dum->gadget); + retval =bind (&dum->gadget);if (retval) { dum->driver =NULL ; dum->gadget.dev.driver =NULL ;
drivers/usb/gadget/fsl_qe_udc.c +6 -6
@@ -2301,9 +2301,10 @@ static irqreturn_t qe_udc_irq(int irq, void *_udc) }/*------------------------------------------------------------------------- -Gadget driver register and unregister. +Gadget driver probe and unregister. --------------------------------------------------------------------------*/ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval;unsigned long flags =0 ;
@@ -2314,8 +2315,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || (driver->speed !=USB_SPEED_FULL && driver->speed !=USB_SPEED_HIGH ) - || !driver->bind || !driver->disconnect - || !driver->setup) + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;if (udc_controller->driver)
@@ -2331,7 +2331,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc_controller->gadget.speed = (enum usb_device_speed )(driver->speed);spin_unlock_irqrestore (&udc_controller->lock, flags); - retval = driver->bind (&udc_controller->gadget); + retval =bind (&udc_controller->gadget);if (retval) {dev_err (udc_controller->dev,"bind to %s --> %d" , driver->driver.name, retval);
@@ -2352,7 +2352,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc_controller->gadget.name, driver->driver.name);return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/fsl_udc_core.c +5 -5
@@ -1765,7 +1765,8 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)* Hook to gadget drivers * Called by initialization code of gadget drivers *----------------------------------------------------------------*/ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval = -ENODEV ;unsigned long flags =0 ;
@@ -1775,8 +1776,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || (driver->speed !=USB_SPEED_FULL && driver->speed !=USB_SPEED_HIGH ) - || !driver->bind || !driver->disconnect - || !driver->setup) + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;if (udc_controller->driver)
@@ -1792,7 +1792,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)spin_unlock_irqrestore (&udc_controller->lock, flags);/* bind udc driver to gadget driver */ - retval = driver->bind (&udc_controller->gadget); + retval =bind (&udc_controller->gadget);if (retval) {VDBG ("bind to %s --> %d" , driver->driver.name, retval); udc_controller->gadget.dev.driver =NULL ;
@@ -1814,7 +1814,7 @@ out: retval);return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* Disconnect from gadget driver */ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
drivers/usb/gadget/goku_udc.c +5 -4
@@ -1343,14 +1343,15 @@ static struct goku_udc *the_controller;* disconnect is reported. then a host may connect again, or * the driver might get unbound. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct goku_udc *dev = the_controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -1363,7 +1364,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) driver->driver.bus =NULL ; dev->driver = driver; dev->gadget.dev.driver = &driver->driver; - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DBG (dev,"bind to driver %s --> error %d\n" , driver->driver.name, retval);
@@ -1380,7 +1381,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)DBG (dev,"registered gadget driver '%s'\n" , driver->driver.name);return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);static void stop_activity (struct goku_udc *dev,struct usb_gadget_driver *driver)
drivers/usb/gadget/imx_udc.c +5 -4
@@ -1319,14 +1319,15 @@ static struct imx_udc_struct controller = {* USB gadged driver functions ******************************************************************************* */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct imx_udc_struct *imx_usb = &controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -1342,7 +1343,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) retval =device_add (&imx_usb->gadget.dev);if (retval) goto fail; - retval = driver->bind (&imx_usb->gadget); + retval =bind (&imx_usb->gadget);if (retval) {D_ERR (imx_usb->dev,"<%s> bind to driver %s --> error %d\n" , __func__, driver->driver.name, retval);
@@ -1362,7 +1363,7 @@ fail: imx_usb->gadget.dev.driver =NULL ;return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/langwell_udc.c +5 -4
@@ -1807,7 +1807,8 @@ static DEVICE_ATTR(langwell_udc, S_IRUGO, show_langwell_udc, NULL);* the driver might get unbound. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct langwell_udc *dev = the_controller;unsigned long flags;
@@ -1830,7 +1831,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)spin_unlock_irqrestore (&dev->lock, flags); - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DBG (dev,"bind to driver %s --> %d\n" , driver->driver.name, retval);
@@ -1868,7 +1869,7 @@ err_unbind:DBG (dev,"<--- %s()\n" , __func__);return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* unregister gadget driver */
@@ -1882,7 +1883,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)DBG (dev,"---> %s()\n" , __func__); -if (unlikely (!driver || !driver->bind || !driver->unbind)) +if (unlikely (!driver || !driver->unbind))return -EINVAL ;/* unbind OTG transceiver */
drivers/usb/gadget/lh7a40x_udc.c +5 -4
@@ -408,7 +408,8 @@ static void udc_enable(struct lh7a40x_udc *dev)/* Register entry point for the peripheral controller driver. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct lh7a40x_udc *dev = the_controller;int retval;
@@ -417,7 +418,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || driver->speed !=USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -431,7 +432,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) dev->gadget.dev.driver = &driver->driver;device_add (&dev->gadget.dev); - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {printk (KERN_WARNING "%s: bind to driver %s --> error %d\n" , dev->gadget.name, driver->driver.name, retval);
@@ -454,7 +455,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* Unregister entry point for the peripheral controller driver.
drivers/usb/gadget/m66592-udc.c +5 -4
@@ -1454,14 +1454,15 @@ static struct usb_ep_ops m66592_ep_ops = {/*-------------------------------------------------------------------------*/ static struct m66592 *the_controller; -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct m66592 *m66592 = the_controller;int retval;if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind + || !bind || !driver->setup)return -EINVAL ;if (!m66592)
@@ -1480,7 +1481,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) goto error; } - retval = driver->bind (&m66592->gadget); + retval =bind (&m66592->gadget);if (retval) {pr_err ("bind to driver error (%d)\n" , retval);device_del (&m66592->gadget.dev);
@@ -1505,7 +1506,7 @@ error:return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/net2280.c +4 -4
@@ -1929,7 +1929,8 @@ 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_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct net2280 *dev = the_controller;int retval;
@@ -1941,8 +1942,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)*/ if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind - || !driver->setup) + || !bind || !driver->setup)return -EINVAL ;if (!dev)return -ENODEV ;
@@ -1957,7 +1957,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver) driver->driver.bus =NULL ; dev->driver = driver; dev->gadget.dev.driver = &driver->driver; - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DEBUG (dev,"bind to driver %s --> %d\n" , driver->driver.name, retval);
drivers/usb/gadget/omap_udc.c +5 -5
@@ -2102,7 +2102,8 @@ static inline int machine_without_vbus_sense(void) ); } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int status = -ENODEV ;struct omap_ep *ep;
@@ -2114,8 +2115,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)if (!driver// FIXME if otg, check: driver->is_otg || driver->speed <USB_SPEED_FULL - || !driver->bind - || !driver->setup) + || !bind || !driver->setup)return -EINVAL ;spin_lock_irqsave (&udc->lock, flags);
@@ -2145,7 +2145,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)if (udc->dc_clk !=NULL )omap_udc_enable_clock (1 ); - status = driver->bind (&udc->gadget); + status =bind (&udc->gadget);if (status) {DBG ("bind to %s --> %d\n" , driver->driver.name, status); udc->gadget.dev.driver =NULL ;
@@ -2186,7 +2186,7 @@ done:omap_udc_enable_clock (0 );return status; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/pxa25x_udc.c +5 -4
@@ -1280,14 +1280,15 @@ 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_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct pxa25x_udc *dev = the_controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -1308,7 +1309,7 @@ fail: dev->gadget.dev.driver =NULL ;return retval; } - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DMSG ("bind to driver %s --> error %d\n" , driver->driver.name, retval);
@@ -1338,7 +1339,7 @@ fail: bind_fail:return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);static void stop_activity (struct pxa25x_udc *dev,struct usb_gadget_driver *driver)
drivers/usb/gadget/pxa27x_udc.c +7 -5
@@ -1792,8 +1792,9 @@ static void udc_enable(struct pxa_udc *udc) }/** -* usb_gadget_register_driver - Register gadget driver +* usb_gadget_probe_driver - Register gadget driver * @driver: gadget driver +* @bind: bind function * * When a driver is successfully registered, it will receive control requests * including set_configuration(), which enables non-control requests. Then
@@ -1805,12 +1806,13 @@ static void udc_enable(struct pxa_udc *udc)* * Returns 0 if no error, -EINVAL, -ENODEV, -EBUSY otherwise */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct pxa_udc *udc = the_controller;int retval; -if (!driver || driver->speed <USB_SPEED_FULL || !driver->bind +if (!driver || driver->speed <USB_SPEED_FULL || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;if (!udc)
@@ -1828,7 +1830,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)dev_err (udc->dev,"device_add error %d\n" , retval); goto add_fail; } - retval = driver->bind (&udc->gadget); + retval =bind (&udc->gadget);if (retval) {dev_err (udc->dev,"bind to driver %s --> error %d\n" , driver->driver.name, retval);
@@ -1859,7 +1861,7 @@ add_fail: udc->gadget.dev.driver =NULL ;return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/**
drivers/usb/gadget/r8a66597-udc.c +5 -4
@@ -1405,14 +1405,15 @@ static struct usb_ep_ops r8a66597_ep_ops = {/*-------------------------------------------------------------------------*/ static struct r8a66597 *the_controller; -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct r8a66597 *r8a66597 = the_controller;int retval;if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind + || !bind || !driver->setup)return -EINVAL ;if (!r8a66597)
@@ -1431,7 +1432,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) goto error; } - retval = driver->bind (&r8a66597->gadget); + retval =bind (&r8a66597->gadget);if (retval) {printk (KERN_ERR "bind to driver error (%d)\n" , retval);device_del (&r8a66597->gadget.dev);
@@ -1456,7 +1457,7 @@ error:return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/s3c-hsotg.c +5 -4
@@ -2478,7 +2478,8 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg)return 0 ; } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct s3c_hsotg *hsotg = our_hsotg;int ret;
@@ -2498,7 +2499,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)dev_err (hsotg->dev,"%s: bad speed\n" , __func__); } -if (!driver->bind || !driver->setup) { +if (!bind || !driver->setup) {dev_err (hsotg->dev,"%s: missing entry points\n" , __func__);return -EINVAL ; }
@@ -2517,7 +2518,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) goto err; } - ret = driver->bind (&hsotg->gadget); + ret =bind (&hsotg->gadget);if (ret) {dev_err (hsotg->dev,"failed bind %s\n" , driver->driver.name);
@@ -2641,7 +2642,7 @@ err: hsotg->gadget.dev.driver =NULL ;return ret; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/s3c2410_udc.c +7 -7
@@ -1628,9 +1628,10 @@ static void s3c2410_udc_enable(struct s3c2410_udc *dev) }/* -* usb_gadget_register_driver +* usb_gadget_probe_driver */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct s3c2410_udc *udc = the_controller;int retval;
@@ -1645,10 +1646,9 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (udc->driver)return -EBUSY ; -if (!driver->bind || !driver->setup - || driver->speed <USB_SPEED_FULL ) { +if (!bind || !driver->setup || driver->speed <USB_SPEED_FULL ) {printk (KERN_ERR "Invalid driver: bind %p setup %p speed %d\n" , - driver->bind, driver->setup, driver->speed); + bind, driver->setup, driver->speed);return -EINVAL ; }#if defined(MODULE )
@@ -1671,7 +1671,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)dprintk (DEBUG_NORMAL ,"binding gadget driver '%s'\n" , driver->driver.name); -if ((retval = driver->bind (&udc->gadget)) !=0 ) { +if ((retval =bind (&udc->gadget)) !=0 ) {device_del (&udc->gadget.dev); goto register_error; }
@@ -2045,7 +2045,7 @@ static void __exit udc_exit(void) }EXPORT_SYMBOL (usb_gadget_unregister_driver); -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);module_init (udc_init);module_exit (udc_exit);
drivers/usb/musb/musb_gadget.c +4 -4
@@ -1698,7 +1698,8 @@ void musb_gadget_cleanup(struct musb *musb)* @param driver the gadget driver * @return <0 if error, 0 if everything is fine */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval;unsigned long flags;
@@ -1706,8 +1707,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind - || !driver->setup) + || !bind || !driver->setup)return -EINVAL ;/* driver must be initialized to support peripheral mode */
@@ -1735,7 +1735,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)spin_unlock_irqrestore (&musb->lock, flags);if (retval ==0 ) { - retval = driver->bind (&musb->g); + retval =bind (&musb->g);if (retval !=0 ) {DBG (3 ,"bind to driver %s failed --> %d\n" , driver->driver.name, retval);
include/linux/usb/gadget.h +24 -3
@@ -798,17 +798,38 @@ struct usb_gadget_driver {*/ /** +* usb_gadget_probe_driver - probe a gadget driver +* @driver: the driver being registered +* Context: can sleep +* +* Call this in your gadget driver's module initialization function, +* to tell the underlying usb controller driver about your driver. +* The bind() function will be called to bind it to a gadget before this +* registration call returns. It's expected that the bind() function will +* be in init sections. +*/ +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)); + +/** * usb_gadget_register_driver - register a gadget driver -* @driver:the driver being registered +* @driver: the driver being registered * Context: can sleep * * Call this in your gadget driver's module initialization function, * to tell the underlying usb controller driver about your driver. * The driver's bind() function will be called to bind it to a * gadget before this registration call returns. It's expected that -* the bind() functions will be in init sections. +* the bind() functions will be in init sections. As this results in +* a section mismatch better use usb_gadget_probe_driver directly though. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver); +static inline int usb_gadget_register_driver (struct usb_gadget_driver *driver) +{ +if (!driver) +return -EINVAL ; + +return usb_gadget_probe_driver (driver, driver->bind); +}/** * usb_gadget_unregister_driver - unregister a gadget driver
Signature · 1 line
1.7.1
RFC PATCH 1/1 usb gadget: introduce usb_gadget_probe_driver
Quoted 8 lines
drivers/usb/gadget/amd5536udc.c +0
-0@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */
drivers/usb/gadget/amd5536udc.c static int setup_ep0(struct udc *dev) · line 1964
Quoted 10 lines
drivers/usb/gadget/amd5536udc.c +3
-2-int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp; - if (!driver || !driver->bind || !driver->setup + if (!driver || bind || !driver->setup
Is it intentional that !driver->bind has become just bind in this case? That doesn't seem to happen in the other cases.
julia
RFC PATCH 1/1 usb gadget: introduce usb_gadget_probe_driver
Quoted 16 lines · Julia Lawall
Quoted 16 lines
drivers/usb/gadget/amd5536udc.c +2
-1@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp;
Quoted 5 lines
drivers/usb/gadget/amd5536udc.c static int setup_ep0(struct udc *dev) · line 1964
Quoted 2 lines
drivers/usb/gadget/amd5536udc.c +1
-1- if (!driver || !driver->bind || !driver->setup + if (!driver || bind || !driver->setupIs it intentional that !driver->bind has become just bind in this case? That doesn't seem to happen in the other cases.
Yes, this is what the patch is about. bind got a parameter to the probe function. This is used in favour of driver->bind to allow driver to live in .data and bind to live in .init.text without a section mismatch.
So the other cases are broken. I'll recheck.
Thanks
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |
RFC PATCH 1/1 usb gadget: introduce usb_gadget_probe_driver
In reply to Uwe Kleine-KönigQuoted 17 lines · Uwe Kleine-K?nig
This is like
usb_gadget_register_driverwith the only difference that it gets the bind function as parameter instead of usingdriver->bind. This allows fixing section mismatches likeWARNING: drivers/usb/gadget/g_printer.o(.data+0xc): Section mismatch in reference from the variable
printer_driverto the function .init.text:printer_bind()
The variableprinter_driverreferences
the function__initprinter_bind()by using
usb_gadget_probe_driverwithdriver->bind= NULL. When all drivers are fixed to use the new function the bind member of structusb_gadget_drivercan go away.Signed-off-by Uwe Kleine-K?nig <[email protected]>Cc Michal Nazarewicz <[email protected]>Cc Greg Kroah-Hartman <[email protected]>
Quoted 7 lines
---
Hello,there is an alternative patch in Greg's tree [1], but IMHO mine is better as it doesn't need
__ref.Thoughts?
Personally I don't see advantage of this over changing the __init to __ref. Or am I missing something? I see your patch as an unnecessary API change. The way I understand it, __ref was introduced exactly for cases like this one where function is referenced from "normal" data but used only during init. Could you try to clarify for me why you think your solution is better then mine?
Signature · 4 lines
Best regards, _ _ | Humble Liege of Serenely Enlightened Majesty of o' \,=./ `o | Computer Science, Micha? "mina86" Nazarewicz (o o) +----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--
RFC PATCH 1/1 usb gadget: introduce usb_gadget_probe_driver
Hello Micha?,
Quoted 25 lines · Micha? Nazarewicz
Quoted 23 lines · Uwe Kleine-K?nig
This is like
usb_gadget_register_driverwith the only difference that it gets the bind function as parameter instead of usingdriver->bind. This allows fixing section mismatches likeWARNING: drivers/usb/gadget/g_printer.o(.data+0xc): Section mismatch in reference from the variable
printer_driverto the function .init.text:printer_bind()
The variableprinter_driverreferences
the function__initprinter_bind()by using
usb_gadget_probe_driverwithdriver->bind= NULL. When all drivers are fixed to use the new function the bind member of structusb_gadget_drivercan go away.Signed-off-by Uwe Kleine-K?nig <[email protected]>Cc Michal Nazarewicz <[email protected]>Cc Greg Kroah-Hartman <[email protected]>---
Hello,there is an alternative patch in Greg's tree [1], but IMHO mine is better as it doesn't need
__ref.
Quoted 8 lines
Quoted 1 line
Thoughts?
Personally I don't see advantage of this over changing the
__initto__ref. Or am I missing something? I see your patch as an unnecessary API change. The way I understand it,__refwas introduced exactly for cases like this one where function is referenced from "normal" data but used only during init. Could you try to clarify for me why you think your solution is better then mine?
- Using __ref instead of __init moves all bind functions from .init.text to .text and so the code isn't freed after booting or module loading. (OK, you could fix this by marking the driver structs as __ref and keep __init for the bind functions.)
- Using __ref might hide section mismatches. (Your patch hasn't this problem as the bind functions used to live in .init.text, so any reference to .init should be OK assuming that it was OK to live in .init.text in the first place. But when marking the driver structs this is an issue.) That's why I don't like __ref and said my patch were better as it doesn't make use of it.
- The bind functions are only called at init time, so there is no need to save a pointer to it.
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |
RFC PATCH 1/1 usb gadget: introduce usb_gadget_probe_driver
Quoted 1 line · On Fri, 30 Jul 2010 17:26:02 +0200, Uwe Kleine-K=C3=B6nig <u.kleine-koen=…
On Fri, Jul 30, 2010 at 05:16:46PM +0200, Micha=C5=82 Nazarewicz wrote=
:
Quoted 1 line
Quoted 1 line
On Fri, 30 Jul 2010 16:49:14 +0200, Uwe Kleine-K=C3=B6nig <u.kleine-k=
Quoted 2 lines · [email protected]> wrote:
Quoted 2 lines
Quoted 2 lines
This is like
usb_gadget_register_driverwith the only difference tha=
t it
Quoted 1 line
Quoted 1 line
Quoted 1 line
gets the bind function as parameter instead of using
driver->bind. =
This
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
allows fixing section mismatches like
WARNING: drivers/usb/gadget/g_printer.o(.data+0xc): Section mismatc=
h in
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
reference from the variable
printer_driverto the function .init.text:printer_bind()
The variableprinter_driverreferences
the function__initprinter_bind()by using
usb_gadget_probe_driverwithdriver->bind=3D NULL. When a=
ll
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
drivers are fixed to use the new function the bind member of struct
usb_gadget_drivercan go away.Signed-off-by Uwe Kleine-K=C3=B6nig <[email protected]=Cc Michal Nazarewicz <[email protected]>Cc Greg Kroah-Hartman <[email protected]>
BTW. Dunno if there is a reason to put me on Cc and Greg will be in Signed-off-by anyway.
Quoted 9 lines
Quoted 9 lines
Quoted 7 lines
---
Hello,there is an alternative patch in Greg's tree [1], but IMHO mine is better as it doesn't need
__ref.Thoughts?
Personally I don't see advantage of this over changing the
__initto =
__ref.
Quoted 1 line
Quoted 1 line
Or am I missing something? I see your patch as an unnecessary API ch=
ange.
Quoted 1 line
Quoted 1 line
The way I understand it,
__refwas introduced exactly for cases like =
this
Quoted 1 line
Quoted 1 line
one where function is referenced from "normal" data but used only dur=
ing
Quoted 5 lines
Quoted 3 lines
init. Could you try to clarify for me why you think your solution is=
better then mine?
- Using
__refinstead of__initmoves all bind functions from .init.te=
xt
Quoted 1 line
to .text and so the code isn't freed after booting or module loading=
.
Quoted 2 lines
(OK, you could fix this by marking the driver structs as
__refand keep__initfor the bind functions.)
I believe this to be untrue. __ref puts code in .ref.text which AFAIK i= s
freed.
Quoted 10 lines
- Using
__refmight hide section mismatches. (Your patch hasn't this problem as the bind functions used to live in .init.text, so any reference to .init should be OK assuming that it was OK to live in .init.text in the first place. But when marking the driver structs this is an issue.) That's why I don't like__refand said my patch were better as it doesn't make use of it.- The bind functions are only called at init time, so there is no need=
to save a pointer to it.
OK, I see some merit in this approach. However, the same issue is with usb_configuration and ?usb_composite_driver -- those should be changed in the same way or it would defeat the purpose of the patch.
-- =
Best regards, _ _
| Humble Liege of Serenely Enlightened Majesty of o' \,=3D./ `o
| Computer Science, Micha=C5=82 "mina86" Nazarewicz (o o)
+----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--
RFC PATCH 1/1 usb gadget: introduce usb_gadget_probe_driver
Quoted 40 lines · Micha? Nazarewicz
Quoted 13 lines · Uwe Kleine-K?nig
Quoted 12 lines · Micha? Nazarewicz
Quoted 10 lines · Uwe Kleine-K?nig
This is like
usb_gadget_register_driverwith the only difference that it gets the bind function as parameter instead of usingdriver->bind. This allows fixing section mismatches likeWARNING: drivers/usb/gadget/g_printer.o(.data+0xc): Section mismatch in reference from the variable
printer_driverto the function .init.text:printer_bind()
The variableprinter_driverreferences
the function__initprinter_bind()Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
by using
usb_gadget_probe_driverwithdriver->bind= NULL. When all drivers are fixed to use the new function the bind member of structusb_gadget_drivercan go away.Signed-off-by Uwe Kleine-K?nig <[email protected]>Cc Michal Nazarewicz <[email protected]>Cc Greg Kroah-Hartman <[email protected]>BTW. Dunno if there is a reason to put me on Cc and Greg will be in Signed-off-by anyway.
Quoted 14 lines
Quoted 14 lines
Quoted 7 lines
---
Hello,there is an alternative patch in Greg's tree [1], but IMHO mine is better as it doesn't need
__ref.Thoughts?
Personally I don't see advantage of this over changing the
__initto__ref. Or am I missing something? I see your patch as an unnecessary API change. The way I understand it,__refwas introduced exactly for cases like this one where function is referenced from "normal" data but used only during init. Could you try to clarify for me why you think your solution is better then mine?
Quoted 7 lines
Quoted 4 lines
- Using
__refinstead of__initmoves all bind functions from .init.text to .text and so the code isn't freed after booting or module loading. (OK, you could fix this by marking the driver structs as__refand keep__initfor the bind functions.)I believe this to be untrue.
__refputs code in .ref.text which AFAIK is freed.
I'm pretty sure it's not freed. .ref.text is of course correct.
Quoted 7 lines
Quoted 7 lines
- Using
__refmight hide section mismatches. (Your patch hasn't this problem as the bind functions used to live in .init.text, so any reference to .init should be OK assuming that it was OK to live in .init.text in the first place. But when marking the driver structs this is an issue.) That's why I don't like__refand said my patch were better as it doesn't make use of it.
Quoted 6 lines
Quoted 2 lines
- The bind functions are only called at init time, so there is no need to save a pointer to it.
OK, I see some merit in this approach. However, the same issue is with
usb_configurationand ?usb_composite_driver -- those should be changed in the same way or it would defeat the purpose of the patch.
I didn't skip these on purpose. I just stumbled over the gadget drivers first.
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |
RFC PATCH 1/1 usb gadget: introduce usb_gadget_probe_driver
In reply to Uwe Kleine-KönigQuoted 4 lines
- The bind functions are only called at init time, so there is no need
? to save a pointer to it.
Right. Let's retain the space-saving behaviors
by keeping init-only code in init sections.
- Dave
RFC PATCH 1/1 usb gadget: introduce usb_gadget_probe_driver
In reply to Uwe Kleine-KönigQuoted 4 lines · On Fri, 30 Jul 2010 16:49:14 +0200, Uwe Kleine-K=C3=B6nig <u.kleine-koen=…
by using
usb_gadget_probe_driverwithdriver->bind=3D NULL. When all=drivers are fixed to use the new function the bind member of struct
usb_gadget_drivercan go away.
On second thought, would it be hard to just fix all the gadgets? It's n= ot like there
are thousands of them so it shouldn't take that long. Moreover, since y= ou'd remove
the bind field and change the prototype of the usb_gadget_register() all= instances
would be found at compile time.
With that and the other functions which use bind callbacks (usb_add_conf= iguration(),usb_composite_register()) the patch would be much better in my opinion a= nd also
much better then my approach with __ref.
-- =
Best regards, _ _
| Humble Liege of Serenely Enlightened Majesty of o' \,=3D./ `o
| Computer Science, Micha=C5=82 "mina86" Nazarewicz (o o)
+----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--
PATCH 1/1 usb gadget: don't save bind callback in struct usb_gadget_driver
The bind function is only needed at probe time, so there is no value in saving it .
To accomplish this the function to register a gadget driver now takes the bind function as a second argument. To make things clearer rename the function to resemble platform_driver_probe vs. platform_driver_register.
This fixes many section mismatches like
WARNING: drivers/usb/gadget/g_printer.o(.data+0xc): Section mismatch in reference from the variable printer_driver to the function .init.text:printer_bind()
The variable printer_driver references
the function __init printer_bind()
All callers are fixed.
---
Hello,
now that Micha? seems to be happy with my approach I made the effort to come up with a complete patch that fixes the section mismatches.
Note this patch conflicts with usb-gadget-section-mismatch-warning-fixed.patch in Greg's usb tree. Greg, up to you to decide if it's already to late to drop the old patch in favour of mine.
Julia, you found an inconsitency in my first patch. I didn't, so can you please point out in more words what you meant?
Best regards
Uwe
drivers/usb/gadget/amd5536udc.c | 9 +++++---- drivers/usb/gadget/at91_udc.c | 11 ++++++----- drivers/usb/gadget/atmel_usba_udc.c | 7 ++++--- drivers/usb/gadget/ci13xxx_udc.c | 16 ++++++++-------- drivers/usb/gadget/composite.c | 3 +-- drivers/usb/gadget/dummy_hcd.c | 10 +++++----- drivers/usb/gadget/file_storage.c | 3 +-- drivers/usb/gadget/fsl_qe_udc.c | 12 ++++++------ drivers/usb/gadget/fsl_udc_core.c | 10 +++++----- drivers/usb/gadget/gmidi.c | 3 +-- drivers/usb/gadget/goku_udc.c | 9 +++++---- drivers/usb/gadget/imx_udc.c | 9 +++++---- drivers/usb/gadget/inode.c | 6 ++---- drivers/usb/gadget/langwell_udc.c | 9 +++++---- drivers/usb/gadget/lh7a40x_udc.c | 9 +++++---- drivers/usb/gadget/m66592-udc.c | 9 +++++---- drivers/usb/gadget/net2280.c | 10 +++++----- drivers/usb/gadget/omap_udc.c | 10 +++++----- drivers/usb/gadget/printer.c | 5 ++--- drivers/usb/gadget/pxa25x_udc.c | 9 +++++---- drivers/usb/gadget/pxa27x_udc.c | 12 +++++++----- drivers/usb/gadget/r8a66597-udc.c | 9 +++++---- drivers/usb/gadget/s3c-hsotg.c | 9 +++++---- drivers/usb/gadget/s3c2410_udc.c | 17 ++++++++--------- drivers/usb/musb/musb_gadget.c | 8 ++++---- include/linux/usb/gadget.h | 14 +++++++------- 26 files changed, 122 insertions(+), 116 deletions(-)
drivers/usb/gadget/amd5536udc.c +5 -4
@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp; -if (!driver || !driver->bind || !driver->setup +if (!driver || bind || !driver->setup || driver->speed !=USB_SPEED_HIGH )return -EINVAL ;if (!dev)
@@ -1972,7 +1973,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) dev->driver = driver; dev->gadget.dev.driver = &driver->driver; - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);/* Some gadget drivers use both ep0 directions. * NOTE: to gadget driver, ep0 is just one endpoint...
@@ -2000,7 +2001,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* shutdown requests and disconnect from gadget */ static void
drivers/usb/gadget/at91_udc.c +6 -5
@@ -1570,14 +1570,15 @@ static irqreturn_t at91_vbus_irq(int irq, void *_udc)return IRQ_HANDLED ; } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct at91_udc *udc = &controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->setup) {DBG ("bad parameter.\n" );return -EINVAL ;
@@ -1594,9 +1595,9 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver) udc->enabled =1 ; udc->selfpowered =1 ; - retval = driver->bind (&udc->gadget); + retval =bind (&udc->gadget);if (retval) { -DBG ("driver->bind() returned %d\n" , retval); +DBG ("bind() returned %d\n" , retval); udc->driver =NULL ; udc->gadget.dev.driver =NULL ;dev_set_drvdata (&udc->gadget.dev,NULL );
@@ -1612,7 +1613,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)DBG ("bound to %s\n" , driver->driver.name);return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/atmel_usba_udc.c +4 -3
@@ -1789,7 +1789,8 @@ out:return IRQ_HANDLED ; } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct usba_udc *udc = &the_udc;unsigned long flags;
@@ -1812,7 +1813,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)clk_enable (udc->pclk);clk_enable (udc->hclk); - ret = driver->bind (&udc->gadget); + ret =bind (&udc->gadget);if (ret) {DBG (DBG_ERR ,"Could not bind to driver %s: error %d\n" , driver->driver.name, ret);
@@ -1841,7 +1842,7 @@ err_driver_bind: udc->gadget.dev.driver =NULL ;return ret; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/ci13xxx_udc.c +8 -8
@@ -2340,12 +2340,13 @@ static const struct usb_ep_ops usb_ep_ops = {static const struct usb_gadget_ops usb_gadget_ops;/** -* usb_gadget_register_driver: register a gadget driver +* usb_gadget_probe_driver: register a gadget driver * -* Check usb_gadget_register_driver() at "usb_gadget.h" for details -* Interrupts are enabled here +* Check usb_gadget_probe_driver() at "usb_gadget.h" for details. +* Interrupts are enabled here. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct ci13xxx *udc = _udc;unsigned long i, k, flags;
@@ -2354,7 +2355,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)trace ("%p" , driver); if (driver == NULL || - driver->bind == NULL || + bind == NULL || driver->unbind == NULL || driver->setup == NULL || driver->disconnect == NULL ||
@@ -2430,7 +2431,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc->gadget.dev.driver = &driver->driver;spin_unlock_irqrestore (udc->lock, flags); - retval = driver->bind (&udc->gadget);/* MAY SLEEP */ + retval =bind (&udc->gadget);/* MAY SLEEP */ spin_lock_irqsave (udc->lock, flags);if (retval) {
@@ -2447,7 +2448,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)usb_gadget_unregister_driver (driver);return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/** * usb_gadget_unregister_driver: unregister a gadget driver
@@ -2462,7 +2463,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)trace ("%p" , driver); if (driver == NULL || - driver->bind == NULL || driver->unbind == NULL || driver->setup == NULL || driver->disconnect == NULL ||
drivers/usb/gadget/composite.c +1 -2
@@ -1112,7 +1112,6 @@ composite_resume(struct usb_gadget *gadget)static struct usb_gadget_driver composite_driver = { .speed =USB_SPEED_HIGH , - .bind = composite_bind, .unbind = composite_unbind, .setup = composite_setup,
@@ -1152,7 +1151,7 @@ int usb_composite_register(struct usb_composite_driver *driver) composite_driver.driver.name = driver->name; composite = driver; -return usb_gadget_register_driver (&composite_driver); +return usb_gadget_probe_driver (&composite_driver, composite_bind); }/**
drivers/usb/gadget/dummy_hcd.c +5 -5
@@ -748,7 +748,8 @@ static DEVICE_ATTR (function, S_IRUGO, show_function, NULL);*/ int -usb_gadget_register_driver (struct usb_gadget_driver *driver) +usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct dummy *dum = the_controller;int retval, i;
@@ -757,8 +758,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver)return -EINVAL ;if (dum->driver)return -EBUSY ; -if (!driver->bind || !driver->setup - || driver->speed ==USB_SPEED_UNKNOWN ) +if (!bind || !driver->setup || driver->speed ==USB_SPEED_UNKNOWN )return -EINVAL ;/*
@@ -796,7 +796,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver) dum->gadget.dev.driver = &driver->driver;dev_dbg (udc_dev (dum),"binding gadget driver '%s'\n" , driver->driver.name); - retval = driver->bind (&dum->gadget); + retval =bind (&dum->gadget);if (retval) { dum->driver =NULL ; dum->gadget.dev.driver =NULL ;
@@ -812,7 +812,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver)usb_hcd_poll_rh_status (dummy_to_hcd (dum));return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
drivers/usb/gadget/file_storage.c +1 -2
@@ -3541,7 +3541,6 @@ static struct usb_gadget_driver fsg_driver = { .speed = USB_SPEED_FULL, #endif .function = (char *) fsg_string_product, - .bind = fsg_bind, .unbind = fsg_unbind, .disconnect = fsg_disconnect, .setup = fsg_setup,
@@ -3583,7 +3582,7 @@ static int __init fsg_init(void)if ((rc =fsg_alloc ()) !=0 )return rc; fsg = the_fsg; -if ((rc =usb_gadget_register_driver (&fsg_driver)) !=0 ) +if ((rc =usb_gadget_probe_driver (&fsg_driver, fsg_bind)) !=0 )kref_put (&fsg->ref, fsg_release);return rc; }
drivers/usb/gadget/fsl_qe_udc.c +6 -6
@@ -2301,9 +2301,10 @@ static irqreturn_t qe_udc_irq(int irq, void *_udc) }/*------------------------------------------------------------------------- -Gadget driver register and unregister. +Gadget driver probe and unregister. --------------------------------------------------------------------------*/ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval;unsigned long flags =0 ;
@@ -2314,8 +2315,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || (driver->speed !=USB_SPEED_FULL && driver->speed !=USB_SPEED_HIGH ) - || !driver->bind || !driver->disconnect - || !driver->setup) + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;if (udc_controller->driver)
@@ -2331,7 +2331,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc_controller->gadget.speed = (enum usb_device_speed )(driver->speed);spin_unlock_irqrestore (&udc_controller->lock, flags); - retval = driver->bind (&udc_controller->gadget); + retval =bind (&udc_controller->gadget);if (retval) {dev_err (udc_controller->dev,"bind to %s --> %d" , driver->driver.name, retval);
@@ -2352,7 +2352,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc_controller->gadget.name, driver->driver.name);return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/fsl_udc_core.c +5 -5
@@ -1765,7 +1765,8 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)* Hook to gadget drivers * Called by initialization code of gadget drivers *----------------------------------------------------------------*/ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval = -ENODEV ;unsigned long flags =0 ;
@@ -1775,8 +1776,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || (driver->speed !=USB_SPEED_FULL && driver->speed !=USB_SPEED_HIGH ) - || !driver->bind || !driver->disconnect - || !driver->setup) + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;if (udc_controller->driver)
@@ -1792,7 +1792,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)spin_unlock_irqrestore (&udc_controller->lock, flags);/* bind udc driver to gadget driver */ - retval = driver->bind (&udc_controller->gadget); + retval =bind (&udc_controller->gadget);if (retval) {VDBG ("bind to %s --> %d" , driver->driver.name, retval); udc_controller->gadget.dev.driver =NULL ;
@@ -1814,7 +1814,7 @@ out: retval);return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* Disconnect from gadget driver */ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
drivers/usb/gadget/gmidi.c +1 -2
@@ -1292,7 +1292,6 @@ static void gmidi_resume(struct usb_gadget *gadget)static struct usb_gadget_driver gmidi_driver = { .speed =USB_SPEED_FULL , .function = (char *)longname, - .bind = gmidi_bind, .unbind = gmidi_unbind, .setup = gmidi_setup,
@@ -1309,7 +1308,7 @@ static struct usb_gadget_driver gmidi_driver = {static int __init gmidi_init (void ) { -return usb_gadget_register_driver (&gmidi_driver); +return usb_gadget_probe_driver (&gmidi_driver, gmidi_bind); }module_init (gmidi_init);
drivers/usb/gadget/goku_udc.c +5 -4
@@ -1343,14 +1343,15 @@ static struct goku_udc *the_controller;* disconnect is reported. then a host may connect again, or * the driver might get unbound. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct goku_udc *dev = the_controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -1363,7 +1364,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) driver->driver.bus =NULL ; dev->driver = driver; dev->gadget.dev.driver = &driver->driver; - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DBG (dev,"bind to driver %s --> error %d\n" , driver->driver.name, retval);
@@ -1380,7 +1381,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)DBG (dev,"registered gadget driver '%s'\n" , driver->driver.name);return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);static void stop_activity (struct goku_udc *dev,struct usb_gadget_driver *driver)
drivers/usb/gadget/imx_udc.c +5 -4
@@ -1319,14 +1319,15 @@ static struct imx_udc_struct controller = {* USB gadged driver functions ******************************************************************************* */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct imx_udc_struct *imx_usb = &controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -1342,7 +1343,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) retval =device_add (&imx_usb->gadget.dev);if (retval) goto fail; - retval = driver->bind (&imx_usb->gadget); + retval =bind (&imx_usb->gadget);if (retval) {D_ERR (imx_usb->dev,"<%s> bind to driver %s --> error %d\n" , __func__, driver->driver.name, retval);
@@ -1362,7 +1363,7 @@ fail: imx_usb->gadget.dev.driver =NULL ;return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/inode.c +2 -4
@@ -1777,7 +1777,6 @@ static struct usb_gadget_driver gadgetfs_driver = { .speed = USB_SPEED_FULL, #endif .function = (char *) driver_desc, - .bind = gadgetfs_bind, .unbind = gadgetfs_unbind, .setup = gadgetfs_setup, .disconnect = gadgetfs_disconnect,
@@ -1800,7 +1799,6 @@ static int gadgetfs_probe (struct usb_gadget *gadget)static struct usb_gadget_driver probe_driver = { .speed =USB_SPEED_HIGH , - .bind = gadgetfs_probe, .unbind = gadgetfs_nop, .setup = (void *)gadgetfs_nop, .disconnect = gadgetfs_nop,
@@ -1914,7 +1912,7 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)/* triggers gadgetfs_bind(); then we can enumerate. */ spin_unlock_irq (&dev->lock); - value =usb_gadget_register_driver (&gadgetfs_driver); + value =usb_gadget_probe_driver (&gadgetfs_driver, gadgetfs_bind);if (value !=0 ) {kfree (dev->buf); dev->buf =NULL ;
@@ -2053,7 +2051,7 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent)return -ESRCH ;/* fake probe to determine $CHIP */ - (void )usb_gadget_register_driver (&probe_driver); + (void )usb_gadget_probe_driver (&probe_driver, gadgetfs_probe);if (!CHIP )return -ENODEV ;
drivers/usb/gadget/langwell_udc.c +5 -4
@@ -1807,7 +1807,8 @@ static DEVICE_ATTR(langwell_udc, S_IRUGO, show_langwell_udc, NULL);* the driver might get unbound. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct langwell_udc *dev = the_controller;unsigned long flags;
@@ -1830,7 +1831,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)spin_unlock_irqrestore (&dev->lock, flags); - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DBG (dev,"bind to driver %s --> %d\n" , driver->driver.name, retval);
@@ -1868,7 +1869,7 @@ err_unbind:DBG (dev,"<--- %s()\n" , __func__);return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* unregister gadget driver */
@@ -1882,7 +1883,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)DBG (dev,"---> %s()\n" , __func__); -if (unlikely (!driver || !driver->bind || !driver->unbind)) +if (unlikely (!driver || !driver->unbind))return -EINVAL ;/* unbind OTG transceiver */
drivers/usb/gadget/lh7a40x_udc.c +5 -4
@@ -408,7 +408,8 @@ static void udc_enable(struct lh7a40x_udc *dev)/* Register entry point for the peripheral controller driver. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct lh7a40x_udc *dev = the_controller;int retval;
@@ -417,7 +418,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || driver->speed !=USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -431,7 +432,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) dev->gadget.dev.driver = &driver->driver;device_add (&dev->gadget.dev); - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {printk (KERN_WARNING "%s: bind to driver %s --> error %d\n" , dev->gadget.name, driver->driver.name, retval);
@@ -454,7 +455,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* Unregister entry point for the peripheral controller driver.
drivers/usb/gadget/m66592-udc.c +5 -4
@@ -1454,14 +1454,15 @@ static struct usb_ep_ops m66592_ep_ops = {/*-------------------------------------------------------------------------*/ static struct m66592 *the_controller; -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct m66592 *m66592 = the_controller;int retval;if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind + || !bind || !driver->setup)return -EINVAL ;if (!m66592)
@@ -1480,7 +1481,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) goto error; } - retval = driver->bind (&m66592->gadget); + retval =bind (&m66592->gadget);if (retval) {pr_err ("bind to driver error (%d)\n" , retval);device_del (&m66592->gadget.dev);
@@ -1505,7 +1506,7 @@ error:return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/net2280.c +5 -5
@@ -1929,7 +1929,8 @@ 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_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct net2280 *dev = the_controller;int retval;
@@ -1941,8 +1942,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)*/ if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind - || !driver->setup) + || !bind || !driver->setup)return -EINVAL ;if (!dev)return -ENODEV ;
@@ -1957,7 +1957,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver) driver->driver.bus =NULL ; dev->driver = driver; dev->gadget.dev.driver = &driver->driver; - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DEBUG (dev,"bind to driver %s --> %d\n" , driver->driver.name, retval);
@@ -1993,7 +1993,7 @@ err_unbind: dev->driver =NULL ;return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);static void stop_activity (struct net2280 *dev,struct usb_gadget_driver *driver)
drivers/usb/gadget/omap_udc.c +5 -5
@@ -2102,7 +2102,8 @@ static inline int machine_without_vbus_sense(void) ); } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int status = -ENODEV ;struct omap_ep *ep;
@@ -2114,8 +2115,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)if (!driver// FIXME if otg, check: driver->is_otg || driver->speed <USB_SPEED_FULL - || !driver->bind - || !driver->setup) + || !bind || !driver->setup)return -EINVAL ;spin_lock_irqsave (&udc->lock, flags);
@@ -2145,7 +2145,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)if (udc->dc_clk !=NULL )omap_udc_enable_clock (1 ); - status = driver->bind (&udc->gadget); + status =bind (&udc->gadget);if (status) {DBG ("bind to %s --> %d\n" , driver->driver.name, status); udc->gadget.dev.driver =NULL ;
@@ -2186,7 +2186,7 @@ done:omap_udc_enable_clock (0 );return status; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/printer.c +2 -3
@@ -1542,7 +1542,6 @@ static struct usb_gadget_driver printer_driver = { .speed = DEVSPEED, .function = (char *) driver_desc, - .bind = printer_bind, .unbind = printer_unbind, .setup = printer_setup,
@@ -1578,11 +1577,11 @@ init(void)return status; } - status =usb_gadget_register_driver (&printer_driver); + status =usb_gadget_probe_driver (&printer_driver, printer_bind);if (status) {class_destroy (usb_gadget_class);unregister_chrdev_region (g_printer_devno,1 ); -DBG (dev,"usb_gadget_register_driver %x\n" , status); +DBG (dev,"usb_gadget_probe_driver %x\n" , status); }return status;
drivers/usb/gadget/pxa25x_udc.c +5 -4
@@ -1280,14 +1280,15 @@ 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_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct pxa25x_udc *dev = the_controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -1308,7 +1309,7 @@ fail: dev->gadget.dev.driver =NULL ;return retval; } - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DMSG ("bind to driver %s --> error %d\n" , driver->driver.name, retval);
@@ -1338,7 +1339,7 @@ fail: bind_fail:return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);static void stop_activity (struct pxa25x_udc *dev,struct usb_gadget_driver *driver)
drivers/usb/gadget/pxa27x_udc.c +7 -5
@@ -1792,8 +1792,9 @@ static void udc_enable(struct pxa_udc *udc) }/** -* usb_gadget_register_driver - Register gadget driver +* usb_gadget_probe_driver - Register gadget driver * @driver: gadget driver +* @bind: bind function * * When a driver is successfully registered, it will receive control requests * including set_configuration(), which enables non-control requests. Then
@@ -1805,12 +1806,13 @@ static void udc_enable(struct pxa_udc *udc)* * Returns 0 if no error, -EINVAL, -ENODEV, -EBUSY otherwise */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct pxa_udc *udc = the_controller;int retval; -if (!driver || driver->speed <USB_SPEED_FULL || !driver->bind +if (!driver || driver->speed <USB_SPEED_FULL || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;if (!udc)
@@ -1828,7 +1830,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)dev_err (udc->dev,"device_add error %d\n" , retval); goto add_fail; } - retval = driver->bind (&udc->gadget); + retval =bind (&udc->gadget);if (retval) {dev_err (udc->dev,"bind to driver %s --> error %d\n" , driver->driver.name, retval);
@@ -1859,7 +1861,7 @@ add_fail: udc->gadget.dev.driver =NULL ;return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/**
drivers/usb/gadget/r8a66597-udc.c +5 -4
@@ -1405,14 +1405,15 @@ static struct usb_ep_ops r8a66597_ep_ops = {/*-------------------------------------------------------------------------*/ static struct r8a66597 *the_controller; -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct r8a66597 *r8a66597 = the_controller;int retval;if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind + || !bind || !driver->setup)return -EINVAL ;if (!r8a66597)
@@ -1431,7 +1432,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) goto error; } - retval = driver->bind (&r8a66597->gadget); + retval =bind (&r8a66597->gadget);if (retval) {printk (KERN_ERR "bind to driver error (%d)\n" , retval);device_del (&r8a66597->gadget.dev);
@@ -1456,7 +1457,7 @@ error:return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/s3c-hsotg.c +5 -4
@@ -2478,7 +2478,8 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg)return 0 ; } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct s3c_hsotg *hsotg = our_hsotg;int ret;
@@ -2498,7 +2499,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)dev_err (hsotg->dev,"%s: bad speed\n" , __func__); } -if (!driver->bind || !driver->setup) { +if (!bind || !driver->setup) {dev_err (hsotg->dev,"%s: missing entry points\n" , __func__);return -EINVAL ; }
@@ -2517,7 +2518,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) goto err; } - ret = driver->bind (&hsotg->gadget); + ret =bind (&hsotg->gadget);if (ret) {dev_err (hsotg->dev,"failed bind %s\n" , driver->driver.name);
@@ -2641,7 +2642,7 @@ err: hsotg->gadget.dev.driver =NULL ;return ret; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/s3c2410_udc.c +8 -9
@@ -1628,15 +1628,15 @@ static void s3c2410_udc_enable(struct s3c2410_udc *dev) }/* -* usb_gadget_register_driver +* usb_gadget_probe_driver */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct s3c2410_udc *udc = the_controller;int retval; -dprintk (DEBUG_NORMAL ,"usb_gadget_register_driver() '%s'\n" , - driver->driver.name); +dprintk (DEBUG_NORMAL ,"%s() '%s'\n" , __func__, driver->driver.name);/* Sanity checks */ if (!udc)
@@ -1645,10 +1645,9 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (udc->driver)return -EBUSY ; -if (!driver->bind || !driver->setup - || driver->speed <USB_SPEED_FULL ) { +if (!bind || !driver->setup || driver->speed <USB_SPEED_FULL ) {printk (KERN_ERR "Invalid driver: bind %p setup %p speed %d\n" , - driver->bind, driver->setup, driver->speed); + bind, driver->setup, driver->speed);return -EINVAL ; }#if defined(MODULE )
@@ -1671,7 +1670,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)dprintk (DEBUG_NORMAL ,"binding gadget driver '%s'\n" , driver->driver.name); -if ((retval = driver->bind (&udc->gadget)) !=0 ) { +if ((retval =bind (&udc->gadget)) !=0 ) {device_del (&udc->gadget.dev); goto register_error; }
@@ -2045,7 +2044,7 @@ static void __exit udc_exit(void) }EXPORT_SYMBOL (usb_gadget_unregister_driver); -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);module_init (udc_init);module_exit (udc_exit);
drivers/usb/musb/musb_gadget.c +4 -4
@@ -1698,7 +1698,8 @@ void musb_gadget_cleanup(struct musb *musb)* @param driver the gadget driver * @return <0 if error, 0 if everything is fine */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval;unsigned long flags;
@@ -1706,8 +1707,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind - || !driver->setup) + || !bind || !driver->setup)return -EINVAL ;/* driver must be initialized to support peripheral mode */
@@ -1735,7 +1735,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)spin_unlock_irqrestore (&musb->lock, flags);if (retval ==0 ) { - retval = driver->bind (&musb->g); + retval =bind (&musb->g);if (retval !=0 ) {DBG (3 ,"bind to driver %s failed --> %d\n" , driver->driver.name, retval);
include/linux/usb/gadget.h +7 -7
@@ -774,7 +774,6 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget)struct usb_gadget_driver {char *function;enum usb_device_speed speed; -int (*bind)(struct usb_gadget *);void (*unbind)(struct usb_gadget *);int (*setup)(struct usb_gadget *,const struct usb_ctrlrequest *);
@@ -798,17 +797,18 @@ struct usb_gadget_driver {*/ /** -* usb_gadget_register_driver - register a gadget driver -* @driver:the driver being registered +* usb_gadget_probe_driver - probe a gadget driver +* @driver: the driver being registered * Context: can sleep * * Call this in your gadget driver's module initialization function, * to tell the underlying usb controller driver about your driver. -* The driver's bind() function will be called to bind it to a -* gadget before this registration call returns. It's expected that -* the bind() functions will be in init sections. +* The bind() function will be called to bind it to a gadget before this +* registration call returns. It's expected that the bind() function will +* be in init sections. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver); +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *));/** * usb_gadget_unregister_driver - unregister a gadget driver
Signature · 1 line
1.7.1
Re: [PATCH] usb gadget: don't save bind callback in struct usb_gadget_driver
Can you please stop Ccing dozends of people on totally random patches?
I'm sick of getting my inbox spammed with all this crap.
PATCH 1/1 usb gadget: don't save bind callback in struct usb_gadget_driver
In reply to Uwe Kleine-KönigQuoted 8 lines
drivers/usb/gadget/amd5536udc.c +0
-0@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */
drivers/usb/gadget/amd5536udc.c static int setup_ep0(struct udc *dev) · line 1964
Quoted 10 lines
drivers/usb/gadget/amd5536udc.c +3
-2-int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp; - if (!driver || !driver->bind || !driver->setup + if (!driver || bind || !driver->setup
I have the impression that this should be !bind rather than bind. That would be like what is done in the patch for drivers/usb/gadget/fsl_udc_core.c below
Quoted 15 lines
drivers/usb/gadget/fsl_udc_core.c +2
-1@@ -1765,7 +1765,8 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)* Hook to gadget drivers * Called by initialization code of gadget drivers *----------------------------------------------------------------*/ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval = -ENODEV ;unsigned long flags =0 ;
drivers/usb/gadget/fsl_udc_core.c int usb_gadget_register_driver(struct usb_gadget_driver *driver) · line 1780
Quoted 7 lines
drivers/usb/gadget/fsl_udc_core.c +1
-2@@ -1775,8 +1776,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || (driver->speed !=USB_SPEED_FULL && driver->speed !=USB_SPEED_HIGH ) - || !driver->bind || !driver->disconnect - || !driver->setup) + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
Here !driver->bind is converted to !bind.
julia
PATCH 1/1 usb gadget: don't save bind callback in struct usb_gadget_driver
Quoted 16 lines · Julia Lawall
Quoted 16 lines
drivers/usb/gadget/amd5536udc.c +2
-1@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp;
Quoted 4 lines
drivers/usb/gadget/amd5536udc.c static int setup_ep0(struct udc *dev) · line 1964
Quoted 2 lines
drivers/usb/gadget/amd5536udc.c +1
-1- if (!driver || !driver->bind || !driver->setup + if (!driver || bind || !driver->setupI have the impression that this should be !bind rather than bind.
ah, now I see what you meant. Obviously you're right. I fixed it up locally here for now. Greg, just tell me when/if you need a fixed patch.
Quoted 2 lines
That would be like what is done in the patch for
drivers/usb/gadget/fsl_udc_core.cbelow
Thanks
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |
PATCH 1/1 usb gadget: don't save bind callback in struct usb_gadget_driver
Quoted 17 lines · Uwe Kleine-K?nig
Quoted 16 lines · Julia Lawall
Quoted 16 lines
drivers/usb/gadget/amd5536udc.c +2
-1@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp;
Quoted 7 lines
Quoted 4 lines
drivers/usb/gadget/amd5536udc.c static int setup_ep0(struct udc *dev) · line 1964
Quoted 2 lines
drivers/usb/gadget/amd5536udc.c +1
-1- if (!driver || !driver->bind || !driver->setup + if (!driver || bind || !driver->setupI have the impression that this should be !bind rather than bind.
ah, now I see what you meant. Obviously you're right. I fixed it up locally here for now. Greg, just tell me when/if you need a fixed patch.
Didn't you already post a "fixed" patch?
thanks,
greg k-h
Re: [PATCH] usb gadget: don't save bind callback in struct usb_gadget_driver
[stripped down Cc: list to annoy fewer people]
Quoted 22 lines · Greg KH
Quoted 21 lines · Uwe Kleine-König
Quoted 20 lines · Julia Lawall
Quoted 8 lines
drivers/usb/gadget/amd5536udc.c +0
-0@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */ drivers/usb/gadget/amd5536udc.c static int setup_ep0(struct udc *dev) · line 1964
Quoted 10 lines
drivers/usb/gadget/amd5536udc.c +3
-2-int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp; - if (!driver || !driver->bind || !driver->setup + if (!driver || bind || !driver->setupI have the impression that this should be !bind rather than bind.
Quoted 5 lines
Quoted 3 lines
ah, now I see what you meant. Obviously you're right. I fixed it up locally here for now. Greg, just tell me when/if you need a fixed patch.
Didn't you already post a "fixed" patch?
Yes, I did:
http://article.gmane.org/gmane.linux.ports.arm.kernel/86640 http://article.gmane.org/gmane.linux.kernel/1017575
If you append '/raw' to the URL they should be applicable by git/quilt/whatever you use.
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ |
PATCH 1/1 usb gadget: don't save bind callback in struct usb_gadget_driver
In reply to Uwe Kleine-KönigSome random thoughts, one bug and mostly just minor comments:
drivers/usb/gadget/amd5536udc.c static int setup_ep0(struct udc *dev) · line 1962
Quoted 12 lines
drivers/usb/gadget/amd5536udc.c +3
-2@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) { struct udc *dev =3D udc;int retval;u32 tmp; - if (!driver || !driver->bind || !driver->setup + if (!driver || bind || !driver->setup
** BUG: Should read "!bind".
drivers/usb/gadget/at91_u=
Quoted 1 line
drivers/usb/gadget/at91_u= renamed from drivers/usb/gadget/at91_udc.c +0
-0
dc.c
drivers/usb/gadget/at91_u= int usb_gadget_register_driver (struct usb_gadge=
Quoted 1 line
drivers/usb/gadget/at91_u= renamed from drivers/usb/gadget/at91_udc.c +0
-0@@ -1612,7 +1613,7 @@ int usb_gadget_register_driver (struct usb_gadge=
t_driver *driver)
drivers/usb/gadget/at91_u= int usb_gadget_register_driver (struct usb_gadge= · line 1616
Quoted 5 lines
drivers/usb/gadget/at91_u= renamed from drivers/usb/gadget/at91_udc.c +1
-1DBG("bound to %s\n", driver->driver.name); return 0; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);
How about also correcting space before "("?
drivers/usb/gadget/=
Quoted 1 line
drivers/usb/gadget/= renamed from drivers/usb/gadget/atmel_usba_udc.c +0
-0
atmel_usba_udc.c
drivers/usb/gadget/= out: · line 1795
Quoted 9 lines
drivers/usb/gadget/= renamed from drivers/usb/gadget/atmel_usba_udc.c +2
-1@@ -1789,7 +1789,8 @@ out: return IRQ_HANDLED; } -int usb_gadget_register_driver(struct usb_gadget_driver *driver) +int usb_gadget_probe_driver(struct usb_gadget_driver *driver, + int (*bind)(struct usb_gadget *)) { struct usba_udc *udc =3D &the_udc; unsigned long flags;
There was no checking here? How about adding?
drivers/usb/gadget/ci1=
Quoted 1 line
drivers/usb/gadget/ci1= renamed from drivers/usb/gadget/ci13xxx_udc.c +0
-0
3xxx_udc.c
drivers/usb/gadget/ci1= static const struct usb_ep_ops usb_ep_ops =3D =
Quoted 1 line
drivers/usb/gadget/ci1= renamed from drivers/usb/gadget/ci13xxx_udc.c +0
-0@@ -2340,12 +2340,13 @@ static const struct usb_ep_ops usb_ep_ops =3D =
{
drivers/usb/gadget/ci1= static const struct usb_ep_ops usb_ep_ops =3D = · line 2346
Quoted 10 lines
drivers/usb/gadget/ci1= renamed from drivers/usb/gadget/ci13xxx_udc.c +3
-3static const struct usb_gadget_ops usb_gadget_ops; /** - * usb_gadget_register_driver: register a gadget driver + * usb_gadget_probe_driver: register a gadget driver * - * Check usb_gadget_register_driver() at "usb_gadget.h" for details - * Interrupts are enabled here + * Check usb_gadget_probe_driver() at "usb_gadget.h" for details. + * Interrupts are enabled here. */
usb_gadget.h is the old name. How about correcting it as well?
drivers/usb/gadget/fi=
Quoted 1 line
drivers/usb/gadget/fi= renamed from drivers/usb/gadget/file_storage.c +0
-0
le_storage.c
drivers/usb/gadget/fi= static int __init fsg_init(void) · line 3585
Quoted 6 lines
drivers/usb/gadget/fi= renamed from drivers/usb/gadget/file_storage.c +1
-1@@ -3583,7 +3582,7 @@ static int __init fsg_init(void) if ((rc =3D fsg_alloc()) !=3D 0) return rc; fsg =3D the_fsg; - if ((rc =3D usb_gadget_register_driver(&fsg_driver)) !=3D 0) + if ((rc =3D usb_gadget_probe_driver(&fsg_driver, fsg_bind)) !=3D 0)
I'm tempted to propose:
+ rc =3D usb_gadget_probe_driver(&fsg_driver, fsg_bind);
+ if (rc !=3D 0)
which is more compatible with coding style but it probably would be inco= nsistent
with the rest of the code.
drivers/usb/gadget/la=
Quoted 1 line
drivers/usb/gadget/la= renamed from drivers/usb/gadget/langwell_udc.c +0
-0
ngwell_udc.c
drivers/usb/gadget/la= static DEVICE_ATTR(langwell_udc, S_IRUGO, show_l=
Quoted 1 line
drivers/usb/gadget/la= renamed from drivers/usb/gadget/langwell_udc.c +0
-0@@ -1807,7 +1807,8 @@ static DEVICE_ATTR(langwell_udc, S_IRUGO, show_l=
angwell_udc, NULL);
drivers/usb/gadget/la= static DEVICE_ATTR(langwell_udc, S_IRUGO, show_l= · line 1813
Quoted 8 lines
drivers/usb/gadget/la= renamed from drivers/usb/gadget/langwell_udc.c +2
-1* the driver might get unbound. */ -int usb_gadget_register_driver(struct usb_gadget_driver *driver) +int usb_gadget_probe_driver(struct usb_gadget_driver *driver, + int (*bind)(struct usb_gadget *)) { struct langwell_udc *dev =3D the_controller; unsigned long flags;
Again, function has no checking, how about adding?
drivers/usb/musb/musb_ga=
Quoted 1 line
drivers/usb/musb/musb_ga= renamed from drivers/usb/musb/musb_gadget.c +0
-0
dget.c
drivers/usb/musb/musb_ga= void musb_gadget_cleanup(struct musb *musb) · line 1700
Quoted 4 lines
drivers/usb/musb/musb_ga= renamed from drivers/usb/musb/musb_gadget.c +0
-0@@ -1698,7 +1698,8 @@ void musb_gadget_cleanup(struct musb *musb) * @param driver the gadget driver * @return <0 if error, 0 if everything is fine */
I've just noticed that it misses @param bind in the comment. Would be g= reat to update it
and all other occurrences.
include/linux/usb/gadget.h struct usb_gadget_driver { · line 800
Quoted 8 lines
include/linux/usb/gadget.h +2
-2@@ -798,17 +797,18 @@ struct usb_gadget_driver {*/ /** -* usb_gadget_register_driver - register a gadget driver -* @driver:the driver being registered +* usb_gadget_probe_driver - probe a gadget driver +* @driver: the driver being registered
+ * @bind: the driver's bind callback.
include/linux/usb/gadget.h struct usb_gadget_driver {
Quoted 8 lines
include/linux/usb/gadget.h +1
-3* Context: can sleep * * Call this in your gadget driver's module initialization function, * to tell the underlying usb controller driver about your driver. -* The driver's bind() function will be called to bind it to a -* gadget before this registration call returns. It's expected that -* the bind() functions will be in init sections. +* The bind() function will be called to bind it to a gadget before t=
his
include/linux/usb/gadget.h struct usb_gadget_driver { · line 806
Quoted 1 line
include/linux/usb/gadget.h +1
-0+* registration call returns. It's expected that the bind() function=
will
Maybe "the @bind function" in those two places?
So for what it's worth, I haven't noticed any other obvious problems.
I think it still does not fix all the section mismatch warnings -- would= have to look
closer at composite gadgets -- so I think still parts of my patch is leg= it.
-- =
Best regards, _ _
| Humble Liege of Serenely Enlightened Majesty of o' \,=3D./ `o
| Computer Science, Micha=C5=82 "mina86" Nazarewicz (o o)
+----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--
Re: [PATCH] usb gadget: don't save bind callback in struct usb_gadget_driver
Hi Michał,
Quoted 17 lines · Michał Nazarewicz
Some random thoughts, one bug and mostly just minor comments:
drivers/usb/gadget/amd5536udc.c static int setup_ep0(struct udc *dev) · line 1962
Quoted 12 lines
drivers/usb/gadget/amd5536udc.c +3
-2@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp; - if (!driver || !driver->bind || !driver->setup + if (!driver || bind || !driver->setup** BUG: Should read "!bind".
Yeah, Julia already pointed that out.
Quoted 9 lines
drivers/usb/gadget/at91_udc.c int usb_gadget_register_driver (struct usb_gadget_driver *driver) · line 1616
Quoted 7 lines
drivers/usb/gadget/at91_udc.c +1
-1@@ -1612,7 +1613,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)DBG ("bound to %s\n" , driver->driver.name);return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);How about also correcting space before "("?
Fixed.
Quoted 4 lines
Quoted 4 lines
drivers/usb/gadget/atmel_usba_udc.c +0
-0@@ -1789,7 +1789,8 @@ out:return IRQ_HANDLED ; }
Quoted 8 lines
drivers/usb/gadget/atmel_usba_udc.c out: · line 1796
Quoted 6 lines
drivers/usb/gadget/atmel_usba_udc.c +2
-1-int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct usba_udc *udc = &the_udc;unsigned long flags;There was no checking here? How about adding?
Hmmm, I think this should be addressed in a different patch.
Quoted 6 lines
Quoted 6 lines
drivers/usb/gadget/ci13xxx_udc.c +1
-1@@ -2340,12 +2340,13 @@ static const struct usb_ep_ops usb_ep_ops = {static const struct usb_gadget_ops usb_gadget_ops;/** -* usb_gadget_register_driver: register a gadget driver +* usb_gadget_probe_driver: register a gadget driver
Quoted 8 lines
drivers/usb/gadget/ci13xxx_udc.c static const struct usb_ep_ops usb_ep_ops = { · line 2347
Quoted 6 lines
drivers/usb/gadget/ci13xxx_udc.c +2
-2* -* Check usb_gadget_register_driver() at "usb_gadget.h" for details -* Interrupts are enabled here +* Check usb_gadget_probe_driver() at "usb_gadget.h" for details. +* Interrupts are enabled here. */
usb_gadget.his the old name. How about correcting it as well?
done.
Quoted 17 lines
drivers/usb/gadget/file_storage.c static int __init fsg_init(void) · line 3585
Quoted 8 lines
drivers/usb/gadget/file_storage.c +1
-1@@ -3583,7 +3582,7 @@ static int __init fsg_init(void)if ((rc =fsg_alloc ()) !=0 )return rc; fsg = the_fsg; -if ((rc =usb_gadget_register_driver (&fsg_driver)) !=0 ) +if ((rc =usb_gadget_probe_driver (&fsg_driver, fsg_bind)) !=0 )I'm tempted to propose:
+ rc =
usb_gadget_probe_driver(&fsg_driver, fsg_bind);
+ if (rc != 0)which is more compatible with coding style but it probably would be inconsistent with the rest of the code.
Quoted 12 lines
drivers/usb/gadget/langwell_udc.c static DEVICE_ATTR(langwell_udc, S_IRUGO, show_langwell_udc, NULL); · line 1813
Quoted 10 lines
drivers/usb/gadget/langwell_udc.c +2
-1@@ -1807,7 +1807,8 @@ static DEVICE_ATTR(langwell_udc, S_IRUGO, show_langwell_udc, NULL);* the driver might get unbound. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct langwell_udc *dev = the_controller;unsigned long flags;Again, function has no checking, how about adding?
as above, IMHO this should be a seperate patch.
Quoted 8 lines
drivers/usb/musb/musb_gadget.c void musb_gadget_cleanup(struct musb *musb) · line 1700
Quoted 5 lines
drivers/usb/musb/musb_gadget.c +0
-0@@ -1698,7 +1698,8 @@ void musb_gadget_cleanup(struct musb *musb)* @param driver the gadget driver * @return <0 if error, 0 if everything is fine */ I've just noticed that it misses @param bind in the comment. Would be great to update it and all other occurrences.
done.
Quoted 21 lines
include/linux/usb/gadget.h struct usb_gadget_driver { · line 800
Quoted 8 lines
include/linux/usb/gadget.h +2
-2@@ -798,17 +797,18 @@ struct usb_gadget_driver {*/ /** -* usb_gadget_register_driver - register a gadget driver -* @driver:the driver being registered +* usb_gadget_probe_driver - probe a gadget driver +* @driver: the driver being registered + * @bind: the driver's bind callback.
include/linux/usb/gadget.h struct usb_gadget_driver { · line 807
Quoted 9 lines
include/linux/usb/gadget.h +2
-3* Context: can sleep * * Call this in your gadget driver's module initialization function, * to tell the underlying usb controller driver about your driver. -* The driver's bind() function will be called to bind it to a -* gadget before this registration call returns. It's expected that -* the bind() functions will be in init sections. +* The bind() function will be called to bind it to a gadget before this +* registration call returns. It's expected that the bind() function will
Quoted 6 lines
Maybe "the @bind function" in those two places?
So for what it's worth, I haven't noticed any other obvious problems.
I think it still does not fix all the section mismatch warnings -- would have to look closer at composite gadgets -- so I think still parts of my patch is legit.
I prepared a patch that removes bind from usb_configuration, too. Find it in reply to this mail.
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ |
PATCH 1/2 usb gadget: don't save bind callback in struct usb_gadget_driver
To accomplish this the function to register a gadget driver takes the bind function as a second argument. To make things clearer rename the function to resemble platform_driver_probe.
This fixes many section mismatches like
WARNING: drivers/usb/gadget/g_printer.o(.data+0xc): Section mismatch in reference from the variable printer_driver to the function .init.text:printer_bind()
The variable printer_driver references
the function __init printer_bind()
All callers are fixed.
--- drivers/usb/gadget/amd5536udc.c | 9 +++++---- drivers/usb/gadget/at91_udc.c | 11 ++++++----- drivers/usb/gadget/atmel_usba_udc.c | 7 ++++--- drivers/usb/gadget/ci13xxx_udc.c | 18 ++++++++++-------- drivers/usb/gadget/composite.c | 3 +-- drivers/usb/gadget/dummy_hcd.c | 10 +++++----- drivers/usb/gadget/file_storage.c | 3 +-- drivers/usb/gadget/fsl_qe_udc.c | 12 ++++++------ drivers/usb/gadget/fsl_udc_core.c | 10 +++++----- drivers/usb/gadget/gmidi.c | 3 +-- drivers/usb/gadget/goku_udc.c | 9 +++++---- drivers/usb/gadget/imx_udc.c | 9 +++++---- drivers/usb/gadget/inode.c | 6 ++---- drivers/usb/gadget/langwell_udc.c | 9 +++++---- drivers/usb/gadget/lh7a40x_udc.c | 10 +++++----- drivers/usb/gadget/m66592-udc.c | 9 +++++---- drivers/usb/gadget/net2280.c | 10 +++++----- drivers/usb/gadget/omap_udc.c | 10 +++++----- drivers/usb/gadget/printer.c | 5 ++--- drivers/usb/gadget/pxa25x_udc.c | 9 +++++---- drivers/usb/gadget/pxa27x_udc.c | 12 +++++++----- drivers/usb/gadget/r8a66597-udc.c | 9 +++++---- drivers/usb/gadget/s3c-hsotg.c | 9 +++++---- drivers/usb/gadget/s3c2410_udc.c | 17 ++++++++--------- drivers/usb/musb/musb_gadget.c | 9 +++++---- include/linux/usb/gadget.h | 20 ++++++++------------ 26 files changed, 126 insertions(+), 122 deletions(-)
drivers/usb/gadget/amd5536udc.c +5 -4
@@ -1954,13 +1954,14 @@ static int setup_ep0(struct udc *dev) }/* Called by gadget driver to register itself */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct udc *dev = udc;int retval;u32 tmp; -if (!driver || !driver->bind || !driver->setup +if (!driver || !bind || !driver->setup || driver->speed !=USB_SPEED_HIGH )return -EINVAL ;if (!dev)
@@ -1972,7 +1973,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) dev->driver = driver; dev->gadget.dev.driver = &driver->driver; - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);/* Some gadget drivers use both ep0 directions. * NOTE: to gadget driver, ep0 is just one endpoint...
@@ -2000,7 +2001,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* shutdown requests and disconnect from gadget */ static void
drivers/usb/gadget/at91_udc.c +6 -5
@@ -1570,14 +1570,15 @@ static irqreturn_t at91_vbus_irq(int irq, void *_udc)return IRQ_HANDLED ; } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct at91_udc *udc = &controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->setup) {DBG ("bad parameter.\n" );return -EINVAL ;
@@ -1594,9 +1595,9 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver) udc->enabled =1 ; udc->selfpowered =1 ; - retval = driver->bind (&udc->gadget); + retval =bind (&udc->gadget);if (retval) { -DBG ("driver->bind() returned %d\n" , retval); +DBG ("bind() returned %d\n" , retval); udc->driver =NULL ; udc->gadget.dev.driver =NULL ;dev_set_drvdata (&udc->gadget.dev,NULL );
@@ -1612,7 +1613,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)DBG ("bound to %s\n" , driver->driver.name);return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/atmel_usba_udc.c +4 -3
@@ -1789,7 +1789,8 @@ out:return IRQ_HANDLED ; } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct usba_udc *udc = &the_udc;unsigned long flags;
@@ -1812,7 +1813,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)clk_enable (udc->pclk);clk_enable (udc->hclk); - ret = driver->bind (&udc->gadget); + ret =bind (&udc->gadget);if (ret) {DBG (DBG_ERR ,"Could not bind to driver %s: error %d\n" , driver->driver.name, ret);
@@ -1841,7 +1842,7 @@ err_driver_bind: udc->gadget.dev.driver =NULL ;return ret; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/ci13xxx_udc.c +10 -8
@@ -2340,12 +2340,15 @@ static const struct usb_ep_ops usb_ep_ops = {static const struct usb_gadget_ops usb_gadget_ops;/** -* usb_gadget_register_driver: register a gadget driver +* usb_gadget_probe_driver: register a gadget driver +* @driver: the driver being registered +* @bind: the driver's bind callback * -* Check usb_gadget_register_driver() at "usb_gadget.h" for details -* Interrupts are enabled here +* Check usb_gadget_probe_driver() at <linux/usb/gadget.h> for details. +* Interrupts are enabled here. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct ci13xxx *udc = _udc;unsigned long i, k, flags;
@@ -2354,7 +2357,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)trace ("%p" , driver); if (driver == NULL || - driver->bind == NULL || + bind == NULL || driver->unbind == NULL || driver->setup == NULL || driver->disconnect == NULL ||
@@ -2430,7 +2433,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc->gadget.dev.driver = &driver->driver;spin_unlock_irqrestore (udc->lock, flags); - retval = driver->bind (&udc->gadget);/* MAY SLEEP */ + retval =bind (&udc->gadget);/* MAY SLEEP */ spin_lock_irqsave (udc->lock, flags);if (retval) {
@@ -2447,7 +2450,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)usb_gadget_unregister_driver (driver);return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/** * usb_gadget_unregister_driver: unregister a gadget driver
@@ -2462,7 +2465,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)trace ("%p" , driver); if (driver == NULL || - driver->bind == NULL || driver->unbind == NULL || driver->setup == NULL || driver->disconnect == NULL ||
drivers/usb/gadget/composite.c +1 -2
@@ -1112,7 +1112,6 @@ composite_resume(struct usb_gadget *gadget)static struct usb_gadget_driver composite_driver = { .speed =USB_SPEED_HIGH , - .bind = composite_bind, .unbind = composite_unbind, .setup = composite_setup,
@@ -1152,7 +1151,7 @@ int usb_composite_register(struct usb_composite_driver *driver) composite_driver.driver.name = driver->name; composite = driver; -return usb_gadget_register_driver (&composite_driver); +return usb_gadget_probe_driver (&composite_driver, composite_bind); }/**
drivers/usb/gadget/dummy_hcd.c +5 -5
@@ -748,7 +748,8 @@ static DEVICE_ATTR (function, S_IRUGO, show_function, NULL);*/ int -usb_gadget_register_driver (struct usb_gadget_driver *driver) +usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct dummy *dum = the_controller;int retval, i;
@@ -757,8 +758,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver)return -EINVAL ;if (dum->driver)return -EBUSY ; -if (!driver->bind || !driver->setup - || driver->speed ==USB_SPEED_UNKNOWN ) +if (!bind || !driver->setup || driver->speed ==USB_SPEED_UNKNOWN )return -EINVAL ;/*
@@ -796,7 +796,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver) dum->gadget.dev.driver = &driver->driver;dev_dbg (udc_dev (dum),"binding gadget driver '%s'\n" , driver->driver.name); - retval = driver->bind (&dum->gadget); + retval =bind (&dum->gadget);if (retval) { dum->driver =NULL ; dum->gadget.dev.driver =NULL ;
@@ -812,7 +812,7 @@ usb_gadget_register_driver (struct usb_gadget_driver *driver)usb_hcd_poll_rh_status (dummy_to_hcd (dum));return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
drivers/usb/gadget/file_storage.c +1 -2
@@ -3541,7 +3541,6 @@ static struct usb_gadget_driver fsg_driver = { .speed = USB_SPEED_FULL, #endif .function = (char *) fsg_string_product, - .bind = fsg_bind, .unbind = fsg_unbind, .disconnect = fsg_disconnect, .setup = fsg_setup,
@@ -3583,7 +3582,7 @@ static int __init fsg_init(void)if ((rc =fsg_alloc ()) !=0 )return rc; fsg = the_fsg; -if ((rc =usb_gadget_register_driver (&fsg_driver)) !=0 ) +if ((rc =usb_gadget_probe_driver (&fsg_driver, fsg_bind)) !=0 )kref_put (&fsg->ref, fsg_release);return rc; }
drivers/usb/gadget/fsl_qe_udc.c +6 -6
@@ -2301,9 +2301,10 @@ static irqreturn_t qe_udc_irq(int irq, void *_udc) }/*------------------------------------------------------------------------- -Gadget driver register and unregister. +Gadget driver probe and unregister. --------------------------------------------------------------------------*/ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval;unsigned long flags =0 ;
@@ -2314,8 +2315,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || (driver->speed !=USB_SPEED_FULL && driver->speed !=USB_SPEED_HIGH ) - || !driver->bind || !driver->disconnect - || !driver->setup) + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;if (udc_controller->driver)
@@ -2331,7 +2331,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc_controller->gadget.speed = (enum usb_device_speed )(driver->speed);spin_unlock_irqrestore (&udc_controller->lock, flags); - retval = driver->bind (&udc_controller->gadget); + retval =bind (&udc_controller->gadget);if (retval) {dev_err (udc_controller->dev,"bind to %s --> %d" , driver->driver.name, retval);
@@ -2352,7 +2352,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) udc_controller->gadget.name, driver->driver.name);return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/fsl_udc_core.c +5 -5
@@ -1765,7 +1765,8 @@ static irqreturn_t fsl_udc_irq(int irq, void *_udc)* Hook to gadget drivers * Called by initialization code of gadget drivers *----------------------------------------------------------------*/ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval = -ENODEV ;unsigned long flags =0 ;
@@ -1775,8 +1776,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || (driver->speed !=USB_SPEED_FULL && driver->speed !=USB_SPEED_HIGH ) - || !driver->bind || !driver->disconnect - || !driver->setup) + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;if (udc_controller->driver)
@@ -1792,7 +1792,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)spin_unlock_irqrestore (&udc_controller->lock, flags);/* bind udc driver to gadget driver */ - retval = driver->bind (&udc_controller->gadget); + retval =bind (&udc_controller->gadget);if (retval) {VDBG ("bind to %s --> %d" , driver->driver.name, retval); udc_controller->gadget.dev.driver =NULL ;
@@ -1814,7 +1814,7 @@ out: retval);return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* Disconnect from gadget driver */ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
drivers/usb/gadget/gmidi.c +1 -2
@@ -1292,7 +1292,6 @@ static void gmidi_resume(struct usb_gadget *gadget)static struct usb_gadget_driver gmidi_driver = { .speed =USB_SPEED_FULL , .function = (char *)longname, - .bind = gmidi_bind, .unbind = gmidi_unbind, .setup = gmidi_setup,
@@ -1309,7 +1308,7 @@ static struct usb_gadget_driver gmidi_driver = {static int __init gmidi_init (void ) { -return usb_gadget_register_driver (&gmidi_driver); +return usb_gadget_probe_driver (&gmidi_driver, gmidi_bind); }module_init (gmidi_init);
drivers/usb/gadget/goku_udc.c +5 -4
@@ -1343,14 +1343,15 @@ static struct goku_udc *the_controller;* disconnect is reported. then a host may connect again, or * the driver might get unbound. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct goku_udc *dev = the_controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -1363,7 +1364,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) driver->driver.bus =NULL ; dev->driver = driver; dev->gadget.dev.driver = &driver->driver; - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DBG (dev,"bind to driver %s --> error %d\n" , driver->driver.name, retval);
@@ -1380,7 +1381,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)DBG (dev,"registered gadget driver '%s'\n" , driver->driver.name);return 0 ; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);static void stop_activity (struct goku_udc *dev,struct usb_gadget_driver *driver)
drivers/usb/gadget/imx_udc.c +5 -4
@@ -1319,14 +1319,15 @@ static struct imx_udc_struct controller = {* USB gadged driver functions ******************************************************************************* */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct imx_udc_struct *imx_usb = &controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -1342,7 +1343,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) retval =device_add (&imx_usb->gadget.dev);if (retval) goto fail; - retval = driver->bind (&imx_usb->gadget); + retval =bind (&imx_usb->gadget);if (retval) {D_ERR (imx_usb->dev,"<%s> bind to driver %s --> error %d\n" , __func__, driver->driver.name, retval);
@@ -1362,7 +1363,7 @@ fail: imx_usb->gadget.dev.driver =NULL ;return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/inode.c +2 -4
@@ -1777,7 +1777,6 @@ static struct usb_gadget_driver gadgetfs_driver = { .speed = USB_SPEED_FULL, #endif .function = (char *) driver_desc, - .bind = gadgetfs_bind, .unbind = gadgetfs_unbind, .setup = gadgetfs_setup, .disconnect = gadgetfs_disconnect,
@@ -1800,7 +1799,6 @@ static int gadgetfs_probe (struct usb_gadget *gadget)static struct usb_gadget_driver probe_driver = { .speed =USB_SPEED_HIGH , - .bind = gadgetfs_probe, .unbind = gadgetfs_nop, .setup = (void *)gadgetfs_nop, .disconnect = gadgetfs_nop,
@@ -1914,7 +1912,7 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)/* triggers gadgetfs_bind(); then we can enumerate. */ spin_unlock_irq (&dev->lock); - value =usb_gadget_register_driver (&gadgetfs_driver); + value =usb_gadget_probe_driver (&gadgetfs_driver, gadgetfs_bind);if (value !=0 ) {kfree (dev->buf); dev->buf =NULL ;
@@ -2053,7 +2051,7 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent)return -ESRCH ;/* fake probe to determine $CHIP */ - (void )usb_gadget_register_driver (&probe_driver); + (void )usb_gadget_probe_driver (&probe_driver, gadgetfs_probe);if (!CHIP )return -ENODEV ;
drivers/usb/gadget/langwell_udc.c +5 -4
@@ -1807,7 +1807,8 @@ static DEVICE_ATTR(langwell_udc, S_IRUGO, show_langwell_udc, NULL);* the driver might get unbound. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct langwell_udc *dev = the_controller;unsigned long flags;
@@ -1830,7 +1831,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)spin_unlock_irqrestore (&dev->lock, flags); - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DBG (dev,"bind to driver %s --> %d\n" , driver->driver.name, retval);
@@ -1868,7 +1869,7 @@ err_unbind:DBG (dev,"<--- %s()\n" , __func__);return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* unregister gadget driver */
@@ -1882,7 +1883,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)DBG (dev,"---> %s()\n" , __func__); -if (unlikely (!driver || !driver->bind || !driver->unbind)) +if (unlikely (!driver || !driver->unbind))return -EINVAL ;/* unbind OTG transceiver */
drivers/usb/gadget/lh7a40x_udc.c +5 -5
@@ -408,7 +408,8 @@ static void udc_enable(struct lh7a40x_udc *dev)/* Register entry point for the peripheral controller driver. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct lh7a40x_udc *dev = the_controller;int retval;
@@ -417,7 +418,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || driver->speed !=USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -431,7 +432,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) dev->gadget.dev.driver = &driver->driver;device_add (&dev->gadget.dev); - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {printk (KERN_WARNING "%s: bind to driver %s --> error %d\n" , dev->gadget.name, driver->driver.name, retval);
@@ -453,8 +454,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)return 0 ; } - -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/* Unregister entry point for the peripheral controller driver.
drivers/usb/gadget/m66592-udc.c +5 -4
@@ -1454,14 +1454,15 @@ static struct usb_ep_ops m66592_ep_ops = {/*-------------------------------------------------------------------------*/ static struct m66592 *the_controller; -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct m66592 *m66592 = the_controller;int retval;if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind + || !bind || !driver->setup)return -EINVAL ;if (!m66592)
@@ -1480,7 +1481,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) goto error; } - retval = driver->bind (&m66592->gadget); + retval =bind (&m66592->gadget);if (retval) {pr_err ("bind to driver error (%d)\n" , retval);device_del (&m66592->gadget.dev);
@@ -1505,7 +1506,7 @@ error:return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/net2280.c +5 -5
@@ -1929,7 +1929,8 @@ 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_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct net2280 *dev = the_controller;int retval;
@@ -1941,8 +1942,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)*/ if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind - || !driver->setup) + || !bind || !driver->setup)return -EINVAL ;if (!dev)return -ENODEV ;
@@ -1957,7 +1957,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver) driver->driver.bus =NULL ; dev->driver = driver; dev->gadget.dev.driver = &driver->driver; - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DEBUG (dev,"bind to driver %s --> %d\n" , driver->driver.name, retval);
@@ -1993,7 +1993,7 @@ err_unbind: dev->driver =NULL ;return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);static void stop_activity (struct net2280 *dev,struct usb_gadget_driver *driver)
drivers/usb/gadget/omap_udc.c +5 -5
@@ -2102,7 +2102,8 @@ static inline int machine_without_vbus_sense(void) ); } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int status = -ENODEV ;struct omap_ep *ep;
@@ -2114,8 +2115,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)if (!driver// FIXME if otg, check: driver->is_otg || driver->speed <USB_SPEED_FULL - || !driver->bind - || !driver->setup) + || !bind || !driver->setup)return -EINVAL ;spin_lock_irqsave (&udc->lock, flags);
@@ -2145,7 +2145,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver)if (udc->dc_clk !=NULL )omap_udc_enable_clock (1 ); - status = driver->bind (&udc->gadget); + status =bind (&udc->gadget);if (status) {DBG ("bind to %s --> %d\n" , driver->driver.name, status); udc->gadget.dev.driver =NULL ;
@@ -2186,7 +2186,7 @@ done:omap_udc_enable_clock (0 );return status; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/printer.c +2 -3
@@ -1542,7 +1542,6 @@ static struct usb_gadget_driver printer_driver = { .speed = DEVSPEED, .function = (char *) driver_desc, - .bind = printer_bind, .unbind = printer_unbind, .setup = printer_setup,
@@ -1578,11 +1577,11 @@ init(void)return status; } - status =usb_gadget_register_driver (&printer_driver); + status =usb_gadget_probe_driver (&printer_driver, printer_bind);if (status) {class_destroy (usb_gadget_class);unregister_chrdev_region (g_printer_devno,1 ); -DBG (dev,"usb_gadget_register_driver %x\n" , status); +DBG (dev,"usb_gadget_probe_driver %x\n" , status); }return status;
drivers/usb/gadget/pxa25x_udc.c +5 -4
@@ -1280,14 +1280,15 @@ 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_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct pxa25x_udc *dev = the_controller;int retval;if (!driver || driver->speed <USB_SPEED_FULL - || !driver->bind + || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;
@@ -1308,7 +1309,7 @@ fail: dev->gadget.dev.driver =NULL ;return retval; } - retval = driver->bind (&dev->gadget); + retval =bind (&dev->gadget);if (retval) {DMSG ("bind to driver %s --> error %d\n" , driver->driver.name, retval);
@@ -1338,7 +1339,7 @@ fail: bind_fail:return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);static void stop_activity (struct pxa25x_udc *dev,struct usb_gadget_driver *driver)
drivers/usb/gadget/pxa27x_udc.c +7 -5
@@ -1792,8 +1792,9 @@ static void udc_enable(struct pxa_udc *udc) }/** -* usb_gadget_register_driver - Register gadget driver +* usb_gadget_probe_driver - Register gadget driver * @driver: gadget driver +* @bind: bind function * * When a driver is successfully registered, it will receive control requests * including set_configuration(), which enables non-control requests. Then
@@ -1805,12 +1806,13 @@ static void udc_enable(struct pxa_udc *udc)* * Returns 0 if no error, -EINVAL, -ENODEV, -EBUSY otherwise */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct pxa_udc *udc = the_controller;int retval; -if (!driver || driver->speed <USB_SPEED_FULL || !driver->bind +if (!driver || driver->speed <USB_SPEED_FULL || !bind || !driver->disconnect || !driver->setup)return -EINVAL ;if (!udc)
@@ -1828,7 +1830,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)dev_err (udc->dev,"device_add error %d\n" , retval); goto add_fail; } - retval = driver->bind (&udc->gadget); + retval =bind (&udc->gadget);if (retval) {dev_err (udc->dev,"bind to driver %s --> error %d\n" , driver->driver.name, retval);
@@ -1859,7 +1861,7 @@ add_fail: udc->gadget.dev.driver =NULL ;return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);/**
drivers/usb/gadget/r8a66597-udc.c +5 -4
@@ -1405,14 +1405,15 @@ static struct usb_ep_ops r8a66597_ep_ops = {/*-------------------------------------------------------------------------*/ static struct r8a66597 *the_controller; -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct r8a66597 *r8a66597 = the_controller;int retval;if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind + || !bind || !driver->setup)return -EINVAL ;if (!r8a66597)
@@ -1431,7 +1432,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) goto error; } - retval = driver->bind (&r8a66597->gadget); + retval =bind (&r8a66597->gadget);if (retval) {printk (KERN_ERR "bind to driver error (%d)\n" , retval);device_del (&r8a66597->gadget.dev);
@@ -1456,7 +1457,7 @@ error:return retval; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/s3c-hsotg.c +5 -4
@@ -2478,7 +2478,8 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg)return 0 ; } -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct s3c_hsotg *hsotg = our_hsotg;int ret;
@@ -2498,7 +2499,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)dev_err (hsotg->dev,"%s: bad speed\n" , __func__); } -if (!driver->bind || !driver->setup) { +if (!bind || !driver->setup) {dev_err (hsotg->dev,"%s: missing entry points\n" , __func__);return -EINVAL ; }
@@ -2517,7 +2518,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) goto err; } - ret = driver->bind (&hsotg->gadget); + ret =bind (&hsotg->gadget);if (ret) {dev_err (hsotg->dev,"failed bind %s\n" , driver->driver.name);
@@ -2641,7 +2642,7 @@ err: hsotg->gadget.dev.driver =NULL ;return ret; } -EXPORT_SYMBOL (usb_gadget_register_driver); +EXPORT_SYMBOL (usb_gadget_probe_driver);int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) {
drivers/usb/gadget/s3c2410_udc.c +8 -9
@@ -1628,15 +1628,15 @@ static void s3c2410_udc_enable(struct s3c2410_udc *dev) }/* -* usb_gadget_register_driver +* usb_gadget_probe_driver */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {struct s3c2410_udc *udc = the_controller;int retval; -dprintk (DEBUG_NORMAL ,"usb_gadget_register_driver() '%s'\n" , - driver->driver.name); +dprintk (DEBUG_NORMAL ,"%s() '%s'\n" , __func__, driver->driver.name);/* Sanity checks */ if (!udc)
@@ -1645,10 +1645,9 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (udc->driver)return -EBUSY ; -if (!driver->bind || !driver->setup - || driver->speed <USB_SPEED_FULL ) { +if (!bind || !driver->setup || driver->speed <USB_SPEED_FULL ) {printk (KERN_ERR "Invalid driver: bind %p setup %p speed %d\n" , - driver->bind, driver->setup, driver->speed); + bind, driver->setup, driver->speed);return -EINVAL ; }#if defined(MODULE )
@@ -1671,7 +1670,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)dprintk (DEBUG_NORMAL ,"binding gadget driver '%s'\n" , driver->driver.name); -if ((retval = driver->bind (&udc->gadget)) !=0 ) { +if ((retval =bind (&udc->gadget)) !=0 ) {device_del (&udc->gadget.dev); goto register_error; }
@@ -1686,6 +1685,7 @@ register_error: udc->gadget.dev.driver =NULL ;return retval; } +EXPORT_SYMBOL (usb_gadget_probe_driver);/* * usb_gadget_unregister_driver
@@ -2045,7 +2045,6 @@ static void __exit udc_exit(void) }EXPORT_SYMBOL (usb_gadget_unregister_driver); -EXPORT_SYMBOL (usb_gadget_register_driver);module_init (udc_init);module_exit (udc_exit);
drivers/usb/musb/musb_gadget.c +5 -4
@@ -1696,9 +1696,11 @@ void musb_gadget_cleanup(struct musb *musb)* -ENOMEM no memeory to perform the operation * * @param driver the gadget driver +* @param bind the driver's bind function * @return <0 if error, 0 if everything is fine */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver) +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *)) {int retval;unsigned long flags;
@@ -1706,8 +1708,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)if (!driver || driver->speed !=USB_SPEED_HIGH - || !driver->bind - || !driver->setup) + || !bind || !driver->setup)return -EINVAL ;/* driver must be initialized to support peripheral mode */
@@ -1735,7 +1736,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)spin_unlock_irqrestore (&musb->lock, flags);if (retval ==0 ) { - retval = driver->bind (&musb->g); + retval =bind (&musb->g);if (retval !=0 ) {DBG (3 ,"bind to driver %s failed --> %d\n" , driver->driver.name, retval);
include/linux/usb/gadget.h +8 -12
@@ -705,11 +705,6 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget)* struct usb_gadget_driver - driver for usb 'slave' devices * @function: String describing the gadget's function * @speed: Highest speed the driver handles. -* @bind: Invoked when the driver is bound to a gadget, usually -* after registering the driver. -* At that point, ep0 is fully initialized, and ep_list holds -* the currently-available endpoints. -* Called in a context that permits sleeping. * @setup: Invoked for ep0 control requests that aren't handled by * the hardware level driver. Most calls must be handled by * the gadget driver, including descriptor and configuration
@@ -774,7 +769,6 @@ static inline int usb_gadget_disconnect(struct usb_gadget *gadget)struct usb_gadget_driver {char *function;enum usb_device_speed speed; -int (*bind)(struct usb_gadget *);void (*unbind)(struct usb_gadget *);int (*setup)(struct usb_gadget *,const struct usb_ctrlrequest *);
@@ -798,17 +792,19 @@ struct usb_gadget_driver {*/ /** -* usb_gadget_register_driver - register a gadget driver -* @driver:the driver being registered +* usb_gadget_probe_driver - probe a gadget driver +* @driver: the driver being registered +* @bind: the driver's bind callback * Context: can sleep * * Call this in your gadget driver's module initialization function, * to tell the underlying usb controller driver about your driver. -* The driver's bind() function will be called to bind it to a -* gadget before this registration call returns. It's expected that -* the bind() functions will be in init sections. +* The @bind() function will be called to bind it to a gadget before this +* registration call returns. It's expected that the @bind() function will +* be in init sections. */ -int usb_gadget_register_driver (struct usb_gadget_driver *driver); +int usb_gadget_probe_driver (struct usb_gadget_driver *driver, +int (*bind)(struct usb_gadget *));/** * usb_gadget_unregister_driver - unregister a gadget driver
Signature · 1 line
1.7.1
Re: [PATCH 1/2] usb gadget: don't save bind callback in struct usb_gadget_driver
drivers/usb/gadget/s3c2410_udc.c static void __exit udc_exit(void) · line 2047
Quoted 5 lines · Uwe Kleine-König
drivers/usb/gadget/s3c2410_udc.c +0
-1@@ -2045,7 +2045,6 @@ static void __exit udc_exit(void) }EXPORT_SYMBOL (usb_gadget_unregister_driver); -EXPORT_SYMBOL (usb_gadget_register_driver);
*IF* you are going to send an updated patch, how about removing empty line above this EXPORT_SYMBOL().
So for what it's worth the changes look good to me.
Signature · 4 lines
Best regards, _ _ | Humble Liege of Serenely Enlightened Majesty of o' \,=./ `o | Computer Science, Michał "mina86" Nazarewicz (o o) +----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--
Re: [PATCH 1/2] usb gadget: don't save bind callback in struct usb_gadget_driver
Quoted 9 lines · Michał Nazarewicz
drivers/usb/gadget/s3c2410_udc.c static void __exit udc_exit(void) · line 2047
Quoted 5 lines · Uwe Kleine-König
drivers/usb/gadget/s3c2410_udc.c +0
-1@@ -2045,7 +2045,6 @@ static void __exit udc_exit(void) }EXPORT_SYMBOL (usb_gadget_unregister_driver); -EXPORT_SYMBOL (usb_gadget_register_driver);*IF* you are going to send an updated patch, how about removing empty line above this
EXPORT_SYMBOL().
I kept that, because the '}' doesn't belong tousb_gadget_unregister_driver.
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ |
Re: [PATCH 1/2] usb gadget: don't save bind callback in struct usb_gadget_driver
Quoted 11 lines · Uwe Kleine-König
Quoted 9 lines · Michał Nazarewicz
drivers/usb/gadget/s3c2410_udc.c static void __exit udc_exit(void) · line 2047
Quoted 5 lines · Uwe Kleine-König
drivers/usb/gadget/s3c2410_udc.c +0
-1@@ -2045,7 +2045,6 @@ static void __exit udc_exit(void) }EXPORT_SYMBOL (usb_gadget_unregister_driver); -EXPORT_SYMBOL (usb_gadget_register_driver);*IF* you are going to send an updated patch, how about removing empty line above this
EXPORT_SYMBOL().
Quoted 2 lines
I kept that, because the '}' doesn't belong to
usb_gadget_unregister_driver.
In that case disregard my last comment. Move along, nothing to see. ;)
Signature · 4 lines
Best regards, _ _ | Humble Liege of Serenely Enlightened Majesty of o' \,=./ `o | Computer Science, Michał "mina86" Nazarewicz (o o) +----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--
PATCH 2/2 usb gadget: don't save bind callback in struct usb_configuration
In reply to Uwe Kleine-KönigThe bind function is only called at init time so there is no need to save a pointer to it in the driver struct.
This fixes many section mismatches reported by modpost.
--- drivers/usb/gadget/audio.c | 3 +-- drivers/usb/gadget/cdc2.c | 3 +-- drivers/usb/gadget/composite.c | 14 ++++++++------ drivers/usb/gadget/ether.c | 7 +++---- drivers/usb/gadget/f_loopback.c | 3 +-- drivers/usb/gadget/f_sourcesink.c | 3 +-- drivers/usb/gadget/g_ffs.c | 9 +++------ drivers/usb/gadget/hid.c | 3 +-- drivers/usb/gadget/mass_storage.c | 3 +-- drivers/usb/gadget/multi.c | 6 ++---- drivers/usb/gadget/nokia.c | 8 ++++---- drivers/usb/gadget/serial.c | 4 ++-- drivers/usb/gadget/webcam.c | 4 ++-- include/linux/usb/composite.h | 5 +---- 14 files changed, 31 insertions(+), 44 deletions(-)
drivers/usb/gadget/audio.c +1 -2
@@ -105,7 +105,6 @@ static int __init audio_do_config(struct usb_configuration *c)static struct usb_configuration audio_config_driver = { .label =DRIVER_DESC , - .bind = audio_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -145,7 +144,7 @@ static int __init audio_bind(struct usb_composite_dev *cdev) strings_dev[STRING_PRODUCT_IDX ].id = status; device_desc.iProduct = status; - status =usb_add_config (cdev, &audio_config_driver); + status =usb_add_config (cdev, &audio_config_driver, audio_do_config);if (status <0 ) goto fail;
drivers/usb/gadget/cdc2.c +1 -2
@@ -151,7 +151,6 @@ static int __init cdc_do_config(struct usb_configuration *c)static struct usb_configuration cdc_config_driver = { .label ="CDC Composite (ECM + ACM)" , - .bind = cdc_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -218,7 +217,7 @@ static int __init cdc_bind(struct usb_composite_dev *cdev) device_desc.iProduct = status;/* register our configuration */ - status =usb_add_config (cdev, &cdc_config_driver); + status =usb_add_config (cdev, &cdc_config_driver, cdc_do_config);if (status <0 ) goto fail1;
drivers/usb/gadget/composite.c +8 -6
@@ -470,18 +470,20 @@ done:* usb_add_config() - add a configuration to a device. * @cdev: wraps the USB gadget * @config: the configuration, with bConfigurationValue assigned +* @bind: the configuration's bind function * Context: single threaded during gadget setup * -* One of the main tasks of a composite driver's bind() routine is to +* One of the main tasks of a composite @bind() routine is to * add each of the configurations it supports, using this routine. * -* This function returns the value of the configuration's bind(), which +* This function returns the value of the configuration's @bind(), which * is zero for success else a negative errno value. Binding configurations * assigns global resources including string IDs, and per-configuration * resources such as interface IDs and endpoints. */ int usb_add_config (struct usb_composite_dev *cdev, -struct usb_configuration *config) +struct usb_configuration *config, +int (*bind)(struct usb_configuration *)) {int status = -EINVAL ;struct usb_configuration *c;
@@ -490,7 +492,7 @@ int usb_add_config(struct usb_composite_dev *cdev, config->bConfigurationValue, config->label, config); -if (!config->bConfigurationValue || !config->bind) +if (!config->bConfigurationValue || !bind) goto done;/* Prevent duplicate configuration identifiers */
@@ -507,7 +509,7 @@ int usb_add_config(struct usb_composite_dev *cdev,INIT_LIST_HEAD (&config->functions); config->next_interface_id =0 ; - status = config->bind (config); + status =bind (config);if (status <0 ) {list_del (&config->list); config->cdev =NULL ;
@@ -533,7 +535,7 @@ int usb_add_config(struct usb_composite_dev *cdev, } } -/* set_alt(), or next config->bind(), sets up +/* set_alt(), or next bind(), sets up * ep->driver_data as needed. */ usb_ep_autoconfig_reset (cdev->gadget);
drivers/usb/gadget/ether.c +3 -4
@@ -251,7 +251,6 @@ static int __init rndis_do_config(struct usb_configuration *c)static struct usb_configuration rndis_config_driver = { .label ="RNDIS" , - .bind = rndis_do_config, .bConfigurationValue =2 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -289,7 +288,6 @@ static int __init eth_do_config(struct usb_configuration *c)static struct usb_configuration eth_config_driver = {/* .label = f(hardware) */ - .bind = eth_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -373,12 +371,13 @@ static int __init eth_bind(struct usb_composite_dev *cdev)/* register our configuration(s); RNDIS first, if it's used */ if (has_rndis ()) { - status =usb_add_config (cdev, &rndis_config_driver); + status =usb_add_config (cdev, &rndis_config_driver, + rndis_do_config);if (status <0 ) goto fail; } - status =usb_add_config (cdev, ð_config_driver); + status =usb_add_config (cdev, ð_config_driver, eth_do_config);if (status <0 ) goto fail;
drivers/usb/gadget/f_loopback.c +1 -2
@@ -349,7 +349,6 @@ static int __init loopback_bind_config(struct usb_configuration *c)static struct usb_configuration loopback_driver = { .label ="loopback" , .strings = loopback_strings, - .bind = loopback_bind_config, .bConfigurationValue =2 , .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,/* .iConfiguration = DYNAMIC */
@@ -382,5 +381,5 @@ int __init loopback_add(struct usb_composite_dev *cdev, bool autoresume) loopback_driver.bmAttributes |=USB_CONFIG_ATT_WAKEUP ; } -return usb_add_config (cdev, &loopback_driver); +return usb_add_config (cdev, &loopback_driver, loopback_bind_config); }
drivers/usb/gadget/f_sourcesink.c +1 -2
@@ -498,7 +498,6 @@ unknown:static struct usb_configuration sourcesink_driver = { .label ="source/sink" , .strings = sourcesink_strings, - .bind = sourcesink_bind_config, .setup = sourcesink_setup, .bConfigurationValue =3 , .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -532,5 +531,5 @@ int __init sourcesink_add(struct usb_composite_dev *cdev, bool autoresume) sourcesink_driver.bmAttributes |=USB_CONFIG_ATT_WAKEUP ; } -return usb_add_config (cdev, &sourcesink_driver); +return usb_add_config (cdev, &sourcesink_driver, sourcesink_bind_config); }
drivers/usb/gadget/g_ffs.c +3 -6
@@ -151,13 +151,12 @@ static int gfs_do_rndis_config(struct usb_configuration *c);static struct usb_configuration gfs_rndis_config_driver = { .label ="FunctionFS + RNDIS" , - .bind = gfs_do_rndis_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER , };# define gfs_add_rndis_config (cdev) \ - usb_add_config(cdev, &gfs_rndis_config_driver) + usb_add_config(cdev, &gfs_rndis_config_driver, gfs_do_rndis_config)#else # define gfs_add_rndis_config (cdev) 0#endif
@@ -168,13 +167,12 @@ static int gfs_do_ecm_config(struct usb_configuration *c);static struct usb_configuration gfs_ecm_config_driver = { .label ="FunctionFS + ECM" , - .bind = gfs_do_ecm_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER , };# define gfs_add_ecm_config (cdev) \ - usb_add_config(cdev, &gfs_ecm_config_driver) + usb_add_config(cdev, &gfs_ecm_config_driver, gfs_do_ecm_config)#else # define gfs_add_ecm_config (cdev) 0#endif
@@ -185,13 +183,12 @@ static int gfs_do_generic_config(struct usb_configuration *c);static struct usb_configuration gfs_generic_config_driver = { .label ="FunctionFS" , - .bind = gfs_do_generic_config, .bConfigurationValue =2 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER , };# define gfs_add_generic_config (cdev) \ - usb_add_config(cdev, &gfs_generic_config_driver) + usb_add_config(cdev, &gfs_generic_config_driver, gfs_do_generic_config)#else # define gfs_add_generic_config (cdev) 0#endif
drivers/usb/gadget/hid.c +1 -2
@@ -148,7 +148,6 @@ static int __init do_config(struct usb_configuration *c)static struct usb_configuration config_driver = { .label ="HID Gadget" , - .bind = do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -201,7 +200,7 @@ static int __init hid_bind(struct usb_composite_dev *cdev) device_desc.iProduct = status;/* register our configuration */ - status =usb_add_config (cdev, &config_driver); + status =usb_add_config (cdev, &config_driver, do_config);if (status <0 )return status;
drivers/usb/gadget/mass_storage.c +1 -2
@@ -165,7 +165,6 @@ static int __init msg_do_config(struct usb_configuration *c)static struct usb_configuration msg_config_driver = { .label ="Linux File-Backed Storage" , - .bind = msg_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -208,7 +207,7 @@ static int __init msg_bind(struct usb_composite_dev *cdev) msg_config_driver.iConfiguration = status;/* register our second configuration */ - status =usb_add_config (cdev, &msg_config_driver); + status =usb_add_config (cdev, &msg_config_driver, msg_do_config);if (status <0 )return status;
drivers/usb/gadget/multi.c +2 -4
@@ -181,7 +181,6 @@ static int __init rndis_do_config(struct usb_configuration *c)static struct usb_configuration rndis_config_driver = { .label ="Multifunction Composite (RNDIS + MS + ACM)" , - .bind = rndis_do_config, .bConfigurationValue =2 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -217,7 +216,6 @@ static int __init cdc_do_config(struct usb_configuration *c)static struct usb_configuration cdc_config_driver = { .label ="Multifunction Composite (CDC + MS + ACM)" , - .bind = cdc_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -295,14 +293,14 @@ static int __init multi_bind(struct usb_composite_dev *cdev)#ifdef USB_ETH_RNDIS /* register our first configuration */ - status =usb_add_config (cdev, &rndis_config_driver); + status =usb_add_config (cdev, &rndis_config_driver, rndis_do_config);if (status <0 ) goto fail2;#endif #ifdef CONFIG_USB_G_MULTI_CDC /* register our second configuration */ - status =usb_add_config (cdev, &cdc_config_driver); + status =usb_add_config (cdev, &cdc_config_driver, cdc_do_config);if (status <0 ) goto fail2;#endif
drivers/usb/gadget/nokia.c +4 -4
@@ -135,7 +135,6 @@ static int __init nokia_bind_config(struct usb_configuration *c)static struct usb_configuration nokia_config_500ma_driver = { .label ="Bus Powered" , - .bind = nokia_bind_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_ONE ,
@@ -144,7 +143,6 @@ static struct usb_configuration nokia_config_500ma_driver = {static struct usb_configuration nokia_config_100ma_driver = { .label ="Self Powered" , - .bind = nokia_bind_config, .bConfigurationValue =2 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_ONE |USB_CONFIG_ATT_SELFPOWER ,
@@ -206,11 +204,13 @@ static int __init nokia_bind(struct usb_composite_dev *cdev) }/* finaly register the configuration */ - status =usb_add_config (cdev, &nokia_config_500ma_driver); + status =usb_add_config (cdev, &nokia_config_500ma_driver, + nokia_bind_config);if (status <0 ) goto err_usb; - status =usb_add_config (cdev, &nokia_config_100ma_driver); + status =usb_add_config (cdev, &nokia_config_100ma_driver, + nokia_bind_config);if (status <0 ) goto err_usb;
drivers/usb/gadget/serial.c +2 -2
@@ -155,7 +155,6 @@ static int __init serial_bind_config(struct usb_configuration *c)static struct usb_configuration serial_config_driver = {/* .label = f(use_acm) */ - .bind = serial_bind_config,/* .bConfigurationValue = f(use_acm) */ /* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -225,7 +224,8 @@ static int __init gs_bind(struct usb_composite_dev *cdev) }/* register our configuration */ - status =usb_add_config (cdev, &serial_config_driver); + status =usb_add_config (cdev, &serial_config_driver, + serial_bind_config);if (status <0 ) goto fail;
drivers/usb/gadget/webcam.c +2 -2
@@ -317,7 +317,6 @@ webcam_config_bind(struct usb_configuration *c)static struct usb_configuration webcam_config_driver = { .label = webcam_config_label, - .bind = webcam_config_bind, .bConfigurationValue =1 , .iConfiguration =0 ,/* dynamic */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -354,7 +353,8 @@ webcam_bind(struct usb_composite_dev *cdev) webcam_config_driver.iConfiguration = ret;/* Register our configuration. */ -if ((ret =usb_add_config (cdev, &webcam_config_driver)) <0 ) +if ((ret =usb_add_config (cdev, &webcam_config_driver, + webcam_config_bind)) <0 ) goto error;INFO (cdev,"Webcam Video Gadget\n" );
include/linux/usb/composite.h +1 -4
@@ -161,8 +161,6 @@ ep_choose(struct usb_gadget *g, struct usb_endpoint_descriptor *hs,* and by language IDs provided in control requests. * @descriptors: Table of descriptors preceding all function descriptors. * Examples include OTG and vendor-specific descriptors. -* @bind: Called from @usb_add_config() to allocate resources unique to this -* configuration and to call @usb_add_function() for each function used. * @unbind: Reverses @bind; called as a side effect of unregistering the * driver which added this configuration. * @setup: Used to delegate control requests that aren't handled by standard
@@ -207,8 +205,7 @@ struct usb_configuration {* we can't restructure things to avoid mismatching... */ -/* configuration management: bind/unbind */ -int (*bind)(struct usb_configuration *); +/* configuration management: unbind/setup */ void (*unbind)(struct usb_configuration *);int (*setup)(struct usb_configuration *,const struct usb_ctrlrequest *);
Signature · 1 line
1.7.1
Re: [PATCH 2/2] usb gadget: don't save bind callback in struct usb_configuration
Quoted 2 lines · Uwe Kleine-König
The bind function is only called at init time so there is no need to save a pointer to it in the driver struct.
This is not entirely true. How about such wording:
The bind function is often called only at init time so there is no neet to save a pointer to it in the configuration structure.
Also note, that if you are fixing composite gadgets as well, there's also usb_composite_driver structure and accompanying usb_composite_register() function.
Other then that, for what it's worth, the patch looks good to me.
Signature · 4 lines
Best regards, _ _ | Humble Liege of Serenely Enlightened Majesty of o' \,=./ `o | Computer Science, Michał "mina86" Nazarewicz (o o) +----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--
Re: [PATCH 2/2] usb gadget: don't save bind callback in struct usb_configuration
Quoted 9 lines · Michał Nazarewicz
Quoted 2 lines · Uwe Kleine-König
The bind function is only called at init time so there is no need to save a pointer to it in the driver struct.
This is not entirely true. How about such wording:
The bind function is often called only at init time so there is no neet to save a pointer to it in the configuration structure.
OK.
Quoted 3 lines
Also note, that if you are fixing composite gadgets as well, there's also
usb_composite_driverstructure and accompanyingusb_composite_register()function.
This is ortogonal to my two patches, right? Will look into it later.
Thanks
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ |
Re: [PATCH 2/2] usb gadget: don't save bind callback in struct usb_configuration
Quoted 4 lines · Michał Nazarewicz
Quoted 3 lines
Also note, that if you are fixing composite gadgets as well, there's also
usb_composite_driverstructure and accompanyingusb_composite_register()function.
Quoted 1 line · Uwe Kleine-König
This is ortogonal to my two patches, right? Will look into it later.
Yep.
Signature · 4 lines
Best regards, _ _ | Humble Liege of Serenely Enlightened Majesty of o' \,=./ `o | Computer Science, Michał "mina86" Nazarewicz (o o) +----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--
PATCH v2 2/2 usb gadget: don't save bind callback in struct usb_configuration
In reply to Michał NazarewiczThe bind function is most of the time only called at init time so there is no need to save a pointer to it in the configuration structure.
This fixes many section mismatches reported by modpost.
---
changes since v1:
- reworded commit log as suggested by Michał
drivers/usb/gadget/audio.c | 3 +-- drivers/usb/gadget/cdc2.c | 3 +-- drivers/usb/gadget/composite.c | 14 ++++++++------ drivers/usb/gadget/ether.c | 7 +++---- drivers/usb/gadget/f_loopback.c | 3 +-- drivers/usb/gadget/f_sourcesink.c | 3 +-- drivers/usb/gadget/g_ffs.c | 9 +++------ drivers/usb/gadget/hid.c | 3 +-- drivers/usb/gadget/mass_storage.c | 3 +-- drivers/usb/gadget/multi.c | 6 ++---- drivers/usb/gadget/nokia.c | 8 ++++---- drivers/usb/gadget/serial.c | 4 ++-- drivers/usb/gadget/webcam.c | 4 ++-- include/linux/usb/composite.h | 5 +---- 14 files changed, 31 insertions(+), 44 deletions(-)
drivers/usb/gadget/audio.c +1 -2
@@ -105,7 +105,6 @@ static int __init audio_do_config(struct usb_configuration *c)static struct usb_configuration audio_config_driver = { .label =DRIVER_DESC , - .bind = audio_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -145,7 +144,7 @@ static int __init audio_bind(struct usb_composite_dev *cdev) strings_dev[STRING_PRODUCT_IDX ].id = status; device_desc.iProduct = status; - status =usb_add_config (cdev, &audio_config_driver); + status =usb_add_config (cdev, &audio_config_driver, audio_do_config);if (status <0 ) goto fail;
drivers/usb/gadget/cdc2.c +1 -2
@@ -151,7 +151,6 @@ static int __init cdc_do_config(struct usb_configuration *c)static struct usb_configuration cdc_config_driver = { .label ="CDC Composite (ECM + ACM)" , - .bind = cdc_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -218,7 +217,7 @@ static int __init cdc_bind(struct usb_composite_dev *cdev) device_desc.iProduct = status;/* register our configuration */ - status =usb_add_config (cdev, &cdc_config_driver); + status =usb_add_config (cdev, &cdc_config_driver, cdc_do_config);if (status <0 ) goto fail1;
drivers/usb/gadget/composite.c +8 -6
@@ -470,18 +470,20 @@ done:* usb_add_config() - add a configuration to a device. * @cdev: wraps the USB gadget * @config: the configuration, with bConfigurationValue assigned +* @bind: the configuration's bind function * Context: single threaded during gadget setup * -* One of the main tasks of a composite driver's bind() routine is to +* One of the main tasks of a composite @bind() routine is to * add each of the configurations it supports, using this routine. * -* This function returns the value of the configuration's bind(), which +* This function returns the value of the configuration's @bind(), which * is zero for success else a negative errno value. Binding configurations * assigns global resources including string IDs, and per-configuration * resources such as interface IDs and endpoints. */ int usb_add_config (struct usb_composite_dev *cdev, -struct usb_configuration *config) +struct usb_configuration *config, +int (*bind)(struct usb_configuration *)) {int status = -EINVAL ;struct usb_configuration *c;
@@ -490,7 +492,7 @@ int usb_add_config(struct usb_composite_dev *cdev, config->bConfigurationValue, config->label, config); -if (!config->bConfigurationValue || !config->bind) +if (!config->bConfigurationValue || !bind) goto done;/* Prevent duplicate configuration identifiers */
@@ -507,7 +509,7 @@ int usb_add_config(struct usb_composite_dev *cdev,INIT_LIST_HEAD (&config->functions); config->next_interface_id =0 ; - status = config->bind (config); + status =bind (config);if (status <0 ) {list_del (&config->list); config->cdev =NULL ;
@@ -533,7 +535,7 @@ int usb_add_config(struct usb_composite_dev *cdev, } } -/* set_alt(), or next config->bind(), sets up +/* set_alt(), or next bind(), sets up * ep->driver_data as needed. */ usb_ep_autoconfig_reset (cdev->gadget);
drivers/usb/gadget/ether.c +3 -4
@@ -251,7 +251,6 @@ static int __init rndis_do_config(struct usb_configuration *c)static struct usb_configuration rndis_config_driver = { .label ="RNDIS" , - .bind = rndis_do_config, .bConfigurationValue =2 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -289,7 +288,6 @@ static int __init eth_do_config(struct usb_configuration *c)static struct usb_configuration eth_config_driver = {/* .label = f(hardware) */ - .bind = eth_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -373,12 +371,13 @@ static int __init eth_bind(struct usb_composite_dev *cdev)/* register our configuration(s); RNDIS first, if it's used */ if (has_rndis ()) { - status =usb_add_config (cdev, &rndis_config_driver); + status =usb_add_config (cdev, &rndis_config_driver, + rndis_do_config);if (status <0 ) goto fail; } - status =usb_add_config (cdev, ð_config_driver); + status =usb_add_config (cdev, ð_config_driver, eth_do_config);if (status <0 ) goto fail;
drivers/usb/gadget/f_loopback.c +1 -2
@@ -349,7 +349,6 @@ static int __init loopback_bind_config(struct usb_configuration *c)static struct usb_configuration loopback_driver = { .label ="loopback" , .strings = loopback_strings, - .bind = loopback_bind_config, .bConfigurationValue =2 , .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,/* .iConfiguration = DYNAMIC */
@@ -382,5 +381,5 @@ int __init loopback_add(struct usb_composite_dev *cdev, bool autoresume) loopback_driver.bmAttributes |=USB_CONFIG_ATT_WAKEUP ; } -return usb_add_config (cdev, &loopback_driver); +return usb_add_config (cdev, &loopback_driver, loopback_bind_config); }
drivers/usb/gadget/f_sourcesink.c +1 -2
@@ -498,7 +498,6 @@ unknown:static struct usb_configuration sourcesink_driver = { .label ="source/sink" , .strings = sourcesink_strings, - .bind = sourcesink_bind_config, .setup = sourcesink_setup, .bConfigurationValue =3 , .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -532,5 +531,5 @@ int __init sourcesink_add(struct usb_composite_dev *cdev, bool autoresume) sourcesink_driver.bmAttributes |=USB_CONFIG_ATT_WAKEUP ; } -return usb_add_config (cdev, &sourcesink_driver); +return usb_add_config (cdev, &sourcesink_driver, sourcesink_bind_config); }
drivers/usb/gadget/g_ffs.c +3 -6
@@ -151,13 +151,12 @@ static int gfs_do_rndis_config(struct usb_configuration *c);static struct usb_configuration gfs_rndis_config_driver = { .label ="FunctionFS + RNDIS" , - .bind = gfs_do_rndis_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER , };# define gfs_add_rndis_config (cdev) \ - usb_add_config(cdev, &gfs_rndis_config_driver) + usb_add_config(cdev, &gfs_rndis_config_driver, gfs_do_rndis_config)#else # define gfs_add_rndis_config (cdev) 0#endif
@@ -168,13 +167,12 @@ static int gfs_do_ecm_config(struct usb_configuration *c);static struct usb_configuration gfs_ecm_config_driver = { .label ="FunctionFS + ECM" , - .bind = gfs_do_ecm_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER , };# define gfs_add_ecm_config (cdev) \ - usb_add_config(cdev, &gfs_ecm_config_driver) + usb_add_config(cdev, &gfs_ecm_config_driver, gfs_do_ecm_config)#else # define gfs_add_ecm_config (cdev) 0#endif
@@ -185,13 +183,12 @@ static int gfs_do_generic_config(struct usb_configuration *c);static struct usb_configuration gfs_generic_config_driver = { .label ="FunctionFS" , - .bind = gfs_do_generic_config, .bConfigurationValue =2 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER , };# define gfs_add_generic_config (cdev) \ - usb_add_config(cdev, &gfs_generic_config_driver) + usb_add_config(cdev, &gfs_generic_config_driver, gfs_do_generic_config)#else # define gfs_add_generic_config (cdev) 0#endif
drivers/usb/gadget/hid.c +1 -2
@@ -148,7 +148,6 @@ static int __init do_config(struct usb_configuration *c)static struct usb_configuration config_driver = { .label ="HID Gadget" , - .bind = do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -201,7 +200,7 @@ static int __init hid_bind(struct usb_composite_dev *cdev) device_desc.iProduct = status;/* register our configuration */ - status =usb_add_config (cdev, &config_driver); + status =usb_add_config (cdev, &config_driver, do_config);if (status <0 )return status;
drivers/usb/gadget/mass_storage.c +1 -2
@@ -165,7 +165,6 @@ static int __init msg_do_config(struct usb_configuration *c)static struct usb_configuration msg_config_driver = { .label ="Linux File-Backed Storage" , - .bind = msg_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -208,7 +207,7 @@ static int __init msg_bind(struct usb_composite_dev *cdev) msg_config_driver.iConfiguration = status;/* register our second configuration */ - status =usb_add_config (cdev, &msg_config_driver); + status =usb_add_config (cdev, &msg_config_driver, msg_do_config);if (status <0 )return status;
drivers/usb/gadget/multi.c +2 -4
@@ -181,7 +181,6 @@ static int __init rndis_do_config(struct usb_configuration *c)static struct usb_configuration rndis_config_driver = { .label ="Multifunction Composite (RNDIS + MS + ACM)" , - .bind = rndis_do_config, .bConfigurationValue =2 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -217,7 +216,6 @@ static int __init cdc_do_config(struct usb_configuration *c)static struct usb_configuration cdc_config_driver = { .label ="Multifunction Composite (CDC + MS + ACM)" , - .bind = cdc_do_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -295,14 +293,14 @@ static int __init multi_bind(struct usb_composite_dev *cdev)#ifdef USB_ETH_RNDIS /* register our first configuration */ - status =usb_add_config (cdev, &rndis_config_driver); + status =usb_add_config (cdev, &rndis_config_driver, rndis_do_config);if (status <0 ) goto fail2;#endif #ifdef CONFIG_USB_G_MULTI_CDC /* register our second configuration */ - status =usb_add_config (cdev, &cdc_config_driver); + status =usb_add_config (cdev, &cdc_config_driver, cdc_do_config);if (status <0 ) goto fail2;#endif
drivers/usb/gadget/nokia.c +4 -4
@@ -135,7 +135,6 @@ static int __init nokia_bind_config(struct usb_configuration *c)static struct usb_configuration nokia_config_500ma_driver = { .label ="Bus Powered" , - .bind = nokia_bind_config, .bConfigurationValue =1 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_ONE ,
@@ -144,7 +143,6 @@ static struct usb_configuration nokia_config_500ma_driver = {static struct usb_configuration nokia_config_100ma_driver = { .label ="Self Powered" , - .bind = nokia_bind_config, .bConfigurationValue =2 ,/* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_ONE |USB_CONFIG_ATT_SELFPOWER ,
@@ -206,11 +204,13 @@ static int __init nokia_bind(struct usb_composite_dev *cdev) }/* finaly register the configuration */ - status =usb_add_config (cdev, &nokia_config_500ma_driver); + status =usb_add_config (cdev, &nokia_config_500ma_driver, + nokia_bind_config);if (status <0 ) goto err_usb; - status =usb_add_config (cdev, &nokia_config_100ma_driver); + status =usb_add_config (cdev, &nokia_config_100ma_driver, + nokia_bind_config);if (status <0 ) goto err_usb;
drivers/usb/gadget/serial.c +2 -2
@@ -155,7 +155,6 @@ static int __init serial_bind_config(struct usb_configuration *c)static struct usb_configuration serial_config_driver = {/* .label = f(use_acm) */ - .bind = serial_bind_config,/* .bConfigurationValue = f(use_acm) */ /* .iConfiguration = DYNAMIC */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -225,7 +224,8 @@ static int __init gs_bind(struct usb_composite_dev *cdev) }/* register our configuration */ - status =usb_add_config (cdev, &serial_config_driver); + status =usb_add_config (cdev, &serial_config_driver, + serial_bind_config);if (status <0 ) goto fail;
drivers/usb/gadget/webcam.c +2 -2
@@ -317,7 +317,6 @@ webcam_config_bind(struct usb_configuration *c)static struct usb_configuration webcam_config_driver = { .label = webcam_config_label, - .bind = webcam_config_bind, .bConfigurationValue =1 , .iConfiguration =0 ,/* dynamic */ .bmAttributes =USB_CONFIG_ATT_SELFPOWER ,
@@ -354,7 +353,8 @@ webcam_bind(struct usb_composite_dev *cdev) webcam_config_driver.iConfiguration = ret;/* Register our configuration. */ -if ((ret =usb_add_config (cdev, &webcam_config_driver)) <0 ) +if ((ret =usb_add_config (cdev, &webcam_config_driver, + webcam_config_bind)) <0 ) goto error;INFO (cdev,"Webcam Video Gadget\n" );
include/linux/usb/composite.h +1 -4
@@ -161,8 +161,6 @@ ep_choose(struct usb_gadget *g, struct usb_endpoint_descriptor *hs,* and by language IDs provided in control requests. * @descriptors: Table of descriptors preceding all function descriptors. * Examples include OTG and vendor-specific descriptors. -* @bind: Called from @usb_add_config() to allocate resources unique to this -* configuration and to call @usb_add_function() for each function used. * @unbind: Reverses @bind; called as a side effect of unregistering the * driver which added this configuration. * @setup: Used to delegate control requests that aren't handled by standard
@@ -207,8 +205,7 @@ struct usb_configuration {* we can't restructure things to avoid mismatching... */ -/* configuration management: bind/unbind */ -int (*bind)(struct usb_configuration *); +/* configuration management: unbind/setup */ void (*unbind)(struct usb_configuration *);int (*setup)(struct usb_configuration *,const struct usb_ctrlrequest *);
Signature · 1 line
1.7.1
Re: [PATCH 2/2 v2] usb gadget: don't save bind callback in struct usb_configuration
Quoted 10 lines · Uwe Kleine-König
The bind function is most of the time only called at init time so there is no need to save a pointer to it in the configuration structure.
This fixes many section mismatches reported by modpost.
Signed-off-by Uwe Kleine-König <[email protected]>Cc Michał Nazarewicz <[email protected]>Cc Greg Kroah-Hartman <[email protected]>---
changes since v1:
I'm confused, can you resend what you want me to apply please?
Do I need to drop Michał's patch before applying yours?
thanks,
greg k-h
Re: [PATCH 2/2 v2] usb gadget: don't save bind callback in struct usb_configuration
Quoted 6 lines · Greg KH
Quoted 5 lines · Uwe Kleine-König
The bind function is most of the time only called at init time so there is no need to save a pointer to it in the configuration structure.
This fixes many section mismatches reported by modpost.
Quoted 7 lines
Quoted 5 lines
Signed-off-by Uwe Kleine-König <[email protected]>Cc Michał Nazarewicz <[email protected]>Cc Greg Kroah-Hartman <[email protected]>---
changes since v1:I'm confused, can you resend what you want me to apply please?
Will do.
Quoted 1 line
Do I need to drop Michał's patch before applying yours?
I double checked that now, and there is one thing in Michał's patch that is not fixed in mine. It's the hunk for drivers/usb/gadget/zero.c, as I didn't touch struct usb_composite_driver yet. So expect three patches in reply to this mail.
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ |
Re: [PATCH 2/2 v2] usb gadget: don't save bind callback in struct usb_configuration
In reply to Greg KHQuoted 12 lines · Greg KH
Quoted 10 lines · Uwe Kleine-König
The bind function is most of the time only called at init time so there is no need to save a pointer to it in the configuration structure.
This fixes many section mismatches reported by modpost.
Signed-off-by Uwe Kleine-König <[email protected]>Cc Michał Nazarewicz <[email protected]>Cc Greg Kroah-Hartman <[email protected]>---
changes since v1:
Quoted 3 lines
I'm confused, can you resend what you want me to apply please?
Do I need to drop Michał's patch before applying yours?
Yep. Uwe's patches seem to be a better solution for fixing the section mismatch. They remove the need of __ref* tags. I looked through them and they seem fine to me.
(Also, as I realised a minute ago, my patch is incorrect.)
Signature · 4 lines
Best regards, _ _ | Humble Liege of Serenely Enlightened Majesty of o' \,=./ `o | Computer Science, Michał "mina86" Nazarewicz (o o) +----[mina86*mina86.com]---[mina86*jabber.org]----ooO--(_)--Ooo--