Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 173919
b: refs/heads/master
c: 9133aee
h: refs/heads/master
i:
  173917: de1cfd9
  173915: a2bfc66
  173911: d417fc1
  173903: b9d7d73
  173887: 07811ff
v: v3
  • Loading branch information
Michael Krufky authored and Mauro Carvalho Chehab committed Dec 5, 2009
1 parent 48895e9 commit cf97943
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 9 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: dbda8f701abb0e4693a30e9bef4a2301d1c8ea80
refs/heads/master: 9133aee09e3689c116c526fa9011c33b872e65c1
20 changes: 19 additions & 1 deletion trunk/drivers/media/dvb/dvb-core/dvb_frontend.c
Original file line number Diff line number Diff line change
Expand Up @@ -1712,7 +1712,18 @@ static int dvb_frontend_ioctl_legacy(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;
int err = -EOPNOTSUPP;
int cb_err, err = -EOPNOTSUPP;

if (fe->dvb->fe_ioctl_override) {
cb_err = fe->dvb->fe_ioctl_override(fe, cmd, parg,
DVB_FE_IOCTL_PRE);
if (cb_err < 0)
return cb_err;
if (cb_err > 0)
return 0;
/* fe_ioctl_override returning 0 allows
* dvb-core to continue handling the ioctl */
}

switch (cmd) {
case FE_GET_INFO: {
Expand Down Expand Up @@ -1978,6 +1989,13 @@ static int dvb_frontend_ioctl_legacy(struct inode *inode, struct file *file,
break;
};

if (fe->dvb->fe_ioctl_override) {
cb_err = fe->dvb->fe_ioctl_override(fe, cmd, parg,
DVB_FE_IOCTL_POST);
if (cb_err < 0)
return cb_err;
}

return err;
}

Expand Down
28 changes: 28 additions & 0 deletions trunk/drivers/media/dvb/dvb-core/dvbdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@
module_param_array(adapter_nr, short, NULL, 0444); \
MODULE_PARM_DESC(adapter_nr, "DVB adapter numbers")

struct dvb_frontend;

struct dvb_adapter {
int num;
struct list_head list_head;
Expand All @@ -69,6 +71,32 @@ struct dvb_adapter {
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 */

/* Allow the adapter/bridge driver to perform an action before and/or
* after the core handles an ioctl:
*
* DVB_FE_IOCTL_PRE indicates that the ioctl has not yet been handled.
* DVB_FE_IOCTL_POST indicates that the ioctl has been handled.
*
* When DVB_FE_IOCTL_PRE is passed to the callback as the stage arg:
*
* return 0 to allow dvb-core to handle the ioctl.
* return a positive int to prevent dvb-core from handling the ioctl,
* and exit without error.
* return a negative int to prevent dvb-core from handling the ioctl,
* and return that value as an error.
*
* When DVB_FE_IOCTL_POST is passed to the callback as the stage arg:
*
* return 0 to allow the dvb_frontend ioctl handler to exit normally.
* return a negative int to cause the dvb_frontend ioctl handler to
* return that value as an error.
*/
#define DVB_FE_IOCTL_PRE 0
#define DVB_FE_IOCTL_POST 1
int (*fe_ioctl_override)(struct dvb_frontend *fe,
unsigned int cmd, void *parg,
unsigned int stage);
};


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 @@ -904,7 +904,7 @@ static int dvb_register(struct cx23885_tsport *port)

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

/* init CI & MAC */
switch (dev->board) {
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/media/video/cx88/cx88-dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1174,7 +1174,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, mfe_shared);
&dev->pci->dev, adapter_nr, mfe_shared, NULL);

frontend_detach:
core->gate_ctrl = NULL;
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 @@ -1574,7 +1574,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, 0);
&dev->pci->dev, adapter_nr, 0, NULL);

/* this sequence is necessary to make the tda1004x load its firmware
* and to enter analog mode of hybrid boards
Expand Down
11 changes: 8 additions & 3 deletions trunk/drivers/media/video/videobuf-dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,9 @@ static int videobuf_dvb_register_adapter(struct videobuf_dvb_frontends *fe,
struct device *device,
char *adapter_name,
short *adapter_nr,
int mfe_shared)
int mfe_shared,
int (*fe_ioctl_override)(struct dvb_frontend *,
unsigned int, void *, unsigned int))
{
int result;

Expand All @@ -154,6 +156,7 @@ static int videobuf_dvb_register_adapter(struct videobuf_dvb_frontends *fe,
}
fe->adapter.priv = adapter_priv;
fe->adapter.mfe_shared = mfe_shared;
fe->adapter.fe_ioctl_override = fe_ioctl_override;

return result;
}
Expand Down Expand Up @@ -253,7 +256,9 @@ int videobuf_dvb_register_bus(struct videobuf_dvb_frontends *f,
void *adapter_priv,
struct device *device,
short *adapter_nr,
int mfe_shared)
int mfe_shared,
int (*fe_ioctl_override)(struct dvb_frontend *,
unsigned int, void *, unsigned int))
{
struct list_head *list, *q;
struct videobuf_dvb_frontend *fe;
Expand All @@ -267,7 +272,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, mfe_shared);
fe->dvb.name, adapter_nr, mfe_shared, fe_ioctl_override);
if (res < 0) {
printk(KERN_WARNING "videobuf_dvb_register_adapter failed (errno = %d)\n", res);
return res;
Expand Down
4 changes: 3 additions & 1 deletion trunk/include/media/videobuf-dvb.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ int videobuf_dvb_register_bus(struct videobuf_dvb_frontends *f,
void *adapter_priv,
struct device *device,
short *adapter_nr,
int mfe_shared);
int mfe_shared,
int (*fe_ioctl_override)(struct dvb_frontend *,
unsigned int, void *, unsigned int));

void videobuf_dvb_unregister_bus(struct videobuf_dvb_frontends *f);

Expand Down

0 comments on commit cf97943

Please sign in to comment.