Skip to content

Commit

Permalink
V4L/DVB (6105): dvb_frontend: ts_bus_ctrl() handling fixed
Browse files Browse the repository at this point in the history
ts_bus_ctrl() should only be called by
- the first open
- the last release call.

Signed-off-by: Oliver Endriss <o.endriss@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
  • Loading branch information
Oliver Endriss authored and Mauro Carvalho Chehab committed Oct 10, 2007
1 parent 226835d commit 48136e1
Showing 1 changed file with 22 additions and 16 deletions.
38 changes: 22 additions & 16 deletions drivers/media/dvb/dvb-core/dvb_frontend.c
Original file line number Diff line number Diff line change
Expand Up @@ -1056,32 +1056,36 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)

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

if ((ret = dvb_generic_open (inode, file)) < 0)
return ret;

if (fe->ops.ts_bus_ctrl) {
if ((ret = fe->ops.ts_bus_ctrl (fe, 1)) < 0) {
dvb_generic_release (inode, file);
if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) {
if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
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;
fepriv->voltage = -1;

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)
Expand All @@ -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) {
fops_put(file->f_op);
file->f_op = NULL;
wake_up(&dvbdev->wait_queue);
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;
}

Expand Down

0 comments on commit 48136e1

Please sign in to comment.