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

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
...@@ -1056,18 +1056,15 @@ static int dvb_frontend_open(struct inode *inode, struct file *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) {
return ret; if ((ret = fe->ops.ts_bus_ctrl(fe, 1)) < 0)
if (fe->ops.ts_bus_ctrl) {
if ((ret = fe->ops.ts_bus_ctrl (fe, 1)) < 0) {
dvb_generic_release (inode, file);
return ret; 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 */ /* 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) ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment