media: staging: media: zoran: merge all modules
authorCorentin Labbe <clabbe@baylibre.com>
Tue, 14 Dec 2021 16:16:24 +0000 (17:16 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Sun, 23 Jan 2022 20:18:39 +0000 (21:18 +0100)
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 merge all zoran modules in
one.

Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/staging/media/zoran/Kconfig
drivers/staging/media/zoran/Makefile
drivers/staging/media/zoran/videocodec.c
drivers/staging/media/zoran/videocodec.h
drivers/staging/media/zoran/zoran_card.c
drivers/staging/media/zoran/zr36016.c
drivers/staging/media/zoran/zr36016.h
drivers/staging/media/zoran/zr36050.c
drivers/staging/media/zoran/zr36050.h
drivers/staging/media/zoran/zr36060.c
drivers/staging/media/zoran/zr36060.h

index 6d6e4c9..4067fa9 100644 (file)
@@ -15,7 +15,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
@@ -25,7 +25,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.
@@ -33,7 +33,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
@@ -41,7 +41,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
@@ -50,7 +50,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
@@ -59,7 +59,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
@@ -68,7 +68,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
index 7023158..9603bac 100644 (file)
@@ -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
index 5bab7ba..3af7d02 100644 (file)
@@ -8,8 +8,6 @@
  * (c) 2002 Wolfgang Scherr <scherr@net4you.at>
  */
 
-#define VIDEOCODEC_VERSION "v0.2"
-
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -72,12 +70,9 @@ struct videocodec *videocodec_attach(struct videocodec_master *master)
                if ((master->flags & h->codec->flags) == master->flags) {
                        dprintk(4, "%s: try '%s'\n", __func__, h->codec->name);
 
-                       if (!try_module_get(h->codec->owner))
-                               return NULL;
-
                        codec = kmemdup(h->codec, sizeof(struct videocodec), GFP_KERNEL);
                        if (!codec)
-                               goto out_module_put;
+                               goto out_kfree;
 
                        res = strlen(codec->name);
                        snprintf(codec->name + res, sizeof(codec->name) - res, "[%d]", h->attached);
@@ -113,13 +108,10 @@ struct videocodec *videocodec_attach(struct videocodec_master *master)
        pr_err("%s: no codec found!\n", __func__);
        return NULL;
 
- out_module_put:
-       module_put(h->codec->owner);
  out_kfree:
        kfree(codec);
        return NULL;
 }
-EXPORT_SYMBOL(videocodec_attach);
 
 int videocodec_detach(struct videocodec *codec)
 {
@@ -160,7 +152,6 @@ int videocodec_detach(struct videocodec *codec)
                                        prev->next = a->next;
                                        dprintk(4, "videocodec: delete middle\n");
                                }
-                               module_put(a->codec->owner);
                                kfree(a->codec);
                                kfree(a);
                                h->attached -= 1;
@@ -175,7 +166,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 +198,6 @@ int videocodec_register(const struct videocodec *codec)
 
        return 0;
 }
-EXPORT_SYMBOL(videocodec_register);
 
 int videocodec_unregister(const struct videocodec *codec)
 {
@@ -255,7 +244,6 @@ int videocodec_unregister(const struct videocodec *codec)
        pr_err("%s: given codec not found!\n", __func__);
        return -EINVAL;
 }
-EXPORT_SYMBOL(videocodec_unregister);
 
 int videocodec_debugfs_show(struct seq_file *m)
 {
@@ -284,25 +272,3 @@ int videocodec_debugfs_show(struct seq_file *m)
 
        return 0;
 }
-
-/* ===================== */
-/* 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@net4you.at>");
-MODULE_DESCRIPTION("Intermediate API module for video codecs "
-                  VIDEOCODEC_VERSION);
-MODULE_LICENSE("GPL");
index 3a508d3..9dea348 100644 (file)
@@ -234,7 +234,6 @@ struct jpeg_app_marker {
 };
 
 struct videocodec {
-       struct module *owner;
        /* -- filled in by slave device during register -- */
        char name[32];
        unsigned long magic;    /* may be used for client<->master attaching */
index 54e9ea0..26a5392 100644 (file)
@@ -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,96 @@ static const char *codecid_to_modulename(u16 codecid)
        return name;
 }
 
