diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-async.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-async.c | 13 | 
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index d7e9ffc7aa23..b16b5f4cb91e 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -416,7 +416,8 @@ static void v4l2_async_cleanup(struct v4l2_subdev *sd)  /* Unbind all sub-devices in the notifier tree. */  static void -v4l2_async_nf_unbind_all_subdevs(struct v4l2_async_notifier *notifier) +v4l2_async_nf_unbind_all_subdevs(struct v4l2_async_notifier *notifier, +				 bool readd)  {  	struct v4l2_subdev *sd, *tmp; @@ -425,9 +426,11 @@ v4l2_async_nf_unbind_all_subdevs(struct v4l2_async_notifier *notifier)  			v4l2_async_find_subdev_notifier(sd);  		if (subdev_notifier) -			v4l2_async_nf_unbind_all_subdevs(subdev_notifier); +			v4l2_async_nf_unbind_all_subdevs(subdev_notifier, true);  		v4l2_async_nf_call_unbind(notifier, sd, sd->asd); +		if (readd) +			list_add_tail(&sd->asd->list, ¬ifier->waiting);  		v4l2_async_cleanup(sd);  		list_move(&sd->async_list, &subdev_list); @@ -559,7 +562,7 @@ err_unbind:  	/*  	 * On failure, unbind all sub-devices registered through this notifier.  	 */ -	v4l2_async_nf_unbind_all_subdevs(notifier); +	v4l2_async_nf_unbind_all_subdevs(notifier, false);  err_unlock:  	mutex_unlock(&list_lock); @@ -609,7 +612,7 @@ __v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier)  	if (!notifier || (!notifier->v4l2_dev && !notifier->sd))  		return; -	v4l2_async_nf_unbind_all_subdevs(notifier); +	v4l2_async_nf_unbind_all_subdevs(notifier, false);  	notifier->sd = NULL;  	notifier->v4l2_dev = NULL; @@ -807,7 +810,7 @@ err_unbind:  	 */  	subdev_notifier = v4l2_async_find_subdev_notifier(sd);  	if (subdev_notifier) -		v4l2_async_nf_unbind_all_subdevs(subdev_notifier); +		v4l2_async_nf_unbind_all_subdevs(subdev_notifier, false);  	if (sd->asd)  		v4l2_async_nf_call_unbind(notifier, sd, sd->asd);  |