Commit fe047de4 authored by Corentin Labbe's avatar Corentin Labbe Committed by Mauro Carvalho Chehab
Browse files

media: staging: media: zoran: merge all modules



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: default avatarCorentin Labbe <clabbe@baylibre.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 12b65d5c
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -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
+4 −4
Original line number Diff line number Diff line
# 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
+1 −35
Original line number Diff line number Diff line
@@ -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");
+0 −1
Original line number Diff line number Diff line
@@ -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 */
+101 −18
Original line number Diff line number Diff line
@@ -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 @@ static int zoran_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	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:
Loading