Message ID | 20210903191540.3052775-7-clabbe@baylibre.com |
---|---|
State | New |
Headers | show |
Series | staging: media: zoran: fusion in one module | expand |
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@baylibre.com> > --- > 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@net4you.at> > */ > > -#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@net4you.at>"); > -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@net4you.at>"); > -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@net4you.at>"); > -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@skynet.be>"); > -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 */ >
Le Mon, Sep 06, 2021 at 12:41:32PM +0200, Hans Verkuil a écrit : > 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 > Hello I am sorry, I was sure to have successfully removed the zoran module a couple of time with my DC10. Anyway I just acquired a DC30, so I will test it also (even if I believe that model should not change anything). Regards
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@net4you.at> */ -#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@net4you.at>"); -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@net4you.at>"); -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@net4you.at>"); -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@skynet.be>"); -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 */
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. Signed-off-by: Corentin Labbe <clabbe@baylibre.com> --- 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(-)