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: Oliver Endriss <o.endriss@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
Oliver Endriss 2007-08-25 12:00:23 -03:00 committed by Mauro Carvalho Chehab
parent 226835d7e0
commit 48136e1e93

View file

@ -1056,18 +1056,15 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
dprintk ("%s\n", __FUNCTION__); 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; return ret;
}
if (fe->ops.ts_bus_ctrl) { if ((ret = dvb_generic_open (inode, file)) < 0)
if ((ret = fe->ops.ts_bus_ctrl (fe, 1)) < 0) { goto err1;
dvb_generic_release (inode, file);
return ret;
}
}
if ((file->f_flags & O_ACCMODE) != O_RDONLY) { if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
/* normal tune mode when opened R/W */ /* normal tune mode when opened R/W */
fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
fepriv->tone = -1; fepriv->tone = -1;
@ -1075,13 +1072,20 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
ret = dvb_frontend_start (fe); ret = dvb_frontend_start (fe);
if (ret) if (ret)
dvb_generic_release (inode, file); goto err2;
/* empty event queue */ /* empty event queue */
fepriv->events.eventr = fepriv->events.eventw = 0; fepriv->events.eventr = fepriv->events.eventw = 0;
} }
return ret; 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) 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) if ((file->f_flags & O_ACCMODE) != O_RDONLY)
fepriv->release_jiffies = jiffies; fepriv->release_jiffies = jiffies;
if (fe->ops.ts_bus_ctrl)
fe->ops.ts_bus_ctrl (fe, 0);
ret = dvb_generic_release (inode, file); 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); fops_put(file->f_op);
file->f_op = NULL; file->f_op = NULL;
wake_up(&dvbdev->wait_queue); wake_up(&dvbdev->wait_queue);
} }
if (fe->ops.ts_bus_ctrl)
fe->ops.ts_bus_ctrl(fe, 0);
}
return ret; return ret;
} }