V4L/DVB (5510): Fix 1/3 for bug 7819: fixed frontend hotplug issue
fixed frontend hotplug issue Signed-off-by: Michal CIJOML Semler <cijoml@volny.cz> Signed-off-by: Markus Rechberger <markus.rechberger@amd.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
Родитель
31a1854706
Коммит
ca5be9cd05
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
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 {
|
||||||
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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче