Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 115624
b: refs/heads/master
c: 59b1842
h: refs/heads/master
v: v3
  • Loading branch information
Darron Broad authored and Mauro Carvalho Chehab committed Oct 17, 2008
1 parent 5b0a356 commit 4ebeea4
Show file tree
Hide file tree
Showing 9 changed files with 66 additions and 16 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2f3af9e64de44743a860fd1eee966222a7accc54
refs/heads/master: 59b1842da1c6f33ad2e8da82d3dfb3445751d964
43 changes: 42 additions & 1 deletion trunk/drivers/media/dvb/dvb-core/dvb_frontend.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ static int dvb_shutdown_timeout;
static int dvb_force_auto_inversion;
static int dvb_override_tune_delay;
static int dvb_powerdown_on_sleep = 1;
static int dvb_mfe_wait_time = 5;

module_param_named(frontend_debug, dvb_frontend_debug, int, 0644);
MODULE_PARM_DESC(frontend_debug, "Turn on/off frontend core debugging (default:off).");
Expand All @@ -58,6 +59,8 @@ module_param(dvb_override_tune_delay, int, 0644);
MODULE_PARM_DESC(dvb_override_tune_delay, "0: normal (default), >0 => delay in milliseconds to wait for lock after a tune attempt");
module_param(dvb_powerdown_on_sleep, int, 0644);
MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB voltage off on sleep (default)");
module_param(dvb_mfe_wait_time, int, 0644);
MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open() for multi-frontend to become available (default:5 seconds)");

#define dprintk if (dvb_frontend_debug) printk

Expand Down Expand Up @@ -1706,13 +1709,46 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
struct dvb_device *dvbdev = file->private_data;
struct dvb_frontend *fe = dvbdev->priv;
struct dvb_frontend_private *fepriv = fe->frontend_priv;
struct dvb_adapter *adapter = fe->dvb;
struct dvb_device *mfedev;
struct dvb_frontend *mfe;
struct dvb_frontend_private *mfepriv;
int mferetry;
int ret;

dprintk ("%s\n", __func__);

if (adapter->mfe_shared) {
mutex_lock (&adapter->mfe_lock);
if (adapter->mfe_dvbdev != dvbdev) {
if (adapter->mfe_dvbdev) {
mfedev = adapter->mfe_dvbdev;
mfe = mfedev->priv;
mfepriv = mfe->frontend_priv;
mutex_unlock (&adapter->mfe_lock);
mferetry = (dvb_mfe_wait_time << 1);
while (mferetry-- && (mfedev->users != -1 || mfepriv->thread != NULL)) {
if(msleep_interruptible(500)) {
if(signal_pending(current))
return -EINTR;
}
}
mutex_lock (&adapter->mfe_lock);
mfedev = adapter->mfe_dvbdev;
mfe = mfedev->priv;
mfepriv = mfe->frontend_priv;
if (mfedev->users != -1 || mfepriv->thread != NULL) {
ret = -EBUSY;
goto err0;
}
}
adapter->mfe_dvbdev = dvbdev;
}
}

if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
return ret;
goto err0;
}

if ((ret = dvb_generic_open (inode, file)) < 0)
Expand All @@ -1732,13 +1768,18 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
fepriv->events.eventr = fepriv->events.eventw = 0;
}

if (adapter->mfe_shared)
mutex_unlock (&adapter->mfe_lock);
return ret;

err2:
dvb_generic_release(inode, file);
err1:
if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl)
fe->ops.ts_bus_ctrl(fe, 0);
err0:
if (adapter->mfe_shared)
mutex_unlock (&adapter->mfe_lock);
return ret;
}

Expand Down
3 changes: 3 additions & 0 deletions trunk/drivers/media/dvb/dvb-core/dvbdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,9 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
adap->name = name;
adap->module = module;
adap->device = device;
adap->mfe_shared = 0;
adap->mfe_dvbdev = NULL;
mutex_init (&adap->mfe_lock);

list_add_tail (&adap->list_head, &dvb_adapter_list);

Expand Down
4 changes: 4 additions & 0 deletions trunk/drivers/media/dvb/dvb-core/dvbdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ struct dvb_adapter {
struct device *device;

struct module *module;

int mfe_shared; /* indicates mutually exclusive frontends */
struct dvb_device *mfe_dvbdev; /* frontend device in use */
struct mutex mfe_lock; /* access lock for thread creation */
};


Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/media/video/cx23885/cx23885-dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -556,7 +556,7 @@ static int dvb_register(struct cx23885_tsport *port)

