Skip to content

Commit

Permalink
usb gadget: don't save bind callback in struct usb_configuration
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Uwe Kleine-König authored and gregkh committed Oct 22, 2010
1 parent 07a18bd commit c9bfff9
Show file tree
Hide file tree
Showing 14 changed files with 33 additions and 43 deletions.
3 changes: 1 addition & 2 deletions drivers/usb/gadget/audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;

Expand Down
3 changes: 1 addition & 2 deletions drivers/usb/gadget/cdc2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;

Expand Down
14 changes: 8 additions & 6 deletions drivers/usb/gadget/composite.c
Original file line number Diff line number Diff line change
Expand Up @@ -474,18 +474,20 @@ static int set_config(struct usb_composite_dev *cdev,
* 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;
Expand All @@ -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 */
Expand All @@ -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;
Expand All @@ -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);
Expand Down
7 changes: 3 additions & 4 deletions drivers/usb/gadget/ether.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;

Expand Down
3 changes: 1 addition & 2 deletions drivers/usb/gadget/f_loopback.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
}
3 changes: 1 addition & 2 deletions drivers/usb/gadget/f_sourcesink.c
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,6 @@ static int sourcesink_setup(struct usb_configuration *c,
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,
Expand Down Expand Up @@ -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);
}
3 changes: 1 addition & 2 deletions drivers/usb/gadget/g_ffs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
3 changes: 1 addition & 2 deletions drivers/usb/gadget/hid.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;

Expand Down
3 changes: 1 addition & 2 deletions drivers/usb/gadget/mass_storage.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand All @@ -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;

Expand Down
10 changes: 4 additions & 6 deletions drivers/usb/gadget/multi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -191,15 +191,14 @@ 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,
};

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
Expand All @@ -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;

Expand All @@ -243,15 +242,14 @@ 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,
};

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
Expand Down
8 changes: 4 additions & 4 deletions drivers/usb/gadget/nokia.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions drivers/usb/gadget/serial.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions drivers/usb/gadget/webcam.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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");
Expand Down
8 changes: 3 additions & 5 deletions include/linux/usb/composite.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 *);
Expand All @@ -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
Expand Down

0 comments on commit c9bfff9

Please sign in to comment.