+static int codec_init(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;
+}
+
+static void codec_exit(struct zoran *zr, u16 codecid)
+{
+       switch (codecid) {
+       case CODEC_TYPE_ZR36060:
+#ifdef CONFIG_VIDEO_ZORAN_ZR36060
+               zr36060_cleanup_module();
+#endif
+               break;
+       case CODEC_TYPE_ZR36050:
+#ifdef CONFIG_VIDEO_ZORAN_DC30
+               zr36050_cleanup_module();
+#endif
+               break;
+       case CODEC_TYPE_ZR36016:
+#ifdef CONFIG_VIDEO_ZORAN_DC30
+               zr36016_cleanup_module();
+#endif
+               break;
+       }
+}
+
+static int videocodec_init(struct zoran *zr)
+{
+       const char *codec_name, *vfe_name;
+       int result;
+
+       codec_name = codecid_to_modulename(zr->card.video_codec);
+       if (codec_name) {
+               result = codec_init(zr, zr->card.video_codec);
+               if (result < 0) {
+                       pci_err(zr->pci_dev, "failed to load video codec %s: %d\n",
+                               codec_name, result);
+                       return result;
+               }
+       }
+       vfe_name = codecid_to_modulename(zr->card.video_vfe);
+       if (vfe_name) {
+               result = codec_init(zr, zr->card.video_vfe);
+               if (result < 0) {
+                       pci_err(zr->pci_dev, "failed to load video vfe %s: %d\n",
+                               vfe_name, result);
+                       if (codec_name)
+                               codec_exit(zr, zr->card.video_codec);
+                       return result;
+               }
+       }
+       return 0;
+}
+
+static void videocodec_exit(struct zoran *zr)
+{
+       if (zr->card.video_codec != CODEC_TYPE_NONE)
+               codec_exit(zr, zr->card.video_codec);
+       if (zr->card.video_vfe != CODEC_TYPE_NONE)
+               codec_exit(zr, zr->card.video_vfe);
+}
+
 // struct tvnorm {
 //      u16 wt, wa, h_start, h_sync_start, ht, ha, v_start;
 // };
@@ -954,6 +1047,7 @@ static void zoran_remove(struct pci_dev *pdev)
                videocodec_detach(zr->codec);
        if (zr->vfe)
                videocodec_detach(zr->vfe);
+       videocodec_exit(zr);
 
        /* unregister i2c bus */
        zoran_unregister_i2c(zr);
@@ -1079,6 +1173,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;
 }
 
@@ -1096,7 +1192,6 @@ static int zoran_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        struct videocodec_master *master_vfe = NULL;
        struct videocodec_master *master_codec = NULL;
        int card_num;
-       const char *codec_name, *vfe_name;
        unsigned int nr;
        int err;
 
@@ -1258,23 +1353,9 @@ static int zoran_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                                                  zr->card.addrs_encoder);
 
        pci_info(zr->pci_dev, "Initializing videocodec bus...\n");
-
-       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);
-               }
-       }
-       if (zr->card.video_vfe) {
-               vfe_name = codecid_to_modulename(zr->card.video_vfe);
-               if (vfe_name) {
-                       result = request_module(vfe_name);
-                       if (result < 0)
-                               pci_err(pdev, "failed to load modules %s: %d\n", vfe_name, result);
-               }
-       }
+       err = videocodec_init(zr);
+       if (err)
+               goto zr_unreg_i2c;
 
        /* reset JPEG codec */
        jpeg_codec_sleep(zr, 1);
@@ -1328,6 +1409,8 @@ zr_detach_vfe:
        videocodec_detach(zr->vfe);
 zr_detach_codec:
        videocodec_detach(zr->codec);
+zr_unreg_videocodec:
+       videocodec_exit(zr);
 zr_unreg_i2c:
        zoran_unregister_i2c(zr);
 zr_free_irq:
index 5060546..26c7c32 100644 (file)
@@ -390,7 +390,6 @@ static int zr36016_setup(struct videocodec *codec)
 }
 
 static const struct videocodec zr36016_codec = {
-       .owner = THIS_MODULE,
        .name = "zr36016",
        .magic = 0L,            /* magic not used */
        .flags =
@@ -409,14 +408,13 @@ 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 +423,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@net4you.at>");
-MODULE_DESCRIPTION("Driver module for ZR36016 video frontends");
-MODULE_LICENSE("GPL");
index 1475f97..04afba3 100644 (file)
@@ -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 */
index 4dc7927..38f7021 100644 (file)
@@ -5,8 +5,6 @@
  * Copyright (C) 2001 Wolfgang Scherr <scherr@net4you.at>
  */
 
-#define ZR050_VERSION "v0.7.1"
-
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/slab.h>
@@ -798,7 +796,6 @@ static int zr36050_setup(struct videocodec *codec)
 }
 
 static const struct videocodec zr36050_codec = {
-       .owner = THIS_MODULE,
        .name = "zr36050",
        .magic = 0L,            // magic not used
        .flags =
@@ -817,14 +814,13 @@ 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 +829,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@net4you.at>");
-MODULE_DESCRIPTION("Driver module for ZR36050 jpeg processors "
-                  ZR050_VERSION);
-MODULE_LICENSE("GPL");
index 8f972d0..f9b58f4 100644 (file)
@@ -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 */
index 7904d5b..d0c369e 100644 (file)
@@ -5,8 +5,6 @@
  * Copyright (C) 2002 Laurent Pinchart <laurent.pinchart@skynet.be>
  */
 
-#define ZR060_VERSION "v0.7"
-
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/slab.h>
@@ -831,7 +829,6 @@ static int zr36060_setup(struct videocodec *codec)
 }
 
 static const struct videocodec zr36060_codec = {
-       .owner = THIS_MODULE,
        .name = "zr36060",
        .magic = 0L,            // magic not used
        .flags =
@@ -846,13 +843,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 +860,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@skynet.be>");
-MODULE_DESCRIPTION("Driver module for ZR36060 jpeg processors " ZR060_VERSION);
-MODULE_LICENSE("GPL");
index d2cdc26..fbf5429 100644 (file)
@@ -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 */