Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9133aee0 authored by Michael Krufky's avatar Michael Krufky Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (13103): create a standard method for dvb adapter drivers to override frontend ioctls

parent dbda8f70
Loading
Loading
Loading
Loading
+19 −1
Original line number Diff line number Diff line
@@ -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: {
@@ -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;
}

+28 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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);
};


+1 −1
Original line number Diff line number Diff line
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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
Loading