[PATCH] 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. Signed-off-by: Uwe Kleine-König u.kleine-koe...@pengutronix.de Cc: Michał Nazarewicz m.nazarew...@samsung.com Cc: David Brownell davi...@pacbell.net Cc: Julia Lawall ju...@diku.dk Cc: Greg Kroah-Hartman gre...@suse.de --- 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(-) diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 731150d..c266c1e 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c @@ -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 diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index eaa79c8..a3d04ba 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c @@ -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
Re: [PATCH] usb gadget: don't save bind callback in struct usb_gadget_driver
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 731150d..c266c1e 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c @@ -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 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 diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 08a9a62..c16b402 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c @@ -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; Here !driver-bind is converted to !bind. julia ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH] usb gadget: don't save bind callback in struct usb_gadget_driver
On Mon, Aug 02, 2010 at 02:51:36PM +0200, Julia Lawall wrote: diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 731150d..c266c1e 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c @@ -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 I 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. That would be like what is done in the patch for drivers/usb/gadget/fsl_udc_core.c below Thanks Uwe -- Pengutronix e.K. | Uwe Kleine-König| Industrial Linux Solutions | http://www.pengutronix.de/ | ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH] usb gadget: don't save bind callback in struct usb_gadget_driver
On Mon, Aug 02, 2010 at 03:12:48PM +0200, Uwe Kleine-König wrote: On Mon, Aug 02, 2010 at 02:51:36PM +0200, Julia Lawall wrote: diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 731150d..c266c1e 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c @@ -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 I 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 ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev