From 26b9f330d1502370a1a87d4eb1094a458e1c97fb Mon Sep 17 00:00:00 2001 From: Michael Krufky Date: Sun, 3 Feb 2008 23:55:07 -0300 Subject: [PATCH] --- yaml --- r: 92753 b: refs/heads/master c: d8abe97d0063cf77e9bbbee076181e4657c7e09c h: refs/heads/master i: 92751: afdcc26637664161c635df0e345a320ebc38dbb3 v: v3 --- [refs] | 2 +- .../drivers/media/video/pvrusb2/pvrusb2-dvb.c | 44 ++++++++++++++++++- .../drivers/media/video/pvrusb2/pvrusb2-dvb.h | 3 ++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 7f2cc3c87afc..6ee62c910ce8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 99443ae04f7002530f666ba0747f7b1ecafb3002 +refs/heads/master: d8abe97d0063cf77e9bbbee076181e4657c7e09c diff --git a/trunk/drivers/media/video/pvrusb2/pvrusb2-dvb.c b/trunk/drivers/media/video/pvrusb2/pvrusb2-dvb.c index 250462265a41..c85477709e6e 100644 --- a/trunk/drivers/media/video/pvrusb2/pvrusb2-dvb.c +++ b/trunk/drivers/media/video/pvrusb2/pvrusb2-dvb.c @@ -18,6 +18,7 @@ * */ +#include #include "dvbdev.h" #include "pvrusb2-hdw-internal.h" #include "pvrusb2-hdw.h" @@ -25,18 +26,56 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); +static int pvr2_dvb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff) +{ + struct pvr2_dvb_adapter *adap = dvbdmxfeed->demux->priv; + int newfeedcount, ret = 0; + + if (adap == NULL) + return -ENODEV; + + mutex_lock(&adap->lock); + newfeedcount = adap->feedcount + (onoff ? 1 : -1); + + if (newfeedcount == 0) { + printk(KERN_DEBUG "stop feeding\n"); + + ret = kthread_stop(adap->thread); + adap->thread = NULL; + } + + adap->feedcount = newfeedcount; + + if (adap->feedcount == onoff && adap->feedcount > 0) { + if (NULL != adap->thread) + goto fail; + + printk(KERN_DEBUG "start feeding\n"); + + if (IS_ERR(adap->thread)) { + ret = PTR_ERR(adap->thread); + adap->thread = NULL; + } + //ret = newfeedcount; + } +fail: + mutex_unlock(&adap->lock); + + return ret; +} + static int pvr2_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed) { printk(KERN_DEBUG "start pid: 0x%04x, feedtype: %d\n", dvbdmxfeed->pid, dvbdmxfeed->type); - return 0; /* FIXME: pvr2_dvb_ctrl_feed(dvbdmxfeed, 1); */ + return pvr2_dvb_ctrl_feed(dvbdmxfeed, 1); } static int pvr2_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed) { printk(KERN_DEBUG "stop pid: 0x%04x, feedtype: %d\n", dvbdmxfeed->pid, dvbdmxfeed->type); - return 0; /* FIXME: pvr2_dvb_ctrl_feed(dvbdmxfeed, 0); */ + return pvr2_dvb_ctrl_feed(dvbdmxfeed, 0); } static int pvr2_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire) @@ -172,6 +211,7 @@ int pvr2_dvb_init(struct pvr2_context *pvr) int ret = 0; pvr->hdw->dvb.pvr = pvr; + mutex_init(&pvr->hdw->dvb.lock); ret = pvr2_dvb_adapter_init(&pvr->hdw->dvb); if (ret < 0) diff --git a/trunk/drivers/media/video/pvrusb2/pvrusb2-dvb.h b/trunk/drivers/media/video/pvrusb2/pvrusb2-dvb.h index 0aff05cb9415..98728d44a4b6 100644 --- a/trunk/drivers/media/video/pvrusb2/pvrusb2-dvb.h +++ b/trunk/drivers/media/video/pvrusb2/pvrusb2-dvb.h @@ -19,6 +19,9 @@ struct pvr2_dvb_adapter { int feedcount; int max_feed_count; + struct task_struct *thread; + struct mutex lock; + unsigned int digital_up:1; };