* [PATCH 1/2] tm6000: bugfix tuner callback @ 2010-05-10 16:22 stefan.ringel 2010-05-10 16:22 ` [PATCH 2/2] tm6000: add extension stefan.ringel 0 siblings, 1 reply; 4+ messages in thread From: stefan.ringel @ 2010-05-10 16:22 UTC (permalink / raw) To: linux-media; +Cc: mchehab, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-cards.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index 6143e20..9f6160b 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c @@ -563,7 +563,7 @@ static void tm6000_config_tuner(struct tm6000_core *dev) switch (dev->tuner_type) { case TUNER_XC2028: - tun_setup.tuner_callback = tm6000_tuner_callback;; + tun_setup.tuner_callback = tm6000_tuner_callback; break; case TUNER_XC5000: tun_setup.tuner_callback = tm6000_xc5000_callback; -- 1.7.0.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] tm6000: add extension 2010-05-10 16:22 [PATCH 1/2] tm6000: bugfix tuner callback stefan.ringel @ 2010-05-10 16:22 ` stefan.ringel 2010-05-27 15:21 ` Bee Hock Goh 0 siblings, 1 reply; 4+ messages in thread From: stefan.ringel @ 2010-05-10 16:22 UTC (permalink / raw) To: linux-media; +Cc: mchehab, Stefan Ringel From: Stefan Ringel <stefan.ringel@arcor.de> add extension add module init over tm6000 extension Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> --- drivers/staging/tm6000/tm6000-alsa.c | 25 +++++++++- drivers/staging/tm6000/tm6000-cards.c | 7 +++ drivers/staging/tm6000/tm6000-core.c | 92 +++++++++++++++++++++++++++++++++ drivers/staging/tm6000/tm6000.h | 23 ++++++++- 4 files changed, 145 insertions(+), 2 deletions(-) diff --git a/drivers/staging/tm6000/tm6000-alsa.c b/drivers/staging/tm6000/tm6000-alsa.c index bc89f9d..ce081cd 100644 --- a/drivers/staging/tm6000/tm6000-alsa.c +++ b/drivers/staging/tm6000/tm6000-alsa.c @@ -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); diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c index 9f6160b..33b134b 100644 --- a/drivers/staging/tm6000/tm6000-cards.c +++ b/drivers/staging/tm6000/tm6000-cards.c @@ -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); } diff --git a/drivers/staging/tm6000/tm6000-core.c b/drivers/staging/tm6000/tm6000-core.c index bfbc53b..1259ae5 100644 --- a/drivers/staging/tm6000/tm6000-core.c +++ b/drivers/staging/tm6000/tm6000-core.c @@ -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); +} diff --git a/drivers/staging/tm6000/tm6000.h b/drivers/staging/tm6000/tm6000.h index 6812d68..79ef72a 100644 --- a/drivers/staging/tm6000/tm6000.h +++ b/drivers/staging/tm6000/tm6000.h @@ -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 */ -- 1.7.0.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] tm6000: add extension 2010-05-10 16:22 ` [PATCH 2/2] tm6000: add extension stefan.ringel @ 2010-05-27 15:21 ` Bee Hock Goh 2010-05-27 15:27 ` Stefan Ringel 0 siblings, 1 reply; 4+ messages in thread From: Bee Hock Goh @ 2010-05-27 15:21 UTC (permalink / raw) To: stefan.ringel; +Cc: linux-media, mchehab Stefan, Did you have a kernel opps while loading the tm6000-alsa? regards, Hock. On Tue, May 11, 2010 at 12:22 AM, <stefan.ringel@arcor.de> wrote: > From: Stefan Ringel <stefan.ringel@arcor.de> > > add extension > add module init over tm6000 extension > > > Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> > --- > drivers/staging/tm6000/tm6000-alsa.c | 25 +++++++++- > drivers/staging/tm6000/tm6000-cards.c | 7 +++ > drivers/staging/tm6000/tm6000-core.c | 92 +++++++++++++++++++++++++++++++++ > drivers/staging/tm6000/tm6000.h | 23 ++++++++- > 4 files changed, 145 insertions(+), 2 deletions(-) > > diff --git a/drivers/staging/tm6000/tm6000-alsa.c b/drivers/staging/tm6000/tm6000-alsa.c > index bc89f9d..ce081cd 100644 > --- a/drivers/staging/tm6000/tm6000-alsa.c > +++ b/drivers/staging/tm6000/tm6000-alsa.c > @@ -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); > diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c > index 9f6160b..33b134b 100644 > --- a/drivers/staging/tm6000/tm6000-cards.c > +++ b/drivers/staging/tm6000/tm6000-cards.c > @@ -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); > } > diff --git a/drivers/staging/tm6000/tm6000-core.c b/drivers/staging/tm6000/tm6000-core.c > index bfbc53b..1259ae5 100644 > --- a/drivers/staging/tm6000/tm6000-core.c > +++ b/drivers/staging/tm6000/tm6000-core.c > @@ -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); > +} > diff --git a/drivers/staging/tm6000/tm6000.h b/drivers/staging/tm6000/tm6000.h > index 6812d68..79ef72a 100644 > --- a/drivers/staging/tm6000/tm6000.h > +++ b/drivers/staging/tm6000/tm6000.h > @@ -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 */ > -- > 1.7.0.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-media" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] tm6000: add extension 2010-05-27 15:21 ` Bee Hock Goh @ 2010-05-27 15:27 ` Stefan Ringel 0 siblings, 0 replies; 4+ messages in thread From: Stefan Ringel @ 2010-05-27 15:27 UTC (permalink / raw) To: Bee Hock Goh; +Cc: linux-media, mchehab [-- Attachment #1: Type: text/plain, Size: 8300 bytes --] Am 27.05.2010 17:21, schrieb Bee Hock Goh: > Stefan, > > Did you have a kernel opps while loading the tm6000-alsa? > > regards, > Hock. > > No, but I rewrite the init and fini function. If that works I send it. > On Tue, May 11, 2010 at 12:22 AM, <stefan.ringel@arcor.de> wrote: > >> From: Stefan Ringel <stefan.ringel@arcor.de> >> >> add extension >> add module init over tm6000 extension >> >> >> Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> >> --- >> drivers/staging/tm6000/tm6000-alsa.c | 25 +++++++++- >> drivers/staging/tm6000/tm6000-cards.c | 7 +++ >> drivers/staging/tm6000/tm6000-core.c | 92 +++++++++++++++++++++++++++++++++ >> drivers/staging/tm6000/tm6000.h | 23 ++++++++- >> 4 files changed, 145 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/staging/tm6000/tm6000-alsa.c b/drivers/staging/tm6000/tm6000-alsa.c >> index bc89f9d..ce081cd 100644 >> --- a/drivers/staging/tm6000/tm6000-alsa.c >> +++ b/drivers/staging/tm6000/tm6000-alsa.c >> @@ -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); >> diff --git a/drivers/staging/tm6000/tm6000-cards.c b/drivers/staging/tm6000/tm6000-cards.c >> index 9f6160b..33b134b 100644 >> --- a/drivers/staging/tm6000/tm6000-cards.c >> +++ b/drivers/staging/tm6000/tm6000-cards.c >> @@ -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); >> } >> diff --git a/drivers/staging/tm6000/tm6000-core.c b/drivers/staging/tm6000/tm6000-core.c >> index bfbc53b..1259ae5 100644 >> --- a/drivers/staging/tm6000/tm6000-core.c >> +++ b/drivers/staging/tm6000/tm6000-core.c >> @@ -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); >> +} >> diff --git a/drivers/staging/tm6000/tm6000.h b/drivers/staging/tm6000/tm6000.h >> index 6812d68..79ef72a 100644 >> --- a/drivers/staging/tm6000/tm6000.h >> +++ b/drivers/staging/tm6000/tm6000.h >> @@ -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 */ >> -- >> 1.7.0.3 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-media" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> >> -- Stefan Ringel <stefan.ringel@arcor.de> [-- Attachment #2: stefan_ringel.vcf --] [-- Type: text/x-vcard, Size: 157 bytes --] begin:vcard fn:Stefan Ringel n:Ringel;Stefan email;internet:stefan.ringel@arcor.de note:web: www.stefanringel.de x-mozilla-html:FALSE version:2.1 end:vcard ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-05-27 15:28 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-05-10 16:22 [PATCH 1/2] tm6000: bugfix tuner callback stefan.ringel 2010-05-10 16:22 ` [PATCH 2/2] tm6000: add extension stefan.ringel 2010-05-27 15:21 ` Bee Hock Goh 2010-05-27 15:27 ` Stefan Ringel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).