Greg was fine getting rid of the include hell and use modules or some other tricks to avoid redundancy. This patch collects the files composite.c usbstring.c config.c epautoconf.c and creates the usb-composite.ko instead of including the files directly. I don't know yet what to do about [uf]_* so I will worry about them later. Here are some stats (x86_64, gcc-4.6): text data bss dec diff filename new | old new | old new | old new | old 7130 18018 590 710 56 152 7776 18880 -11104 audio.o 19792 30668 672 792 240 312 20704 31772 -11068 cdc2.o 7542 8690 124 124 144 148 7810 8962 -1152 dbgp.o 25479 36387 1040 1164 156 248 26675 37799 -11124 ether.o 25181 27192 534 534 112 116 25827 27842 -2015 file_storage.o 33646 44636 1116 1240 92 216 34854 46092 -11238 g_ffs.o 7615 9633 392 392 112 116 8119 10141 -2022 gmidi.o 5035 15913 408 508 64 184 5507 16605 -11098 hid.o 11222 11222 244 244 16 16 11482 11482 0 inode.o 21722 32616 516 640 308 376 22546 33632 -11086 mass_storage.o 53064 64039 1512 1632 528 600 55104 66271 -11167 multi.o 13905 24759 639 759 92 184 14636 25702 -11066 ncm.o 25246 36186 1190 1310 144 248 26580 37744 -11164 nokia.o 10682 12686 1481 1481 306 312 12469 14479 -2010 printer.o 13508 24420 686 806 208 280 14402 25506 -11104 serial.o 9982 20935 405 525 4 88 10391 21548 -11157 webcam.o 6127 17045 588 716 112 184 6827 17945 -11118 zero.o 11315 100 92 11507 usb-composite.o So for all users we have: Total new: 311709 Total old: 452402 The diff is ~137KiB where the usb-composite module is only ~11KiB. For drivers using the composite it makes hardly a difference. With the second gadget driver we start saving space. For those that don't use the composite framework or use just a few functions, they use more size due to the module. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> --- drivers/usb/gadget/Kconfig | 4 ++++ drivers/usb/gadget/Makefile | 3 +++ drivers/usb/gadget/audio.c | 5 ----- drivers/usb/gadget/cdc2.c | 4 ---- drivers/usb/gadget/composite.c | 19 ++++++++++++++----- drivers/usb/gadget/config.c | 3 ++- drivers/usb/gadget/dbgp.c | 3 --- drivers/usb/gadget/epautoconf.c | 4 ++-- drivers/usb/gadget/ether.c | 4 ---- drivers/usb/gadget/f_hid.c | 1 + drivers/usb/gadget/file_storage.c | 15 --------------- drivers/usb/gadget/g_ffs.c | 5 ----- drivers/usb/gadget/gadget_chips.h | 1 + drivers/usb/gadget/gmidi.c | 15 --------------- drivers/usb/gadget/hid.c | 6 +----- drivers/usb/gadget/mass_storage.c | 4 ---- drivers/usb/gadget/multi.c | 5 ----- drivers/usb/gadget/ncm.c | 5 ----- drivers/usb/gadget/nokia.c | 5 ----- drivers/usb/gadget/printer.c | 13 ------------- drivers/usb/gadget/serial.c | 5 ----- drivers/usb/gadget/usbstring.c | 2 +- drivers/usb/gadget/webcam.c | 5 ----- drivers/usb/gadget/zero.c | 5 ----- include/linux/usb/composite.h | 2 ++ 25 files changed, 31 insertions(+), 112 deletions(-) diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index c5c0308..16244a4 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -43,6 +43,10 @@ menuconfig USB_GADGET if USB_GADGET +config USB_COMPOSITE + tristate + default USB_GADGET + config USB_GADGET_DEBUG boolean "Debugging messages (DEVELOPMENT)" depends on DEBUG_KERNEL diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index 9ba725a..7409338 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile @@ -32,6 +32,9 @@ mv_udc-y := mv_udc_core.o mv_udc_phy.o obj-$(CONFIG_USB_CI13XXX_MSM) += ci13xxx_msm.o obj-$(CONFIG_USB_FUSB300) += fusb300_udc.o +usb-composite-y := composite.o usbstring.o config.o epautoconf.o +obj-$(CONFIG_USB_COMPOSITE) += usb-composite.o + # # USB gadget drivers # diff --git a/drivers/usb/gadget/audio.c b/drivers/usb/gadget/audio.c index 9d89ae47..4631b3e 100644 --- a/drivers/usb/gadget/audio.c +++ b/drivers/usb/gadget/audio.c @@ -28,11 +28,6 @@ * the runtime footprint, and giving us at least some parts of what * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - #include "u_audio.c" #include "f_audio.c" diff --git a/drivers/usb/gadget/cdc2.c b/drivers/usb/gadget/cdc2.c index b1c1afb..c20eb21 100644 --- a/drivers/usb/gadget/cdc2.c +++ b/drivers/usb/gadget/cdc2.c @@ -51,10 +51,6 @@ * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" #include "u_serial.c" #include "f_acm.c" #include "f_ecm.c" diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index aef4741..070da9b 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -36,9 +36,6 @@ * with the relevant device-wide data. */ -/* big enough to hold our biggest descriptor */ -#define USB_BUFSIZ 1024 - static struct usb_composite_driver *composite; static int (*composite_gadget_bind)(struct usb_composite_dev *cdev); @@ -198,6 +195,7 @@ ep_found: } return 0; } +EXPORT_SYMBOL_GPL(config_ep_by_speed); /** * usb_add_function() - add a function to a configuration @@ -256,7 +254,7 @@ done: function->name, function, value); return value; } - +EXPORT_SYMBOL_GPL(usb_add_function); /** * usb_function_deactivate - prevent function and gadget enumeration * @function: the function that isn't yet ready to respond @@ -292,6 +290,7 @@ int usb_function_deactivate(struct usb_function *function) spin_unlock_irqrestore(&cdev->lock, flags); return status; } +EXPORT_SYMBOL_GPL(usb_function_deactivate); /** * usb_function_activate - allow function and gadget enumeration @@ -321,6 +320,7 @@ int usb_function_activate(struct usb_function *function) spin_unlock(&cdev->lock); return status; } +EXPORT_SYMBOL_GPL(usb_function_activate); /** * usb_interface_id() - allocate an unused interface ID @@ -357,6 +357,7 @@ int usb_interface_id(struct usb_configuration *config, } return -ENODEV; } +EXPORT_SYMBOL_GPL(usb_interface_id); static int config_buf(struct usb_configuration *config, enum usb_device_speed speed, void *buf, u8 type) @@ -798,6 +799,7 @@ done: config->bConfigurationValue, status); return status; } +EXPORT_SYMBOL_GPL(usb_add_config); /*-------------------------------------------------------------------------*/ @@ -964,6 +966,7 @@ int usb_string_id(struct usb_composite_dev *cdev) } return -ENODEV; } +EXPORT_SYMBOL_GPL(usb_string_id); /** * usb_string_ids() - allocate unused string IDs in batch @@ -995,6 +998,7 @@ int usb_string_ids_tab(struct usb_composite_dev *cdev, struct usb_string *str) return 0; } +EXPORT_SYMBOL_GPL(usb_string_ids_tab); /** * usb_string_ids_n() - allocate unused string IDs in batch @@ -1023,7 +1027,7 @@ int usb_string_ids_n(struct usb_composite_dev *c, unsigned n) c->next_string_id += n; return next + 1; } - +EXPORT_SYMBOL_GPL(usb_string_ids_n); /*-------------------------------------------------------------------------*/ @@ -1615,6 +1619,7 @@ int usb_composite_probe(struct usb_composite_driver *driver, return usb_gadget_probe_driver(&composite_driver, composite_bind); } +EXPORT_SYMBOL_GPL(usb_composite_probe); /** * usb_composite_unregister() - unregister a composite driver @@ -1629,6 +1634,7 @@ void usb_composite_unregister(struct usb_composite_driver *driver) return; usb_gadget_unregister_driver(&composite_driver); } +EXPORT_SYMBOL_GPL(usb_composite_unregister); /** * usb_composite_setup_continue() - Continue with the control transfer @@ -1665,4 +1671,7 @@ void usb_composite_setup_continue(struct usb_composite_dev *cdev) spin_unlock_irqrestore(&cdev->lock, flags); } +EXPORT_SYMBOL_GPL(usb_composite_setup_continue); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("David Brownell"); diff --git a/drivers/usb/gadget/config.c b/drivers/usb/gadget/config.c index b2c0013..5ce8fee 100644 --- a/drivers/usb/gadget/config.c +++ b/drivers/usb/gadget/config.c @@ -115,6 +115,7 @@ int usb_gadget_config_buf( cp->bmAttributes |= USB_CONFIG_ATT_ONE; return len; } +EXPORT_SYMBOL_GPL(usb_gadget_config_buf); /** * usb_copy_descriptors - copy a vector of USB descriptors @@ -164,4 +165,4 @@ usb_copy_descriptors(struct usb_descriptor_header **src) return ret; } - +EXPORT_SYMBOL_GPL(usb_copy_descriptors); diff --git a/drivers/usb/gadget/dbgp.c b/drivers/usb/gadget/dbgp.c index 8beefdd..0c0451a 100644 --- a/drivers/usb/gadget/dbgp.c +++ b/drivers/usb/gadget/dbgp.c @@ -13,9 +13,6 @@ #include <linux/usb/ch9.h> #include <linux/usb/gadget.h> -/* See comments in "zero.c" */ -#include "epautoconf.c" - #ifdef CONFIG_USB_G_DBGP_SERIAL #include "u_serial.c" #endif diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c index 7a7e6b7..e9e26de 100644 --- a/drivers/usb/gadget/epautoconf.c +++ b/drivers/usb/gadget/epautoconf.c @@ -376,7 +376,7 @@ struct usb_ep *usb_ep_autoconfig( { return usb_ep_autoconfig_ss(gadget, desc, NULL); } - +EXPORT_SYMBOL_GPL(usb_ep_autoconfig); /** * usb_ep_autoconfig_reset - reset endpoint autoconfig state @@ -399,4 +399,4 @@ void usb_ep_autoconfig_reset (struct usb_gadget *gadget) #endif epnum = 0; } - +EXPORT_SYMBOL_GPL(usb_ep_autoconfig_reset); diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index aafc84f..c025daf 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c @@ -111,10 +111,6 @@ static inline bool has_rndis(void) * the runtime footprint, and giving us at least some parts of what * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" #include "f_ecm.c" #include "f_subset.c" diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c index 83a266b..32cef14 100644 --- a/drivers/usb/gadget/f_hid.c +++ b/drivers/usb/gadget/f_hid.c @@ -28,6 +28,7 @@ #include <linux/uaccess.h> #include <linux/wait.h> #include <linux/usb/g_hid.h> +#include <linux/usb/composite.h> static int major, minors; static struct class *hidg_class; diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index 639e14a..93ff649 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c @@ -256,21 +256,6 @@ #include "gadget_chips.h" - - -/* - * Kbuild is not very cooperative with respect to linking separately - * compiled library objects into one module. So for now we won't use - * separate compilation ... ensuring init/exit sections work to shrink - * the runtime footprint, and giving us at least some parts of what - * a "gcc --combine ... part1.c part2.c part3.c ... " build would. - */ -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - -/*-------------------------------------------------------------------------*/ - #define DRIVER_DESC "File-backed Storage Gadget" #define DRIVER_NAME "g_file_storage" #define DRIVER_VERSION "1 September 2010" diff --git a/drivers/usb/gadget/g_ffs.c b/drivers/usb/gadget/g_ffs.c index 704c280..d8a8fe5 100644 --- a/drivers/usb/gadget/g_ffs.c +++ b/drivers/usb/gadget/g_ffs.c @@ -32,11 +32,6 @@ * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - #if defined CONFIG_USB_FUNCTIONFS_ETH || defined CONFIG_USB_FUNCTIONFS_RNDIS # if defined USB_ETH_RNDIS # undef USB_ETH_RNDIS diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h index a8855d0..4ff45fa 100644 --- a/drivers/usb/gadget/gadget_chips.h +++ b/drivers/usb/gadget/gadget_chips.h @@ -14,6 +14,7 @@ #ifndef __GADGET_CHIPS_H #define __GADGET_CHIPS_H +#include <linux/usb/gadget.h> /* * NOTICE: the entries below are alphabetical and should be kept diff --git a/drivers/usb/gadget/gmidi.c b/drivers/usb/gadget/gmidi.c index 8b9220e..ba50098 100644 --- a/drivers/usb/gadget/gmidi.c +++ b/drivers/usb/gadget/gmidi.c @@ -36,21 +36,6 @@ #include "gadget_chips.h" - -/* - * Kbuild is not very cooperative with respect to linking separately - * compiled library objects into one module. So for now we won't use - * separate compilation ... ensuring init/exit sections work to shrink - * the runtime footprint, and giving us at least some parts of what - * a "gcc --combine ... part1.c part2.c part3.c ... " build would. - */ -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - -/*-------------------------------------------------------------------------*/ - - MODULE_AUTHOR("Ben Williamson"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/usb/gadget/hid.c b/drivers/usb/gadget/hid.c index 9fb5750..927eb4e 100644 --- a/drivers/usb/gadget/hid.c +++ b/drivers/usb/gadget/hid.c @@ -24,6 +24,7 @@ #include <linux/kernel.h> #include <linux/platform_device.h> #include <linux/list.h> +#include "gadget_chips.h" #define DRIVER_DESC "HID Gadget" #define DRIVER_VERSION "2010/03/16" @@ -43,11 +44,6 @@ * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - #include "f_hid.c" diff --git a/drivers/usb/gadget/mass_storage.c b/drivers/usb/gadget/mass_storage.c index d3eb274..c997fab 100644 --- a/drivers/usb/gadget/mass_storage.c +++ b/drivers/usb/gadget/mass_storage.c @@ -57,10 +57,6 @@ * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" #include "f_mass_storage.c" /*-------------------------------------------------------------------------*/ diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c index 8c7b747..c547e2f 100644 --- a/drivers/usb/gadget/multi.c +++ b/drivers/usb/gadget/multi.c @@ -52,11 +52,6 @@ MODULE_LICENSE("GPL"); * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - #include "f_mass_storage.c" #include "u_serial.c" diff --git a/drivers/usb/gadget/ncm.c b/drivers/usb/gadget/ncm.c index 62ee508..16bd5ec 100644 --- a/drivers/usb/gadget/ncm.c +++ b/drivers/usb/gadget/ncm.c @@ -45,11 +45,6 @@ * the runtime footprint, and giving us at least some parts of what * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - #include "f_ncm.c" #include "u_ether.c" diff --git a/drivers/usb/gadget/nokia.c b/drivers/usb/gadget/nokia.c index c7fb772..68778b5 100644 --- a/drivers/usb/gadget/nokia.c +++ b/drivers/usb/gadget/nokia.c @@ -38,11 +38,6 @@ * the runtime footprint, and giving us at least some parts of what * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - #include "u_serial.c" #include "f_acm.c" #include "f_ecm.c" diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index a341dde..ecf2657 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c @@ -54,19 +54,6 @@ #include "gadget_chips.h" -/* - * Kbuild is not very cooperative with respect to linking separately - * compiled library objects into one module. So for now we won't use - * separate compilation ... ensuring init/exit sections work to shrink - * the runtime footprint, and giving us at least some parts of what - * a "gcc --combine ... part1.c part2.c part3.c ... " build would. - */ -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - -/*-------------------------------------------------------------------------*/ - #define DRIVER_DESC "Printer Gadget" #define DRIVER_VERSION "2007 OCT 06" diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index ed1b816..cda79b7 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c @@ -37,11 +37,6 @@ * the runtime footprint, and giving us at least some parts of what * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - #include "f_acm.c" #include "f_obex.c" #include "f_serial.c" diff --git a/drivers/usb/gadget/usbstring.c b/drivers/usb/gadget/usbstring.c index 58c4d37..c31e461 100644 --- a/drivers/usb/gadget/usbstring.c +++ b/drivers/usb/gadget/usbstring.c @@ -133,4 +133,4 @@ usb_gadget_get_string (struct usb_gadget_strings *table, int id, u8 *buf) buf [1] = USB_DT_STRING; return buf [0]; } - +EXPORT_SYMBOL_GPL(usb_gadget_get_string); diff --git a/drivers/usb/gadget/webcam.c b/drivers/usb/gadget/webcam.c index df6882d..80e9fe8 100644 --- a/drivers/usb/gadget/webcam.c +++ b/drivers/usb/gadget/webcam.c @@ -23,11 +23,6 @@ * the runtime footprint, and giving us at least some parts of what * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - #include "uvc_queue.c" #include "uvc_video.c" #include "uvc_v4l2.c" diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index 00e2fd2..e14227f 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c @@ -67,11 +67,6 @@ * the runtime footprint, and giving us at least some parts of what * a "gcc --combine ... part1.c part2.c part3.c ... " build would. */ -#include "composite.c" -#include "usbstring.c" -#include "config.c" -#include "epautoconf.c" - #include "f_sourcesink.c" #include "f_loopback.c" diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index a316fba..98d009f 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -369,6 +369,8 @@ extern int usb_string_ids_tab(struct usb_composite_dev *c, struct usb_string *str); extern int usb_string_ids_n(struct usb_composite_dev *c, unsigned n); +/* big enough to hold our biggest descriptor */ +#define USB_BUFSIZ 1024 /* messaging utils */ #define DBG(d, fmt, args...) \ -- 1.7.4.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html