/* register everything */
return videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port,
&dev->pci->dev, adapter_nr);
&dev->pci->dev, adapter_nr, 0);

}

Expand Down
11 changes: 4 additions & 7 deletions trunk/drivers/media/video/cx88/cx88-dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -594,14 +594,9 @@ static struct stv0288_config tevii_tuner_earda_config = {

static int dvb_register(struct cx8802_dev *dev)
{
//struct cx88_core *core = dev->core;

///* init struct videobuf_dvb */
//fe->dvb.name = core->name;
//dev->ts_gen_cntrl = 0x0c;

struct cx88_core *core = dev->core;
struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
int mfe_shared = 0; /* bus not shared by default */

/* Get the first frontend */
fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
Expand Down Expand Up @@ -669,6 +664,7 @@ static int dvb_register(struct cx8802_dev *dev)
fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
if (fe1) {
dev->frontends.gate = 2;
mfe_shared = 1;
fe1->dvb.frontend = dvb_attach(cx22702_attach,
&hauppauge_hvr_config,
&dev->core->i2c_adap);
Expand Down Expand Up @@ -1013,6 +1009,7 @@ static int dvb_register(struct cx8802_dev *dev)
fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
if (fe1) {
dev->frontends.gate = 2;
mfe_shared = 1;
fe1->dvb.frontend = dvb_attach(cx22702_attach,
&hauppauge_hvr_config,
&dev->core->i2c_adap);
Expand Down Expand Up @@ -1110,7 +1107,7 @@ static int dvb_register(struct cx8802_dev *dev)

/* register everything */
return videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
&dev->pci->dev, adapter_nr);
&dev->pci->dev, adapter_nr, mfe_shared);

frontend_detach:
if (fe0->dvb.frontend) {
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/media/video/saa7134/saa7134-dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1395,7 +1395,7 @@ static int dvb_init(struct saa7134_dev *dev)

/* register everything else */
ret = videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
&dev->pci->dev, adapter_nr);
&dev->pci->dev, adapter_nr, 0);

/* this sequence is necessary to make the tda1004x load its firmware
* and to enter analog mode of hybrid boards
Expand Down
9 changes: 6 additions & 3 deletions trunk/drivers/media/video/videobuf-dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,8 @@ int videobuf_dvb_register_bus(struct videobuf_dvb_frontends *f,
struct module *module,
void *adapter_priv,
struct device *device,
short *adapter_nr) //NEW
short *adapter_nr,
int mfe_shared)
{
struct list_head *list, *q;
struct videobuf_dvb_frontend *fe;
Expand All @@ -153,7 +154,7 @@ int videobuf_dvb_register_bus(struct videobuf_dvb_frontends *f,
}

/* Bring up the adapter */
res = videobuf_dvb_register_adapter(f, module, adapter_priv, device, fe->dvb.name, adapter_nr); //NEW
res = videobuf_dvb_register_adapter(f, module, adapter_priv, device, fe->dvb.name, adapter_nr, mfe_shared);
if (res < 0) {
printk(KERN_WARNING "videobuf_dvb_register_adapter failed (errno = %d)\n", res);
goto err;
Expand Down Expand Up @@ -181,7 +182,8 @@ int videobuf_dvb_register_adapter(struct videobuf_dvb_frontends *fe,
void *adapter_priv,
struct device *device,
char *adapter_name,
short *adapter_nr) //NEW
short *adapter_nr,
int mfe_shared)
{
int result;

Expand All @@ -194,6 +196,7 @@ int videobuf_dvb_register_adapter(struct videobuf_dvb_frontends *fe,
adapter_name, result);
}
fe->adapter.priv = adapter_priv;
fe->adapter.mfe_shared = mfe_shared;

return result;
}
Expand Down
6 changes: 4 additions & 2 deletions trunk/include/media/videobuf-dvb.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ int videobuf_dvb_register_bus(struct videobuf_dvb_frontends *f,
struct module *module,
void *adapter_priv,
struct device *device,
short *adapter_nr); //NEW
short *adapter_nr,
int mfe_shared);

void videobuf_dvb_unregister_bus(struct videobuf_dvb_frontends *f);

Expand All @@ -52,7 +53,8 @@ int videobuf_dvb_register_adapter(struct videobuf_dvb_frontends *f,
void *adapter_priv,
struct device *device,
char *adapter_name,
short *adapter_nr); //NEW
short *adapter_nr,
int mfe_shared);

int videobuf_dvb_register_frontend(struct dvb_adapter *adapter, struct videobuf_dvb *dvb);

Expand Down

0 comments on commit 4ebeea4

Please sign in to comment.