usb gadget: don't save bind callback in struct usb_composite_driver
authorMichal Nazarewicz <m.nazarewicz@samsung.com>
Thu, 12 Aug 2010 15:43:54 +0000 (17:43 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 22 Oct 2010 17:21:25 +0000 (10:21 -0700)
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 composite driver structure.

This fixes many section mismatches reported by modpost.

Signed-off-by: Michał Nazarewicz <m.nazarewicz@samsung.com>
Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
13 files changed:
drivers/usb/gadget/audio.c
drivers/usb/gadget/cdc2.c
drivers/usb/gadget/composite.c
drivers/usb/gadget/ether.c
drivers/usb/gadget/g_ffs.c
drivers/usb/gadget/hid.c
drivers/usb/gadget/mass_storage.c
drivers/usb/gadget/multi.c
drivers/usb/gadget/nokia.c
drivers/usb/gadget/serial.c
drivers/usb/gadget/webcam.c
drivers/usb/gadget/zero.c
include/linux/usb/composite.h

index a62af7b59094a19236701b9dac1d2609a874bc5f..5a65fbb4e20bac5e469abcebac5b0ea0b4ca85df 100644 (file)
@@ -166,13 +166,12 @@ static struct usb_composite_driver audio_driver = {
        .name           = "g_audio",
        .dev            = &device_desc,
        .strings        = audio_strings,
-       .bind           = audio_bind,
        .unbind         = __exit_p(audio_unbind),
 };
 
 static int __init init(void)
 {
-       return usb_composite_register(&audio_driver);
+       return usb_composite_probe(&audio_driver, audio_bind);
 }
 module_init(init);
 
index 928137d3dbdc237e5b5ab6e84620324253e05259..1f2a9b1e4f2dbbbc0b445ca7907d89c18bb402aa 100644 (file)
@@ -245,7 +245,6 @@ static struct usb_composite_driver cdc_driver = {
        .name           = "g_cdc",
        .dev            = &device_desc,
        .strings        = dev_strings,
-       .bind           = cdc_bind,
        .unbind         = __exit_p(cdc_unbind),
 };
 
@@ -255,7 +254,7 @@ MODULE_LICENSE("GPL");
 
 static int __init init(void)
 {
-       return usb_composite_register(&cdc_driver);
+       return usb_composite_probe(&cdc_driver, cdc_bind);
 }
 module_init(init);
 
index a3009bf0122960e1d88479a4025e6fbba49f08fb..c531a7e05f1e592e982c48a27467ba3b5864ded7 100644 (file)
@@ -40,6 +40,7 @@
 #define USB_BUFSIZ     1024
 
 static struct usb_composite_driver *composite;
+static int (*composite_gadget_bind)(struct usb_composite_dev *cdev);
 
 /* Some systems will need runtime overrides for the  product identifers
  * published in the device descriptor, either numbers or strings or both.
@@ -1115,7 +1116,7 @@ static int composite_bind(struct usb_gadget *gadget)
         * serial number), register function drivers, potentially update
         * power state and consumption, etc
         */
-       status = composite->bind(cdev);
+       status = composite_gadget_bind(cdev);
        if (status < 0)
                goto fail;
 
@@ -1227,8 +1228,12 @@ static struct usb_gadget_driver composite_driver = {
 };
 
 /**
- * usb_composite_register() - register a composite driver
+ * usb_composite_probe() - register a composite driver
  * @driver: the driver to register
+ * @bind: the callback used to allocate resources that are shared across the
+ *     whole device, such as string IDs, and add its configurations using
+ *     @usb_add_config().  This may fail by returning a negative errno
+ *     value; it should return zero on successful initialization.
  * Context: single threaded during gadget setup
  *
  * This function is used to register drivers using the composite driver
@@ -1241,9 +1246,10 @@ static struct usb_gadget_driver composite_driver = {
  * while it was binding.  That would usually be done in order to wait for
  * some userspace participation.
  */
-int usb_composite_register(struct usb_composite_driver *driver)
+extern int usb_composite_probe(struct usb_composite_driver *driver,
+                              int (*bind)(struct usb_composite_dev *cdev))
 {
-       if (!driver || !driver->dev || !driver->bind || composite)
+       if (!driver || !driver->dev || !bind || composite)
                return -EINVAL;
 
        if (!driver->iProduct)
@@ -1253,6 +1259,7 @@ int usb_composite_register(struct usb_composite_driver *driver)
        composite_driver.function =  (char *) driver->name;
        composite_driver.driver.name = driver->name;
        composite = driver;
+       composite_gadget_bind = bind;
 
        return usb_gadget_probe_driver(&composite_driver, composite_bind);
 }
index 400f80372d938e1af5130bb7ea594f8b8cf3b844..33076bca99360c5926eadb23a1a73e45626040fa 100644 (file)
@@ -402,7 +402,6 @@ static struct usb_composite_driver eth_driver = {
        .name           = "g_ether",
        .dev            = &device_desc,
        .strings        = dev_strings,
-       .bind           = eth_bind,
        .unbind         = __exit_p(eth_unbind),
 };
 
@@ -412,7 +411,7 @@ MODULE_LICENSE("GPL");
 
 static int __init init(void)
 {
-       return usb_composite_register(&eth_driver);
+       return usb_composite_probe(&eth_driver, eth_bind);
 }
 module_init(init);
 
index 52fd3fa0d130855e24ed2724c6a675fb2394b9a2..9fcb158795068a438806165dc7882bada83b460d 100644 (file)
@@ -147,7 +147,6 @@ static struct usb_composite_driver gfs_driver = {
        .name           = DRIVER_NAME,
        .dev            = &gfs_dev_desc,
        .strings        = gfs_dev_strings,
-       .bind           = gfs_bind,
        .unbind         = gfs_unbind,
        .iProduct       = DRIVER_DESC,
 };
@@ -187,7 +186,7 @@ static int functionfs_ready_callback(struct ffs_data *ffs)
                return -EBUSY;
 
        gfs_ffs_data = ffs;
-       ret = usb_composite_register(&gfs_driver);
+       ret = usb_composite_probe(&gfs_driver, gfs_bind);
        if (unlikely(ret < 0))
                clear_bit(0, &gfs_registered);
        return ret;
index 775722686ed85143cd89d159cc4e61385b64417f..77f495212fb930d731f8f1decdeae50331687e0d 100644 (file)
@@ -256,7 +256,6 @@ static struct usb_composite_driver hidg_driver = {
        .name           = "g_hid",
        .dev            = &device_desc,
        .strings        = dev_strings,
-       .bind           = hid_bind,
        .unbind         = __exit_p(hid_unbind),
 };
 
@@ -282,7 +281,7 @@ static int __init hidg_init(void)
        if (status < 0)
                return status;
 
-       status = usb_composite_register(&hidg_driver);
+       status = usb_composite_probe(&hidg_driver, hid_bind);
        if (status < 0)
                platform_driver_unregister(&hidg_plat_driver);
 
index 05e9bd3303481f2be10b8e31ad2598affac603c5..a5e4a777d9229972fbd18a102db44902f9a4b4c1 100644 (file)
@@ -169,7 +169,6 @@ static int __init msg_bind(struct usb_composite_dev *cdev)
 static struct usb_composite_driver msg_driver = {
        .name           = "g_mass_storage",
        .dev            = &msg_device_desc,
-       .bind           = msg_bind,
        .iProduct       = DRIVER_DESC,
        .needs_serial   = 1,
 };
@@ -180,7 +179,7 @@ MODULE_LICENSE("GPL");
 
 static int __init msg_init(void)
 {
-       return usb_composite_register(&msg_driver);
+       return usb_composite_probe(&msg_driver, msg_bind);
 }
 module_init(msg_init);
 
index ca51661d71db27b839f2b1105e6286bdd6901023..91170a02a9a3044f6f2e8563941ee87799da8b2a 100644 (file)
@@ -353,7 +353,6 @@ static struct usb_composite_driver multi_driver = {
        .name           = "g_multi",
        .dev            = &device_desc,
        .strings        = dev_strings,
-       .bind           = multi_bind,
        .unbind         = __exit_p(multi_unbind),
        .iProduct       = DRIVER_DESC,
        .needs_serial   = 1,
@@ -362,7 +361,7 @@ static struct usb_composite_driver multi_driver = {
 
 static int __init multi_init(void)
 {
-       return usb_composite_register(&multi_driver);
+       return usb_composite_probe(&multi_driver, multi_bind);
 }
 module_init(multi_init);
 
index 7d6b66a85724f3c16d357e4bb1c6675c76e77594..8aec728882a04eda03bae663191055f1ea87afc1 100644 (file)
@@ -241,13 +241,12 @@ static struct usb_composite_driver nokia_driver = {
        .name           = "g_nokia",
        .dev            = &device_desc,
        .strings        = dev_strings,
-       .bind           = nokia_bind,
        .unbind         = __exit_p(nokia_unbind),
 };
 
 static int __init nokia_init(void)
 {
-       return usb_composite_register(&nokia_driver);
+       return usb_composite_probe(&nokia_driver, nokia_bind);
 }
 module_init(nokia_init);
 
index f46a60962dab72bd03fa83b9a79325369040c8bc..0b81d7b741d14095387c2af9f239eaf1d890d5ae 100644 (file)
@@ -242,7 +242,6 @@ static struct usb_composite_driver gserial_driver = {
        .name           = "g_serial",
        .dev            = &device_desc,
        .strings        = dev_strings,
-       .bind           = gs_bind,
 };
 
 static int __init init(void)
@@ -271,7 +270,7 @@ static int __init init(void)
        }
        strings_dev[STRING_DESCRIPTION_IDX].s = serial_config_driver.label;
 
-       return usb_composite_register(&gserial_driver);
+       return usb_composite_probe(&gserial_driver, gs_bind);
 }
 module_init(init);
 
index 288d21155abe77e655d30fd31314ea4d22d3a12b..de65b8078e05c74f447821f4280b5871b58320fd 100644 (file)
@@ -373,14 +373,13 @@ static struct usb_composite_driver webcam_driver = {
        .name           = "g_webcam",
        .dev            = &webcam_device_descriptor,
        .strings        = webcam_device_strings,
-       .bind           = webcam_bind,
        .unbind         = webcam_unbind,
 };
 
 static int __init
 webcam_init(void)
 {
-       return usb_composite_register(&webcam_driver);
+       return usb_composite_probe(&webcam_driver, webcam_bind);
 }
 
 static void __exit
index 807280d069f96e815ea11c1eddddb29cbe6692fd..6d16db9d9d2dd078a589adacabb04696dd938db4 100644 (file)
@@ -340,7 +340,6 @@ static struct usb_composite_driver zero_driver = {
        .name           = "zero",
        .dev            = &device_desc,
        .strings        = dev_strings,
-       .bind           = zero_bind,
        .unbind         = zero_unbind,
        .suspend        = zero_suspend,
        .resume         = zero_resume,
@@ -351,7 +350,7 @@ MODULE_LICENSE("GPL");
 
 static int __init init(void)
 {
-       return usb_composite_register(&zero_driver);
+       return usb_composite_probe(&zero_driver, zero_bind);
 }
 module_init(init);
 
index a78e813d27e424e0feff9ef8d0156692200f02de..e28b6626802c30d28dfb452f0d1bcf208f6ba092 100644 (file)
@@ -248,11 +248,7 @@ int usb_add_config(struct usb_composite_dev *,
  *     and language IDs provided in control requests
  * @needs_serial: set to 1 if the gadget needs userspace to provide
  *     a serial number.  If one is not provided, warning will be printed.
- * @bind: (REQUIRED) Used to allocate resources that are shared across the
- *     whole device, such as string IDs, and add its configurations using
- *     @usb_add_config().  This may fail by returning a negative errno
- *     value; it should return zero on successful initialization.
- * @unbind: Reverses @bind(); called as a side effect of unregistering
+ * @unbind: Reverses bind; called as a side effect of unregistering
  *     this driver.
  * @disconnect: optional driver disconnect method
  * @suspend: Notifies when the host stops sending USB traffic,
@@ -263,7 +259,7 @@ int usb_add_config(struct usb_composite_dev *,
  * Devices default to reporting self powered operation.  Devices which rely
  * on bus powered operation should report this in their @bind() method.
  *
- * Before returning from @bind, various fields in the template descriptor
+ * Before returning from bind, various fields in the template descriptor
  * may be overridden.  These include the idVendor/idProduct/bcdDevice values
  * normally to bind the appropriate host side driver, and the three strings
  * (iManufacturer, iProduct, iSerialNumber) normally used to provide user
@@ -279,12 +275,6 @@ struct usb_composite_driver {
        struct usb_gadget_strings               **strings;
        unsigned                needs_serial:1;
 
-       /* REVISIT:  bind() functions can be marked __init, which
-        * makes trouble for section mismatch analysis.  See if
-        * we can't restructure things to avoid mismatching...
-        */
-
-       int                     (*bind)(struct usb_composite_dev *);
        int                     (*unbind)(struct usb_composite_dev *);
 
        void                    (*disconnect)(struct usb_composite_dev *);
@@ -294,8 +284,9 @@ struct usb_composite_driver {
        void                    (*resume)(struct usb_composite_dev *);
 };
 
-extern int usb_composite_register(struct usb_composite_driver *);
-extern void usb_composite_unregister(struct usb_composite_driver *);
+extern int usb_composite_probe(struct usb_composite_driver *driver,
+                              int (*bind)(struct usb_composite_dev *cdev));
+extern void usb_composite_unregister(struct usb_composite_driver *driver);
 
 
 /**