usb gadget: don't save bind callback in struct usb_configuration
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Thu, 12 Aug 2010 15:43:55 +0000 (17:43 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 22 Oct 2010 17:21:26 +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 configuration structure.

This fixes many section mismatches reported by modpost.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
[m.nazarewicz@samsung.com: updated for -next]
Signed-off-by: Michał Nazarewicz <m.nazarewicz@samsung.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
14 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/f_loopback.c
drivers/usb/gadget/f_sourcesink.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
include/linux/usb/composite.h

index 5a65fbb..93b999e 100644 (file)
@@ -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;
 
index 1f2a9b1..2720ab0 100644 (file)
@@ -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;
 
index c531a7e..5e2bd74 100644 (file)
@@ -474,18 +474,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;
@@ -494,7 +496,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 */
@@ -511,7 +513,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;
@@ -537,7 +539,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);
index 33076bc..1690c9d 100644 (file)
@@ -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, &eth_config_driver);
+       status = usb_add_config(cdev, &eth_config_driver, eth_do_config);
        if (status < 0)
                goto fail;
 
index e91d1b1..b37960f 100644 (file)
@@ -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);
 }
index 6d3cc44..e403a53 100644 (file)
@@ -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);
 }
index 9fcb158..af75e36 100644 (file)
@@ -234,11 +234,10 @@ static int gfs_bind(struct usb_composite_dev *cdev)
 
                c->c.label                      = gfs_strings[i].s;
                c->c.iConfiguration             = gfs_strings[i].id;
-               c->c.bind                       = gfs_do_config;
                c->c.bConfigurationValue        = 1 + i;
                c->c.bmAttributes               = USB_CONFIG_ATT_SELFPOWER;
 
-               ret = usb_add_config(cdev, &c->c);
+               ret = usb_add_config(cdev, &c->c, gfs_do_config);
                if (unlikely(ret < 0))
                        goto error_unbind;
        }
index 77f4952..2523e54 100644 (file)
@@ -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;
 
index a5e4a77..0769179 100644 (file)
@@ -141,7 +141,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,
        .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
 };
@@ -153,7 +152,7 @@ static int __init msg_bind(struct usb_composite_dev *cdev)
 {
        int status;
 
-       status = usb_add_config(cdev, &msg_config_driver);
+       status = usb_add_config(cdev, &msg_config_driver, msg_do_config);
        if (status < 0)
                return status;
 
index 91170a0..d9feced 100644 (file)
@@ -164,7 +164,7 @@ static u8 hostaddr[ETH_ALEN];
 
 #ifdef USB_ETH_RNDIS
 
-static __ref int rndis_do_config(struct usb_configuration *c)
+static __init int rndis_do_config(struct usb_configuration *c)
 {
        int ret;
 
@@ -191,7 +191,6 @@ static __ref int rndis_do_config(struct usb_configuration *c)
 static int rndis_config_register(struct usb_composite_dev *cdev)
 {
        static struct usb_configuration config = {
-               .bind                   = rndis_do_config,
                .bConfigurationValue    = MULTI_RNDIS_CONFIG_NUM,
                .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
        };
@@ -199,7 +198,7 @@ static int rndis_config_register(struct usb_composite_dev *cdev)
        config.label          = strings_dev[MULTI_STRING_RNDIS_CONFIG_IDX].s;
        config.iConfiguration = strings_dev[MULTI_STRING_RNDIS_CONFIG_IDX].id;
 
-       return usb_add_config(cdev, &config);
+       return usb_add_config(cdev, &config, rndis_do_config);
 }
 
 #else
@@ -216,7 +215,7 @@ static int rndis_config_register(struct usb_composite_dev *cdev)
 
 #ifdef CONFIG_USB_G_MULTI_CDC
 
-static __ref int cdc_do_config(struct usb_configuration *c)
+static __init int cdc_do_config(struct usb_configuration *c)
 {
        int ret;
 
@@ -243,7 +242,6 @@ static __ref int cdc_do_config(struct usb_configuration *c)
 static int cdc_config_register(struct usb_composite_dev *cdev)
 {
        static struct usb_configuration config = {
-               .bind                   = cdc_do_config,
                .bConfigurationValue    = MULTI_CDC_CONFIG_NUM,
                .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
        };
@@ -251,7 +249,7 @@ static int cdc_config_register(struct usb_composite_dev *cdev)
        config.label          = strings_dev[MULTI_STRING_CDC_CONFIG_IDX].s;
        config.iConfiguration = strings_dev[MULTI_STRING_CDC_CONFIG_IDX].id;
 
-       return usb_add_config(cdev, &config);
+       return usb_add_config(cdev, &config, cdc_do_config);
 }
 
 #else
index 8aec728..b5364f9 100644 (file)
@@ -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;
 
index 0b81d7b..1ac57a9 100644 (file)
@@ -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;
 
index de65b80..a5a0fdb 100644 (file)
@@ -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");
index e28b662..3d29a7d 100644 (file)
@@ -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 *);
@@ -232,7 +229,8 @@ struct usb_configuration {
 };
 
 int usb_add_config(struct usb_composite_dev *,
-               struct usb_configuration *);
+               struct usb_configuration *,
+               int (*)(struct usb_configuration *));
 
 /**
  * struct usb_composite_driver - groups configurations into a gadget