[PATCH] usb gadget: don't save bind callback in struct usb_gadget_driver

2010-08-02 Thread Uwe Kleine-König
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

2010-08-02 Thread Julia Lawall
 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

2010-08-02 Thread Uwe Kleine-König
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

2010-08-02 Thread Greg KH
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