Commit 07a18bd7 authored by Michal Nazarewicz's avatar Michal Nazarewicz Committed by Greg Kroah-Hartman

usb gadget: don't save bind callback in struct usb_composite_driver

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: default avatarMichał Nazarewicz <m.nazarewicz@samsung.com>
Acked-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent b0fca50f
...@@ -166,13 +166,12 @@ static struct usb_composite_driver audio_driver = { ...@@ -166,13 +166,12 @@ static struct usb_composite_driver audio_driver = {
.name = "g_audio", .name = "g_audio",
.dev = &device_desc, .dev = &device_desc,
.strings = audio_strings, .strings = audio_strings,
.bind = audio_bind,
.unbind = __exit_p(audio_unbind), .unbind = __exit_p(audio_unbind),
}; };
static int __init init(void) static int __init init(void)
{ {
return usb_composite_register(&audio_driver); return usb_composite_probe(&audio_driver, audio_bind);
} }
module_init(init); module_init(init);
......
...@@ -245,7 +245,6 @@ static struct usb_composite_driver cdc_driver = { ...@@ -245,7 +245,6 @@ static struct usb_composite_driver cdc_driver = {
.name = "g_cdc", .name = "g_cdc",
.dev = &device_desc, .dev = &device_desc,
.strings = dev_strings, .strings = dev_strings,
.bind = cdc_bind,
.unbind = __exit_p(cdc_unbind), .unbind = __exit_p(cdc_unbind),
}; };
...@@ -255,7 +254,7 @@ MODULE_LICENSE("GPL"); ...@@ -255,7 +254,7 @@ MODULE_LICENSE("GPL");
static int __init init(void) static int __init init(void)
{ {
return usb_composite_register(&cdc_driver); return usb_composite_probe(&cdc_driver, cdc_bind);
} }
module_init(init); module_init(init);
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#define USB_BUFSIZ 1024 #define USB_BUFSIZ 1024
static struct usb_composite_driver *composite; 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 /* Some systems will need runtime overrides for the product identifers
* published in the device descriptor, either numbers or strings or both. * published in the device descriptor, either numbers or strings or both.
...@@ -1115,7 +1116,7 @@ static int composite_bind(struct usb_gadget *gadget) ...@@ -1115,7 +1116,7 @@ static int composite_bind(struct usb_gadget *gadget)
* serial number), register function drivers, potentially update * serial number), register function drivers, potentially update
* power state and consumption, etc * power state and consumption, etc
*/ */
status = composite->bind(cdev); status = composite_gadget_bind(cdev);
if (status < 0) if (status < 0)
goto fail; goto fail;
...@@ -1227,8 +1228,12 @@ static struct usb_gadget_driver composite_driver = { ...@@ -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 * @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 * Context: single threaded during gadget setup
* *
* This function is used to register drivers using the composite driver * This function is used to register drivers using the composite driver
...@@ -1241,9 +1246,10 @@ static struct usb_gadget_driver 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 * while it was binding. That would usually be done in order to wait for
* some userspace participation. * 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; return -EINVAL;
if (!driver->iProduct) if (!driver->iProduct)
...@@ -1253,6 +1259,7 @@ int usb_composite_register(struct usb_composite_driver *driver) ...@@ -1253,6 +1259,7 @@ int usb_composite_register(struct usb_composite_driver *driver)
composite_driver.function = (char *) driver->name; composite_driver.function = (char *) driver->name;
composite_driver.driver.name = driver->name; composite_driver.driver.name = driver->name;
composite = driver; composite = driver;
composite_gadget_bind = bind;
return usb_gadget_probe_driver(&composite_driver, composite_bind); return usb_gadget_probe_driver(&composite_driver, composite_bind);
} }
......
...@@ -402,7 +402,6 @@ static struct usb_composite_driver eth_driver = { ...@@ -402,7 +402,6 @@ static struct usb_composite_driver eth_driver = {
.name = "g_ether", .name = "g_ether",
.dev = &device_desc, .dev = &device_desc,
.strings = dev_strings, .strings = dev_strings,
.bind = eth_bind,
.unbind = __exit_p(eth_unbind), .unbind = __exit_p(eth_unbind),
}; };
...@@ -412,7 +411,7 @@ MODULE_LICENSE("GPL"); ...@@ -412,7 +411,7 @@ MODULE_LICENSE("GPL");
static int __init init(void) static int __init init(void)
{ {
return usb_composite_register(&eth_driver); return usb_composite_probe(&eth_driver, eth_bind);
} }
module_init(init); module_init(init);
......
...@@ -147,7 +147,6 @@ static struct usb_composite_driver gfs_driver = { ...@@ -147,7 +147,6 @@ static struct usb_composite_driver gfs_driver = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.dev = &gfs_dev_desc, .dev = &gfs_dev_desc,
.strings = gfs_dev_strings, .strings = gfs_dev_strings,
.bind = gfs_bind,
.unbind = gfs_unbind, .unbind = gfs_unbind,
.iProduct = DRIVER_DESC, .iProduct = DRIVER_DESC,
}; };
...@@ -187,7 +186,7 @@ static int functionfs_ready_callback(struct ffs_data *ffs) ...@@ -187,7 +186,7 @@ static int functionfs_ready_callback(struct ffs_data *ffs)
return -EBUSY; return -EBUSY;
gfs_ffs_data = ffs; gfs_ffs_data = ffs;
ret = usb_composite_register(&gfs_driver); ret = usb_composite_probe(&gfs_driver, gfs_bind);
if (unlikely(ret < 0)) if (unlikely(ret < 0))
clear_bit(0, &gfs_registered); clear_bit(0, &gfs_registered);
return ret; return ret;
......
...@@ -256,7 +256,6 @@ static struct usb_composite_driver hidg_driver = { ...@@ -256,7 +256,6 @@ static struct usb_composite_driver hidg_driver = {
.name = "g_hid", .name = "g_hid",
.dev = &device_desc, .dev = &device_desc,
.strings = dev_strings, .strings = dev_strings,
.bind = hid_bind,
.unbind = __exit_p(hid_unbind), .unbind = __exit_p(hid_unbind),
}; };
...@@ -282,7 +281,7 @@ static int __init hidg_init(void) ...@@ -282,7 +281,7 @@ static int __init hidg_init(void)
if (status < 0) if (status < 0)
return status; return status;
status = usb_composite_register(&hidg_driver); status = usb_composite_probe(&hidg_driver, hid_bind);
if (status < 0) if (status < 0)
platform_driver_unregister(&hidg_plat_driver); platform_driver_unregister(&hidg_plat_driver);
......
...@@ -169,7 +169,6 @@ static int __init msg_bind(struct usb_composite_dev *cdev) ...@@ -169,7 +169,6 @@ static int __init msg_bind(struct usb_composite_dev *cdev)
static struct usb_composite_driver msg_driver = { static struct usb_composite_driver msg_driver = {
.name = "g_mass_storage", .name = "g_mass_storage",
.dev = &msg_device_desc, .dev = &msg_device_desc,
.bind = msg_bind,
.iProduct = DRIVER_DESC, .iProduct = DRIVER_DESC,
.needs_serial = 1, .needs_serial = 1,
}; };
...@@ -180,7 +179,7 @@ MODULE_LICENSE("GPL"); ...@@ -180,7 +179,7 @@ MODULE_LICENSE("GPL");
static int __init msg_init(void) static int __init msg_init(void)
{ {
return usb_composite_register(&msg_driver); return usb_composite_probe(&msg_driver, msg_bind);
} }
module_init(msg_init); module_init(msg_init);
......
...@@ -353,7 +353,6 @@ static struct usb_composite_driver multi_driver = { ...@@ -353,7 +353,6 @@ static struct usb_composite_driver multi_driver = {
.name = "g_multi", .name = "g_multi",
.dev = &device_desc, .dev = &device_desc,
.strings = dev_strings, .strings = dev_strings,
.bind = multi_bind,
.unbind = __exit_p(multi_unbind), .unbind = __exit_p(multi_unbind),
.iProduct = DRIVER_DESC, .iProduct = DRIVER_DESC,
.needs_serial = 1, .needs_serial = 1,
...@@ -362,7 +361,7 @@ static struct usb_composite_driver multi_driver = { ...@@ -362,7 +361,7 @@ static struct usb_composite_driver multi_driver = {
static int __init multi_init(void) static int __init multi_init(void)
{ {
return usb_composite_register(&multi_driver); return usb_composite_probe(&multi_driver, multi_bind);
} }
module_init(multi_init); module_init(multi_init);
......
...@@ -241,13 +241,12 @@ static struct usb_composite_driver nokia_driver = { ...@@ -241,13 +241,12 @@ static struct usb_composite_driver nokia_driver = {
.name = "g_nokia", .name = "g_nokia",
.dev = &device_desc, .dev = &device_desc,
.strings = dev_strings, .strings = dev_strings,
.bind = nokia_bind,
.unbind = __exit_p(nokia_unbind), .unbind = __exit_p(nokia_unbind),
}; };
static int __init nokia_init(void) static int __init nokia_init(void)
{ {
return usb_composite_register(&nokia_driver); return usb_composite_probe(&nokia_driver, nokia_bind);
} }
module_init(nokia_init); module_init(nokia_init);
......
...@@ -242,7 +242,6 @@ static struct usb_composite_driver gserial_driver = { ...@@ -242,7 +242,6 @@ static struct usb_composite_driver gserial_driver = {
.name = "g_serial", .name = "g_serial",
.dev = &device_desc, .dev = &device_desc,
.strings = dev_strings, .strings = dev_strings,
.bind = gs_bind,
}; };
static int __init init(void) static int __init init(void)
...@@ -271,7 +270,7 @@ static int __init init(void) ...@@ -271,7 +270,7 @@ static int __init init(void)
} }
strings_dev[STRING_DESCRIPTION_IDX].s = serial_config_driver.label; 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); module_init(init);
......
...@@ -373,14 +373,13 @@ static struct usb_composite_driver webcam_driver = { ...@@ -373,14 +373,13 @@ static struct usb_composite_driver webcam_driver = {
.name = "g_webcam", .name = "g_webcam",
.dev = &webcam_device_descriptor, .dev = &webcam_device_descriptor,
.strings = webcam_device_strings, .strings = webcam_device_strings,
.bind = webcam_bind,
.unbind = webcam_unbind, .unbind = webcam_unbind,
}; };
static int __init static int __init
webcam_init(void) webcam_init(void)
{ {
return usb_composite_register(&webcam_driver); return usb_composite_probe(&webcam_driver, webcam_bind);
} }
static void __exit static void __exit
......
...@@ -340,7 +340,6 @@ static struct usb_composite_driver zero_driver = { ...@@ -340,7 +340,6 @@ static struct usb_composite_driver zero_driver = {
.name = "zero", .name = "zero",
.dev = &device_desc, .dev = &device_desc,
.strings = dev_strings, .strings = dev_strings,
.bind = zero_bind,
.unbind = zero_unbind, .unbind = zero_unbind,
.suspend = zero_suspend, .suspend = zero_suspend,
.resume = zero_resume, .resume = zero_resume,
...@@ -351,7 +350,7 @@ MODULE_LICENSE("GPL"); ...@@ -351,7 +350,7 @@ MODULE_LICENSE("GPL");
static int __init init(void) static int __init init(void)
{ {
return usb_composite_register(&zero_driver); return usb_composite_probe(&zero_driver, zero_bind);
} }
module_init(init); module_init(init);
......
...@@ -248,11 +248,7 @@ int usb_add_config(struct usb_composite_dev *, ...@@ -248,11 +248,7 @@ int usb_add_config(struct usb_composite_dev *,
* and language IDs provided in control requests * and language IDs provided in control requests
* @needs_serial: set to 1 if the gadget needs userspace to provide * @needs_serial: set to 1 if the gadget needs userspace to provide
* a serial number. If one is not provided, warning will be printed. * a serial number. If one is not provided, warning will be printed.
* @bind: (REQUIRED) Used to allocate resources that are shared across the * @unbind: Reverses bind; called as a side effect of unregistering
* 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
* this driver. * this driver.
* @disconnect: optional driver disconnect method * @disconnect: optional driver disconnect method
* @suspend: Notifies when the host stops sending USB traffic, * @suspend: Notifies when the host stops sending USB traffic,
...@@ -263,7 +259,7 @@ int usb_add_config(struct usb_composite_dev *, ...@@ -263,7 +259,7 @@ int usb_add_config(struct usb_composite_dev *,
* Devices default to reporting self powered operation. Devices which rely * Devices default to reporting self powered operation. Devices which rely
* on bus powered operation should report this in their @bind() method. * 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 * may be overridden. These include the idVendor/idProduct/bcdDevice values
* normally to bind the appropriate host side driver, and the three strings * normally to bind the appropriate host side driver, and the three strings
* (iManufacturer, iProduct, iSerialNumber) normally used to provide user * (iManufacturer, iProduct, iSerialNumber) normally used to provide user
...@@ -279,12 +275,6 @@ struct usb_composite_driver { ...@@ -279,12 +275,6 @@ struct usb_composite_driver {
struct usb_gadget_strings **strings; struct usb_gadget_strings **strings;
unsigned needs_serial:1; 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 *); int (*unbind)(struct usb_composite_dev *);
void (*disconnect)(struct usb_composite_dev *); void (*disconnect)(struct usb_composite_dev *);
...@@ -294,8 +284,9 @@ struct usb_composite_driver { ...@@ -294,8 +284,9 @@ struct usb_composite_driver {
void (*resume)(struct usb_composite_dev *); void (*resume)(struct usb_composite_dev *);
}; };
extern int usb_composite_register(struct usb_composite_driver *); extern int usb_composite_probe(struct usb_composite_driver *driver,
extern void usb_composite_unregister(struct usb_composite_driver *); int (*bind)(struct usb_composite_dev *cdev));
extern void usb_composite_unregister(struct usb_composite_driver *driver);
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment