Re: [PATCH 6/8] staging: media: zoran: fusion all modules

From: Hans Verkuil
Date: Mon Sep 06 2021 - 06:41:38 EST


On 03/09/2021 21:15, Corentin Labbe wrote:
> The zoran driver is split in many modules, but this lead to some
> problems.
> One of them is that load order is incorrect when everything is built-in.
>
> Having more than one module is useless, so fusion all zoran modules in
> one.

After applying this patch I am no longer able to rmmod the module: it will
always report that it is in use. This is with a Miro DC30.

So something is wrong with refcounting.

I do like the idea of merging all these modules, but it needs a bit more
testing.

Regards,

Hans

>
> Signed-off-by: Corentin Labbe <clabbe@xxxxxxxxxxxx>
> ---
> drivers/staging/media/zoran/Kconfig | 14 +++----
> drivers/staging/media/zoran/Makefile | 8 ++--
> drivers/staging/media/zoran/videocodec.c | 28 --------------
> drivers/staging/media/zoran/zoran_card.c | 48 +++++++++++++++++++++---
> drivers/staging/media/zoran/zr36016.c | 11 +-----
> drivers/staging/media/zoran/zr36016.h | 2 +
> drivers/staging/media/zoran/zr36050.c | 12 +-----
> drivers/staging/media/zoran/zr36050.h | 2 +
> drivers/staging/media/zoran/zr36060.c | 11 +-----
> drivers/staging/media/zoran/zr36060.h | 2 +
> 10 files changed, 66 insertions(+), 72 deletions(-)
>
> diff --git a/drivers/staging/media/zoran/Kconfig b/drivers/staging/media/zoran/Kconfig
> index 7d2d3c2431b1..8eacdc00b081 100644
> --- a/drivers/staging/media/zoran/Kconfig
> +++ b/drivers/staging/media/zoran/Kconfig
> @@ -14,7 +14,7 @@ config VIDEO_ZORAN
> module will be called zr36067.
>
> config VIDEO_ZORAN_DC30
> - tristate "Pinnacle/Miro DC30(+) support"
> + bool "Pinnacle/Miro DC30(+) support"
> depends on VIDEO_ZORAN
> select VIDEO_ADV7175 if MEDIA_SUBDRV_AUTOSELECT
> select VIDEO_VPX3220 if MEDIA_SUBDRV_AUTOSELECT
> @@ -24,7 +24,7 @@ config VIDEO_ZORAN_DC30
> zr36050 MJPEG codec and zr36016 VFE.
>
> config VIDEO_ZORAN_ZR36060
> - tristate "Zoran ZR36060"
> + bool "Zoran ZR36060"
> depends on VIDEO_ZORAN
> help
> Say Y to support Zoran boards based on 36060 chips.
> @@ -32,7 +32,7 @@ config VIDEO_ZORAN_ZR36060
> and 33 R10 and AverMedia 6 boards.
>
> config VIDEO_ZORAN_BUZ
> - tristate "Iomega Buz support"
> + bool "Iomega Buz support"
> depends on VIDEO_ZORAN_ZR36060
> select VIDEO_SAA711X if MEDIA_SUBDRV_AUTOSELECT
> select VIDEO_SAA7185 if MEDIA_SUBDRV_AUTOSELECT
> @@ -40,7 +40,7 @@ config VIDEO_ZORAN_BUZ
> Support for the Iomega Buz MJPEG capture/playback card.
>
> config VIDEO_ZORAN_DC10
> - tristate "Pinnacle/Miro DC10(+) support"
> + bool "Pinnacle/Miro DC10(+) support"
> depends on VIDEO_ZORAN_ZR36060
> select VIDEO_SAA7110 if MEDIA_SUBDRV_AUTOSELECT
> select VIDEO_ADV7175 if MEDIA_SUBDRV_AUTOSELECT
> @@ -49,7 +49,7 @@ config VIDEO_ZORAN_DC10
> card.
>
> config VIDEO_ZORAN_LML33
> - tristate "Linux Media Labs LML33 support"
> + bool "Linux Media Labs LML33 support"
> depends on VIDEO_ZORAN_ZR36060
> select VIDEO_BT819 if MEDIA_SUBDRV_AUTOSELECT
> select VIDEO_BT856 if MEDIA_SUBDRV_AUTOSELECT
> @@ -58,7 +58,7 @@ config VIDEO_ZORAN_LML33
> card.
>
> config VIDEO_ZORAN_LML33R10
> - tristate "Linux Media Labs LML33R10 support"
> + bool "Linux Media Labs LML33R10 support"
> depends on VIDEO_ZORAN_ZR36060
> select VIDEO_SAA711X if MEDIA_SUBDRV_AUTOSELECT
> select VIDEO_ADV7170 if MEDIA_SUBDRV_AUTOSELECT
> @@ -67,7 +67,7 @@ config VIDEO_ZORAN_LML33R10
> card.
>
> config VIDEO_ZORAN_AVS6EYES
> - tristate "AverMedia 6 Eyes support"
> + bool "AverMedia 6 Eyes support"
> depends on VIDEO_ZORAN_ZR36060
> select VIDEO_BT856 if MEDIA_SUBDRV_AUTOSELECT
> select VIDEO_BT866 if MEDIA_SUBDRV_AUTOSELECT
> diff --git a/drivers/staging/media/zoran/Makefile b/drivers/staging/media/zoran/Makefile
> index 7023158e3892..9603bac0195c 100644
> --- a/drivers/staging/media/zoran/Makefile
> +++ b/drivers/staging/media/zoran/Makefile
> @@ -1,7 +1,7 @@
> # SPDX-License-Identifier: GPL-2.0
> zr36067-objs := zoran_device.o \
> - zoran_driver.o zoran_card.o
> + zoran_driver.o zoran_card.o videocodec.o
>
> -obj-$(CONFIG_VIDEO_ZORAN) += zr36067.o videocodec.o
> -obj-$(CONFIG_VIDEO_ZORAN_DC30) += zr36050.o zr36016.o
> -obj-$(CONFIG_VIDEO_ZORAN_ZR36060) += zr36060.o
> +obj-$(CONFIG_VIDEO_ZORAN) += zr36067.o
> +zr36067-$(CONFIG_VIDEO_ZORAN_DC30) += zr36050.o zr36016.o
> +zr36067-$(CONFIG_VIDEO_ZORAN_ZR36060) += zr36060.o
> diff --git a/drivers/staging/media/zoran/videocodec.c b/drivers/staging/media/zoran/videocodec.c
> index 3d5a83a07e07..7350d7747516 100644
> --- a/drivers/staging/media/zoran/videocodec.c
> +++ b/drivers/staging/media/zoran/videocodec.c
> @@ -8,8 +8,6 @@
> * (c) 2002 Wolfgang Scherr <scherr@xxxxxxxxxx>
> */
>
> -#define VIDEOCODEC_VERSION "v0.2"
> -
> #include <linux/kernel.h>
> #include <linux/module.h>
> #include <linux/init.h>
> @@ -119,7 +117,6 @@ struct videocodec *videocodec_attach(struct videocodec_master *master)
> kfree(codec);
> return NULL;
> }
> -EXPORT_SYMBOL(videocodec_attach);
>
> int videocodec_detach(struct videocodec *codec)
> {
> @@ -175,7 +172,6 @@ int videocodec_detach(struct videocodec *codec)
> pr_err("%s: given codec not found!\n", __func__);
> return -EINVAL;
> }
> -EXPORT_SYMBOL(videocodec_detach);
>
> int videocodec_register(const struct videocodec *codec)
> {
> @@ -208,7 +204,6 @@ int videocodec_register(const struct videocodec *codec)
>
> return 0;
> }
> -EXPORT_SYMBOL(videocodec_register);
>
> int videocodec_unregister(const struct videocodec *codec)
> {
> @@ -255,7 +250,6 @@ int videocodec_unregister(const struct videocodec *codec)
> pr_err("%s: given codec not found!\n", __func__);
> return -EINVAL;
> }
> -EXPORT_SYMBOL(videocodec_unregister);
>
> #ifdef CONFIG_VIDEO_ZORAN_DEBUG
> int videocodec_debugfs_show(struct seq_file *m)
> @@ -286,25 +280,3 @@ int videocodec_debugfs_show(struct seq_file *m)
> return 0;
> }
> #endif
> -
> -/* ===================== */
> -/* hook in driver module */
> -/* ===================== */
> -static int __init videocodec_init(void)
> -{
> - pr_info("Linux video codec intermediate layer: %s\n", VIDEOCODEC_VERSION);
> -
> - return 0;
> -}
> -
> -static void __exit videocodec_exit(void)
> -{
> -}
> -
> -module_init(videocodec_init);
> -module_exit(videocodec_exit);
> -
> -MODULE_AUTHOR("Wolfgang Scherr <scherr@xxxxxxxxxx>");
> -MODULE_DESCRIPTION("Intermediate API module for video codecs "
> - VIDEOCODEC_VERSION);
> -MODULE_LICENSE("GPL");
> diff --git a/drivers/staging/media/zoran/zoran_card.c b/drivers/staging/media/zoran/zoran_card.c
> index 1ed8ed2f4f7f..7b2e1d1c4622 100644
> --- a/drivers/staging/media/zoran/zoran_card.c
> +++ b/drivers/staging/media/zoran/zoran_card.c
> @@ -29,6 +29,9 @@
> #include "zoran.h"
> #include "zoran_card.h"
> #include "zoran_device.h"
> +#include "zr36016.h"
> +#include "zr36050.h"
> +#include "zr36060.h"
>
> extern const struct zoran_format zoran_formats[];
>
> @@ -266,6 +269,39 @@ static const char *codecid_to_modulename(u16 codecid)
> return name;
> }
>
> +static int load_codec(struct zoran *zr, u16 codecid)
> +{
> + switch (codecid) {
> + case CODEC_TYPE_ZR36060:
> +#ifdef CONFIG_VIDEO_ZORAN_ZR36060
> + return zr36060_init_module();
> +#else
> + pci_err(zr->pci_dev, "ZR36060 support is not enabled\n");
> + return -EINVAL;
> +#endif
> + break;
> + case CODEC_TYPE_ZR36050:
> +#ifdef CONFIG_VIDEO_ZORAN_DC30
> + return zr36050_init_module();
> +#else
> + pci_err(zr->pci_dev, "ZR36050 support is not enabled\n");
> + return -EINVAL;
> +#endif
> + break;
> + case CODEC_TYPE_ZR36016:
> +#ifdef CONFIG_VIDEO_ZORAN_DC30
> + return zr36016_init_module();
> +#else
> + pci_err(zr->pci_dev, "ZR36016 support is not enabled\n");
> + return -EINVAL;
> +#endif
> + break;
> + }
> +
> + pci_err(zr->pci_dev, "unknown codec id %x\n", codecid);
> + return -EINVAL;
> +}
> +
> // struct tvnorm {
> // u16 wt, wa, h_start, h_sync_start, ht, ha, v_start;
> // };
> @@ -1078,6 +1114,8 @@ static int zoran_debugfs_show(struct seq_file *seq, void *v)
>
> seq_printf(seq, "Prepared %u\n", zr->prepared);
> seq_printf(seq, "Queued %u\n", zr->queued);
> +
> + videocodec_debugfs_show(seq);
> return 0;
> }
>
> @@ -1262,17 +1300,17 @@ static int zoran_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
> if (zr->card.video_codec) {
> codec_name = codecid_to_modulename(zr->card.video_codec);
> if (codec_name) {
> - result = request_module(codec_name);
> - if (result)
> - pci_err(pdev, "failed to load modules %s: %d\n", codec_name, result);
> + result = load_codec(zr, zr->card.video_codec);
> + if (result < 0)
> + pci_err(pdev, "failed to load codec %s: %d\n", codec_name, result);
> }
> }
> if (zr->card.video_vfe) {
> vfe_name = codecid_to_modulename(zr->card.video_vfe);
> if (vfe_name) {
> - result = request_module(vfe_name);
> + result = load_codec(zr, zr->card.video_vfe);
> if (result < 0)
> - pci_err(pdev, "failed to load modules %s: %d\n", vfe_name, result);
> + pci_err(pdev, "failed to load codec %s: %d\n", vfe_name, result);
> }
> }
>
> diff --git a/drivers/staging/media/zoran/zr36016.c b/drivers/staging/media/zoran/zr36016.c
> index 50605460a44b..adf738b5a1d5 100644
> --- a/drivers/staging/media/zoran/zr36016.c
> +++ b/drivers/staging/media/zoran/zr36016.c
> @@ -409,14 +409,14 @@ static const struct videocodec zr36016_codec = {
> HOOK IN DRIVER AS KERNEL MODULE
> ========================================================================= */
>
> -static int __init zr36016_init_module(void)
> +int zr36016_init_module(void)
> {
> //dprintk(1, "ZR36016 driver %s\n",ZR016_VERSION);
> zr36016_codecs = 0;
> return videocodec_register(&zr36016_codec);
> }
>
> -static void __exit zr36016_cleanup_module(void)
> +void zr36016_cleanup_module(void)
> {
> if (zr36016_codecs) {
> dprintk(1,
> @@ -425,10 +425,3 @@ static void __exit zr36016_cleanup_module(void)
> }
> videocodec_unregister(&zr36016_codec);
> }
> -
> -module_init(zr36016_init_module);
> -module_exit(zr36016_cleanup_module);
> -
> -MODULE_AUTHOR("Wolfgang Scherr <scherr@xxxxxxxxxx>");
> -MODULE_DESCRIPTION("Driver module for ZR36016 video frontends");
> -MODULE_LICENSE("GPL");
> diff --git a/drivers/staging/media/zoran/zr36016.h b/drivers/staging/media/zoran/zr36016.h
> index 1475f971cc24..04afba35669d 100644
> --- a/drivers/staging/media/zoran/zr36016.h
> +++ b/drivers/staging/media/zoran/zr36016.h
> @@ -89,4 +89,6 @@ struct zr36016 {
> #define ZR016_SIGN 0x02
> #define ZR016_YMCS 0x01
>
> +int zr36016_init_module(void);
> +void zr36016_cleanup_module(void);
> #endif /*fndef ZR36016_H */
> diff --git a/drivers/staging/media/zoran/zr36050.c b/drivers/staging/media/zoran/zr36050.c
> index 4dc7927fefc3..e36eff4a798c 100644
> --- a/drivers/staging/media/zoran/zr36050.c
> +++ b/drivers/staging/media/zoran/zr36050.c
> @@ -817,14 +817,14 @@ static const struct videocodec zr36050_codec = {
> HOOK IN DRIVER AS KERNEL MODULE
> ========================================================================= */
>
> -static int __init zr36050_init_module(void)
> +int zr36050_init_module(void)
> {
> //dprintk(1, "ZR36050 driver %s\n",ZR050_VERSION);
> zr36050_codecs = 0;
> return videocodec_register(&zr36050_codec);
> }
>
> -static void __exit zr36050_cleanup_module(void)
> +void zr36050_cleanup_module(void)
> {
> if (zr36050_codecs) {
> dprintk(1,
> @@ -833,11 +833,3 @@ static void __exit zr36050_cleanup_module(void)
> }
> videocodec_unregister(&zr36050_codec);
> }
> -
> -module_init(zr36050_init_module);
> -module_exit(zr36050_cleanup_module);
> -
> -MODULE_AUTHOR("Wolfgang Scherr <scherr@xxxxxxxxxx>");
> -MODULE_DESCRIPTION("Driver module for ZR36050 jpeg processors "
> - ZR050_VERSION);
> -MODULE_LICENSE("GPL");
> diff --git a/drivers/staging/media/zoran/zr36050.h b/drivers/staging/media/zoran/zr36050.h
> index 8f972d045b58..f9b58f4c77b9 100644
> --- a/drivers/staging/media/zoran/zr36050.h
> +++ b/drivers/staging/media/zoran/zr36050.h
> @@ -160,4 +160,6 @@ struct zr36050 {
> #define ZR050_U_COMPONENT 1
> #define ZR050_V_COMPONENT 2
>
> +int zr36050_init_module(void);
> +void zr36050_cleanup_module(void);
> #endif /*fndef ZR36050_H */
> diff --git a/drivers/staging/media/zoran/zr36060.c b/drivers/staging/media/zoran/zr36060.c
> index 7904d5b1f402..0a6a8c985137 100644
> --- a/drivers/staging/media/zoran/zr36060.c
> +++ b/drivers/staging/media/zoran/zr36060.c
> @@ -846,13 +846,13 @@ static const struct videocodec zr36060_codec = {
> // others are not used
> };
>
> -static int __init zr36060_init_module(void)
> +int zr36060_init_module(void)
> {
> zr36060_codecs = 0;
> return videocodec_register(&zr36060_codec);
> }
>
> -static void __exit zr36060_cleanup_module(void)
> +void zr36060_cleanup_module(void)
> {
> if (zr36060_codecs) {
> dprintk(1,
> @@ -863,10 +863,3 @@ static void __exit zr36060_cleanup_module(void)
> /* however, we can't just stay alive */
> videocodec_unregister(&zr36060_codec);
> }
> -
> -module_init(zr36060_init_module);
> -module_exit(zr36060_cleanup_module);
> -
> -MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@xxxxxxxxx>");
> -MODULE_DESCRIPTION("Driver module for ZR36060 jpeg processors " ZR060_VERSION);
> -MODULE_LICENSE("GPL");
> diff --git a/drivers/staging/media/zoran/zr36060.h b/drivers/staging/media/zoran/zr36060.h
> index d2cdc26bf625..fbf5429534ac 100644
> --- a/drivers/staging/media/zoran/zr36060.h
> +++ b/drivers/staging/media/zoran/zr36060.h
> @@ -198,4 +198,6 @@ struct zr36060 {
> #define ZR060_SR_H_SCALE2 BIT(0)
> #define ZR060_SR_H_SCALE4 (2 << 0)
>
> +int zr36060_init_module(void);
> +void zr36060_cleanup_module(void);
> #endif /*fndef ZR36060_H */
>