Currently the videodev.ko code may be builtin while e.g. v4l2-fwnode.ko is build as a module. This makes it hard to add code depending on other subsystems spanning both videodev.ko and v4l2-fwnode.ko. Specifically this block adding code depending on the LED subsystem. This is made even harder because CONFIG_V4L2_FWNODE is selected, not depended on so it itself cannot depend on another subsystem without editing all the Kconfig symbols selecting it to also list the dependency and there are many of such symbols. Adding a "select LED_CLASS if NEW_LEDS" to CONFIG_V4L2_FWNODE leads to Kconfig erroring out with "error: recursive dependency detected!". To fix this dependency mess, change the V4L2_FWNODE and V4L2_ASYNC (which V4L2_FWNODE selects) Kconfig symbols from tristate to bools and link their code into videodev.ko instead of making them separate modules. This will allow using IS_REACHABLE(LED_CLASS) for the new LED integration code without needing to worry that it expands to 0 in some places and 1 in other places because some of the code being builtin vs modular. On x86_64 this leads to the following size changes for videodev.ko [hans@shalem linux]$ size drivers/media/v4l2-core/videodev.ko Before: text data bss dec hex filename 218206 14395 2448 235049 39629 drivers/media/v4l2-core/videodev.ko After: text data bss dec hex filename 243213 17615 2456 263284 40474 drivers/media/v4l2-core/videodev.ko So (as expected) there is some increase in size here, but it really is not that much. And the uncompressed no-debuginfo .ko file disk-usage actually shrinks by 17 KiB (comparing the slightly larger videodev.ko against the 3 original modules) and loading time will also be better. Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> --- Changes in v4: - New patch in v4 of this patch-set --- drivers/media/v4l2-core/Kconfig | 4 ++-- drivers/media/v4l2-core/Makefile | 4 ++-- drivers/media/v4l2-core/v4l2-async.c | 15 ++------------- drivers/media/v4l2-core/v4l2-dev.c | 7 +++++++ drivers/media/v4l2-core/v4l2-fwnode.c | 6 ------ include/media/v4l2-async.h | 4 ++++ 6 files changed, 17 insertions(+), 23 deletions(-) diff --git a/drivers/media/v4l2-core/Kconfig b/drivers/media/v4l2-core/Kconfig index 348559bc2468..73574d946010 100644 --- a/drivers/media/v4l2-core/Kconfig +++ b/drivers/media/v4l2-core/Kconfig @@ -68,11 +68,11 @@ config V4L2_FLASH_LED_CLASS When in doubt, say N. config V4L2_FWNODE - tristate + bool select V4L2_ASYNC config V4L2_ASYNC - tristate + bool # Used by drivers that need Videobuf modules config VIDEOBUF_GEN diff --git a/drivers/media/v4l2-core/Makefile b/drivers/media/v4l2-core/Makefile index 41d91bd10cf2..8c5a1ab8d939 100644 --- a/drivers/media/v4l2-core/Makefile +++ b/drivers/media/v4l2-core/Makefile @@ -15,7 +15,9 @@ videodev-objs := v4l2-dev.o v4l2-ioctl.o v4l2-device.o v4l2-fh.o \ # Please keep it alphabetically sorted by Kconfig name # (e. g. LC_ALL=C sort Makefile) +videodev-$(CONFIG_V4L2_ASYNC) += v4l2-async.o videodev-$(CONFIG_COMPAT) += v4l2-compat-ioctl32.o +videodev-$(CONFIG_V4L2_FWNODE) += v4l2-fwnode.o videodev-$(CONFIG_MEDIA_CONTROLLER) += v4l2-mc.o videodev-$(CONFIG_SPI) += v4l2-spi.o videodev-$(CONFIG_TRACEPOINTS) += v4l2-trace.o @@ -24,9 +26,7 @@ videodev-$(CONFIG_VIDEO_V4L2_I2C) += v4l2-i2c.o # Please keep it alphabetically sorted by Kconfig name # (e. g. LC_ALL=C sort Makefile) -obj-$(CONFIG_V4L2_ASYNC) += v4l2-async.o obj-$(CONFIG_V4L2_FLASH_LED_CLASS) += v4l2-flash-led-class.o -obj-$(CONFIG_V4L2_FWNODE) += v4l2-fwnode.o obj-$(CONFIG_V4L2_H264) += v4l2-h264.o obj-$(CONFIG_V4L2_JPEG_HELPER) += v4l2-jpeg.o obj-$(CONFIG_V4L2_MEM2MEM_DEV) += v4l2-mem2mem.o diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index 2f1b718a9189..b53012cbda34 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -11,7 +11,6 @@ #include <linux/i2c.h> #include <linux/list.h> #include <linux/mm.h> -#include <linux/module.h> #include <linux/mutex.h> #include <linux/of.h> #include <linux/platform_device.h> @@ -900,25 +899,15 @@ DEFINE_SHOW_ATTRIBUTE(pending_subdevs); static struct dentry *v4l2_async_debugfs_dir; -static int __init v4l2_async_init(void) +void __init v4l2_async_debugfs_init(void) { v4l2_async_debugfs_dir = debugfs_create_dir("v4l2-async", NULL); debugfs_create_file("pending_async_subdevices", 0444, v4l2_async_debugfs_dir, NULL, &pending_subdevs_fops); - - return 0; } -static void __exit v4l2_async_exit(void) +void __exit v4l2_async_debugfs_exit(void) { debugfs_remove_recursive(v4l2_async_debugfs_dir); } - -subsys_initcall(v4l2_async_init); -module_exit(v4l2_async_exit); - -MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@xxxxxx>"); -MODULE_AUTHOR("Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>"); -MODULE_AUTHOR("Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx>"); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index 397d553177fa..02364985817c 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -26,6 +26,7 @@ #include <linux/slab.h> #include <linux/uaccess.h> +#include <media/v4l2-async.h> #include <media/v4l2-common.h> #include <media/v4l2-device.h> #include <media/v4l2-ioctl.h> @@ -1190,6 +1191,7 @@ static int __init videodev_init(void) return -EIO; } + v4l2_async_debugfs_init(); return 0; } @@ -1197,6 +1199,7 @@ static void __exit videodev_exit(void) { dev_t dev = MKDEV(VIDEO_MAJOR, 0); + v4l2_async_debugfs_exit(); class_unregister(&video_class); unregister_chrdev_region(dev, VIDEO_NUM_DEVICES); } @@ -1205,6 +1208,10 @@ subsys_initcall(videodev_init); module_exit(videodev_exit) MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>, Bill Dirks, Justin Schoeman, Gerd Knorr"); +MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@xxxxxx>"); +MODULE_AUTHOR("Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>"); +MODULE_AUTHOR("Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx>"); +MODULE_AUTHOR("Sylwester Nawrocki <s.nawrocki@xxxxxxxxxxx>"); MODULE_DESCRIPTION("Video4Linux2 core driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS_CHARDEV_MAJOR(VIDEO_MAJOR); diff --git a/drivers/media/v4l2-core/v4l2-fwnode.c b/drivers/media/v4l2-core/v4l2-fwnode.c index 3d9533c1b202..c8a2264262bc 100644 --- a/drivers/media/v4l2-core/v4l2-fwnode.c +++ b/drivers/media/v4l2-core/v4l2-fwnode.c @@ -17,7 +17,6 @@ #include <linux/acpi.h> #include <linux/kernel.h> #include <linux/mm.h> -#include <linux/module.h> #include <linux/of.h> #include <linux/property.h> #include <linux/slab.h> @@ -1328,8 +1327,3 @@ int v4l2_async_register_subdev_sensor(struct v4l2_subdev *sd) return ret; } EXPORT_SYMBOL_GPL(v4l2_async_register_subdev_sensor); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>"); -MODULE_AUTHOR("Sylwester Nawrocki <s.nawrocki@xxxxxxxxxxx>"); -MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@xxxxxx>"); diff --git a/include/media/v4l2-async.h b/include/media/v4l2-async.h index 25eb1d138c06..c6a59ccc0c28 100644 --- a/include/media/v4l2-async.h +++ b/include/media/v4l2-async.h @@ -313,4 +313,8 @@ v4l2_async_register_subdev_sensor(struct v4l2_subdev *sd); * @sd: pointer to &struct v4l2_subdev */ void v4l2_async_unregister_subdev(struct v4l2_subdev *sd); + +void v4l2_async_debugfs_init(void); +void v4l2_async_debugfs_exit(void); + #endif -- 2.39.0