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

Commit 48136e1e authored by Oliver Endriss's avatar Oliver Endriss Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (6105): dvb_frontend: ts_bus_ctrl() handling fixed



ts_bus_ctrl() should only be called by
- the first open
- the last release call.

Signed-off-by: default avatarOliver Endriss <o.endriss@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 226835d7
Loading
Loading
Loading
Loading
+22 −16
Original line number Diff line number Diff line
@@ -1056,18 +1056,15 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)

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

	if ((ret = dvb_generic_open (inode, file)) < 0)
	if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
		if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
			return ret;

	if (fe->ops.ts_bus_ctrl) {
		if ((ret = fe->ops.ts_bus_ctrl (fe, 1)) < 0) {
			dvb_generic_release (inode, file);
			return ret;
		}
	}

	if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
	if ((ret = dvb_generic_open (inode, file)) < 0)
		goto err1;

	if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
		/* normal tune mode when opened R/W */
		fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
		fepriv->tone = -1;
@@ -1075,13 +1072,20 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)

		ret = dvb_frontend_start (fe);
		if (ret)
			dvb_generic_release (inode, file);
			goto err2;

		/*  empty event queue */
		fepriv->events.eventr = fepriv->events.eventw = 0;
	}

	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);
	return ret;
}

static int dvb_frontend_release(struct inode *inode, struct file *file)
@@ -1096,16 +1100,18 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
	if ((file->f_flags & O_ACCMODE) != O_RDONLY)
		fepriv->release_jiffies = jiffies;

	if (fe->ops.ts_bus_ctrl)
		fe->ops.ts_bus_ctrl (fe, 0);

	ret = dvb_generic_release (inode, file);

	if (dvbdev->users==-1 && fepriv->exit==1) {
	if (dvbdev->users == -1) {
		if (fepriv->exit == 1) {
			fops_put(file->f_op);
			file->f_op = NULL;
			wake_up(&dvbdev->wait_queue);
		}
		if (fe->ops.ts_bus_ctrl)
			fe->ops.ts_bus_ctrl(fe, 0);
	}

	return ret;
}