summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb/bt8xx
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/dvb/bt8xx')
-rw-r--r--linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c36
-rw-r--r--linux/drivers/media/dvb/bt8xx/dvb-bt8xx.h4
2 files changed, 20 insertions, 20 deletions
diff --git a/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c
index 94925f90c..b239065df 100644
--- a/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c
+++ b/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c
@@ -68,20 +68,21 @@ static int dvb_bt8xx_start_feed(struct dvb_demux_feed *dvbdmxfeed)
{
struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
struct dvb_bt8xx_card *card = dvbdmx->priv;
+ int rc;
dprintk("dvb_bt8xx: start_feed\n");
if (!dvbdmx->dmx.frontend)
return -EINVAL;
- if (card->active)
- return 0;
-
- card->active = 1;
-
-// bt878_start(card->bt, card->gpio_mode);
-
- return 0;
+ down(&card->lock);
+ card->nfeeds++;
+ rc = card->nfeeds;
+ if (card->nfeeds == 1)
+ bt878_start(card->bt, card->gpio_mode,
+ card->op_sync_orin, card->irq_err_ignore);
+ up(&card->lock);
+ return rc;
}
static int dvb_bt8xx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
@@ -93,13 +94,12 @@ static int dvb_bt8xx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
if (!dvbdmx->dmx.frontend)
return -EINVAL;
-
- if (!card->active)
- return 0;
-
-// bt878_stop(card->bt);
- card->active = 0;
+ down(&card->lock);
+ card->nfeeds--;
+ if (card->nfeeds == 0)
+ bt878_stop(card->bt);
+ up(&card->lock);
return 0;
}
@@ -207,8 +207,6 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card)
tasklet_init(&card->bt->tasklet, dvb_bt8xx_task, (unsigned long) card);
- bt878_start(card->bt, card->gpio_mode, card->op_sync_orin, card->irq_err_ignore);
-
return 0;
}
@@ -223,6 +221,7 @@ static int dvb_bt8xx_probe(struct device *dev)
return -ENOMEM;
memset(card, 0, sizeof(*card));
+ init_MUTEX(&card->lock);
card->bttv_nr = sub->core->nr;
strncpy(card->card_name, sub->core->name, sizeof(sub->core->name));
card->i2c_adapter = &sub->core->i2c_adap;
@@ -230,6 +229,8 @@ static int dvb_bt8xx_probe(struct device *dev)
switch(sub->core->type)
{
case BTTV_PINNACLESAT:
+#ifdef BTTV_DVICO_DVBT_LITE
+ case BTTV_DVICO_DVBT_LITE:
card->gpio_mode = 0x0400C060;
card->op_sync_orin = 0;
card->irq_err_ignore = 0;
@@ -237,7 +238,7 @@ static int dvb_bt8xx_probe(struct device *dev)
* A_PWRDN DA_DPM DA_SBR DA_IOM_DA
* DA_APP(parallel) */
break;
-
+#endif
case BTTV_NEBULA_DIGITV:
case BTTV_AVDVBT_761:
card->gpio_mode = (1 << 26) | (1 << 14) | (1 << 5);
@@ -321,7 +322,6 @@ static int dvb_bt8xx_remove(struct device *dev)
dvb_dmx_release(&card->demux);
dvb_unregister_adapter(card->dvb_adapter);
- list_del(&card->list);
kfree(card);
return 0;
diff --git a/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.h b/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.h
index e83fdcd9f..a7f2408a0 100644
--- a/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.h
+++ b/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.h
@@ -28,8 +28,8 @@
#include "bttv.h"
struct dvb_bt8xx_card {
- struct list_head list;
- u8 active;
+ struct semaphore lock;
+ int nfeeds;
char card_name[32];
struct dvb_adapter *dvb_adapter;
struct bt878 *bt;