Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0439db75 authored by Stefan Ringel's avatar Stefan Ringel Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB: tm6000: add extension module support



add module init over tm6000 extension

Signed-off-by: default avatarStefan Ringel <stefan.ringel@arcor.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9e1d9e7b
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -410,5 +410,28 @@ error:
	snd_card_free(card);
	return rc;
}
EXPORT_SYMBOL_GPL(tm6000_audio_init);

static int tm6000_audio_fini(struct tm6000_core *dev)
{
	return 0;
}

struct tm6000_ops audio_ops = {
	.id	= TM6000_AUDIO,
	.name	= "TM6000 Audio Extension",
	.init	= tm6000_audio_init,
	.fini	= tm6000_audio_fini,
};

static int __init tm6000_alsa_register(void)
{
	return tm6000_register_extension(&audio_ops);
}

static void __exit tm6000_alsa_unregister(void)
{
	tm6000_unregister_extension(&audio_ops);
}

module_init(tm6000_alsa_register);
module_exit(tm6000_alsa_unregister);
+7 −0
Original line number Diff line number Diff line
@@ -692,6 +692,10 @@ static int tm6000_init_dev(struct tm6000_core *dev)
	if (rc < 0)
		goto err;

	tm6000_add_into_devlist(dev);

	tm6000_init_extension(dev);

	if (dev->caps.has_dvb) {
		dev->dvb = kzalloc(sizeof(*(dev->dvb)), GFP_KERNEL);
		if (!dev->dvb) {
@@ -931,6 +935,9 @@ static void tm6000_usb_disconnect(struct usb_interface *interface)

	usb_put_dev(dev->udev);

	tm6000_remove_from_devlist(dev);
	tm6000_close_extension(dev);

	mutex_unlock(&dev->lock);
	kfree(dev);
}
+92 −0
Original line number Diff line number Diff line
@@ -600,3 +600,95 @@ printk("Original value=%d\n",val);
	return val;
}
EXPORT_SYMBOL_GPL(tm6000_set_audio_bitrate);

static LIST_HEAD(tm6000_devlist);
static DEFINE_MUTEX(tm6000_devlist_mutex);

/*
 * tm6000_realease_resource()
 */

void tm6000_remove_from_devlist(struct tm6000_core *dev)
{
	mutex_lock(&tm6000_devlist_mutex);
	list_del(&dev->devlist);
	mutex_unlock(&tm6000_devlist_mutex);
};

void tm6000_add_into_devlist(struct tm6000_core *dev)
{
	mutex_lock(&tm6000_devlist_mutex);
	list_add_tail(&dev->devlist, &tm6000_devlist);
	mutex_unlock(&tm6000_devlist_mutex);
};

/*
 * Extension interface
 */

static LIST_HEAD(tm6000_extension_devlist);
static DEFINE_MUTEX(tm6000_extension_devlist_lock);

int tm6000_register_extension(struct tm6000_ops *ops)
{
	struct tm6000_core *dev = NULL;

	mutex_lock(&tm6000_devlist_mutex);
	mutex_lock(&tm6000_extension_devlist_lock);
	list_add_tail(&ops->next, &tm6000_extension_devlist);
	list_for_each_entry(dev, &tm6000_devlist, devlist) {
		if (dev)
			ops->init(dev);
	}
	printk(KERN_INFO "tm6000: Initialized (%s) extension\n", ops->name);
	mutex_unlock(&tm6000_extension_devlist_lock);
	mutex_unlock(&tm6000_devlist_mutex);
	return 0;
}
EXPORT_SYMBOL(tm6000_register_extension);

void tm6000_unregister_extension(struct tm6000_ops *ops)
{
	struct tm6000_core *dev = NULL;

	mutex_lock(&tm6000_devlist_mutex);
	list_for_each_entry(dev, &tm6000_devlist, devlist) {
		if (dev)
			ops->fini(dev);
	}

	mutex_lock(&tm6000_extension_devlist_lock);
	printk(KERN_INFO "tm6000: Remove (%s) extension\n", ops->name);
	list_del(&ops->next);
	mutex_unlock(&tm6000_extension_devlist_lock);
	mutex_unlock(&tm6000_devlist_mutex);
}
EXPORT_SYMBOL(tm6000_unregister_extension);

void tm6000_init_extension(struct tm6000_core *dev)
{
	struct tm6000_ops *ops = NULL;

	mutex_lock(&tm6000_extension_devlist_lock);
	if (!list_empty(&tm6000_extension_devlist)) {
		list_for_each_entry(ops, &tm6000_extension_devlist, next) {
			if (ops->init)
				ops->init(dev);
		}
	}
	mutex_unlock(&tm6000_extension_devlist_lock);
}

void tm6000_close_extension(struct tm6000_core *dev)
{
	struct tm6000_ops *ops = NULL;

	mutex_lock(&tm6000_extension_devlist_lock);
	if (!list_empty(&tm6000_extension_devlist)) {
		list_for_each_entry(ops, &tm6000_extension_devlist, next) {
			if (ops->fini)
				ops->fini(dev);
		}
	}
	mutex_unlock(&tm6000_extension_devlist_lock);
}
+22 −1
Original line number Diff line number Diff line
@@ -168,6 +168,10 @@ struct tm6000_core {
	struct i2c_adapter		i2c_adap;
	struct i2c_client		i2c_client;


	/* extension */
	struct list_head		devlist;

	/* video for linux */
	int				users;

@@ -203,6 +207,16 @@ struct tm6000_core {
	spinlock_t                   slock;
};

#define TM6000_AUDIO 0x10

struct tm6000_ops {
	struct list_head	next;
	char			*name;
	int			id;
	int (*init)(struct tm6000_core *);
	int (*fini)(struct tm6000_core *);
};

struct tm6000_fh {
	struct tm6000_core           *dev;

@@ -246,6 +260,13 @@ int tm6000_v4l2_unregister(struct tm6000_core *dev);
int tm6000_v4l2_exit(void);
void tm6000_set_fourcc_format(struct tm6000_core *dev);

void tm6000_remove_from_devlist(struct tm6000_core *dev);
void tm6000_add_into_devlist(struct tm6000_core *dev);
int tm6000_register_extension(struct tm6000_ops *ops);
void tm6000_unregister_extension(struct tm6000_ops *ops);
void tm6000_init_extension(struct tm6000_core *dev);
void tm6000_close_extension(struct tm6000_core *dev);

/* In tm6000-stds.c */
void tm6000_get_std_res(struct tm6000_core *dev);
int tm6000_set_standard (struct tm6000_core *dev, v4l2_std_id *norm);
@@ -275,7 +296,7 @@ unsigned int tm6000_v4l2_poll(struct file *file,
int tm6000_queue_init(struct tm6000_core *dev);

/* In tm6000-alsa.c */
int tm6000_audio_init(struct tm6000_core *dev, int idx);
/*int tm6000_audio_init(struct tm6000_core *dev, int idx);*/


/* Debug stuff */