Commit ca5be9cd authored by Markus Rechberger's avatar Markus Rechberger Committed by Mauro Carvalho Chehab

V4L/DVB (5510): Fix 1/3 for bug 7819: fixed frontend hotplug issue

fixed frontend hotplug issue
Signed-off-by: default avatarMichal CIJOML Semler <cijoml@volny.cz>
Signed-off-by: default avatarMarkus Rechberger <markus.rechberger@amd.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 31a18547
...@@ -606,6 +606,11 @@ static void dvb_frontend_stop(struct dvb_frontend *fe) ...@@ -606,6 +606,11 @@ static void dvb_frontend_stop(struct dvb_frontend *fe)
return; return;
kthread_stop(fepriv->thread); kthread_stop(fepriv->thread);
if (fepriv->dvbdev->users < -1)
wait_event_interruptible(fepriv->dvbdev->wait_queue,
fepriv->dvbdev->users==-1);
init_MUTEX (&fepriv->sem); init_MUTEX (&fepriv->sem);
fepriv->state = FESTATE_IDLE; fepriv->state = FESTATE_IDLE;
...@@ -1023,6 +1028,7 @@ static int dvb_frontend_release(struct inode *inode, struct file *file) ...@@ -1023,6 +1028,7 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
struct dvb_device *dvbdev = file->private_data; struct dvb_device *dvbdev = file->private_data;
struct dvb_frontend *fe = dvbdev->priv; struct dvb_frontend *fe = dvbdev->priv;
struct dvb_frontend_private *fepriv = fe->frontend_priv; struct dvb_frontend_private *fepriv = fe->frontend_priv;
int ret;
dprintk ("%s\n", __FUNCTION__); dprintk ("%s\n", __FUNCTION__);
...@@ -1032,7 +1038,14 @@ static int dvb_frontend_release(struct inode *inode, struct file *file) ...@@ -1032,7 +1038,14 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
if (fe->ops.ts_bus_ctrl) if (fe->ops.ts_bus_ctrl)
fe->ops.ts_bus_ctrl (fe, 0); fe->ops.ts_bus_ctrl (fe, 0);
return dvb_generic_release (inode, file); ret = dvb_generic_release (inode, file);
if (dvbdev->users==-1 && fepriv->exit==1) {
fops_put(file->f_op);
file->f_op = NULL;
wake_up_interruptible (&dvbdev->wait_queue);
}
return ret;
} }
static struct file_operations dvb_frontend_fops = { static struct file_operations dvb_frontend_fops = {
...@@ -1091,9 +1104,9 @@ int dvb_unregister_frontend(struct dvb_frontend* fe) ...@@ -1091,9 +1104,9 @@ int dvb_unregister_frontend(struct dvb_frontend* fe)
struct dvb_frontend_private *fepriv = fe->frontend_priv; struct dvb_frontend_private *fepriv = fe->frontend_priv;
dprintk ("%s\n", __FUNCTION__); dprintk ("%s\n", __FUNCTION__);
dvb_frontend_stop (fe);
mutex_lock(&frontend_mutex); mutex_lock(&frontend_mutex);
dvb_unregister_device (fepriv->dvbdev); dvb_unregister_device (fepriv->dvbdev);
dvb_frontend_stop (fe);
/* fe is invalid now */ /* fe is invalid now */
kfree(fepriv); kfree(fepriv);
......
...@@ -233,6 +233,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, ...@@ -233,6 +233,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
dvbdev->adapter = adap; dvbdev->adapter = adap;
dvbdev->priv = priv; dvbdev->priv = priv;
dvbdev->fops = dvbdevfops; dvbdev->fops = dvbdevfops;
init_waitqueue_head (&dvbdev->wait_queue);
memcpy(dvbdev->fops, template->fops, sizeof(struct file_operations)); memcpy(dvbdev->fops, template->fops, sizeof(struct file_operations));
dvbdev->fops->owner = adap->module; dvbdev->fops->owner = adap->module;
......
...@@ -69,6 +69,7 @@ struct dvb_device { ...@@ -69,6 +69,7 @@ struct dvb_device {
int writers; int writers;
int users; int users;
wait_queue_head_t wait_queue;
/* don't really need those !? -- FIXME: use video_usercopy */ /* don't really need those !? -- FIXME: use video_usercopy */
int (*kernel_ioctl)(struct inode *inode, struct file *file, int (*kernel_ioctl)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg); unsigned int cmd, void *arg);
......
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