diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-async.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-async.c | 30 | 
1 files changed, 15 insertions, 15 deletions
diff --git a/drivers/media/v4l2-core/v4l2-async.c b/drivers/media/v4l2-core/v4l2-async.c index 3ec323bd528b..222f01665f7c 100644 --- a/drivers/media/v4l2-core/v4l2-async.c +++ b/drivers/media/v4l2-core/v4l2-async.c @@ -316,9 +316,8 @@ v4l2_async_nf_try_all_subdevs(struct v4l2_async_notifier *notifier);  static int v4l2_async_create_ancillary_links(struct v4l2_async_notifier *n,  					     struct v4l2_subdev *sd)  { -	struct media_link *link = NULL; -  #if IS_ENABLED(CONFIG_MEDIA_CONTROLLER) +	struct media_link *link;  	if (sd->entity.function != MEDIA_ENT_F_LENS &&  	    sd->entity.function != MEDIA_ENT_F_FLASH) @@ -326,9 +325,10 @@ static int v4l2_async_create_ancillary_links(struct v4l2_async_notifier *n,  	link = media_create_ancillary_link(&n->sd->entity, &sd->entity); -#endif -  	return IS_ERR(link) ? PTR_ERR(link) : 0; +#else +	return 0; +#endif  }  static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier, @@ -341,7 +341,7 @@ static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,  	int ret;  	if (list_empty(&sd->asc_list)) { -		ret = v4l2_device_register_subdev(v4l2_dev, sd); +		ret = __v4l2_device_register_subdev(v4l2_dev, sd, sd->owner);  		if (ret < 0)  			return ret;  		registered = true; @@ -563,6 +563,7 @@ void v4l2_async_nf_init(struct v4l2_async_notifier *notifier,  {  	INIT_LIST_HEAD(¬ifier->waiting_list);  	INIT_LIST_HEAD(¬ifier->done_list); +	INIT_LIST_HEAD(¬ifier->notifier_entry);  	notifier->v4l2_dev = v4l2_dev;  }  EXPORT_SYMBOL(v4l2_async_nf_init); @@ -572,6 +573,7 @@ void v4l2_async_subdev_nf_init(struct v4l2_async_notifier *notifier,  {  	INIT_LIST_HEAD(¬ifier->waiting_list);  	INIT_LIST_HEAD(¬ifier->done_list); +	INIT_LIST_HEAD(¬ifier->notifier_entry);  	notifier->sd = sd;  }  EXPORT_SYMBOL_GPL(v4l2_async_subdev_nf_init); @@ -618,16 +620,10 @@ err_unlock:  int v4l2_async_nf_register(struct v4l2_async_notifier *notifier)  { -	int ret; -  	if (WARN_ON(!notifier->v4l2_dev == !notifier->sd))  		return -EINVAL; -	ret = __v4l2_async_nf_register(notifier); -	if (ret) -		notifier->v4l2_dev = NULL; - -	return ret; +	return __v4l2_async_nf_register(notifier);  }  EXPORT_SYMBOL(v4l2_async_nf_register); @@ -639,7 +635,7 @@ __v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier)  	v4l2_async_nf_unbind_all_subdevs(notifier); -	list_del(¬ifier->notifier_entry); +	list_del_init(¬ifier->notifier_entry);  }  void v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier) @@ -787,7 +783,7 @@ v4l2_async_connection_unique(struct v4l2_subdev *sd)  }  EXPORT_SYMBOL_GPL(v4l2_async_connection_unique); -int v4l2_async_register_subdev(struct v4l2_subdev *sd) +int __v4l2_async_register_subdev(struct v4l2_subdev *sd, struct module *module)  {  	struct v4l2_async_notifier *subdev_notifier;  	struct v4l2_async_notifier *notifier; @@ -811,6 +807,8 @@ int v4l2_async_register_subdev(struct v4l2_subdev *sd)  		return -EINVAL;  	} +	sd->owner = module; +  	mutex_lock(&list_lock);  	list_for_each_entry(notifier, ¬ifier_list, notifier_entry) { @@ -853,9 +851,11 @@ err_unbind:  	mutex_unlock(&list_lock); +	sd->owner = NULL; +  	return ret;  } -EXPORT_SYMBOL(v4l2_async_register_subdev); +EXPORT_SYMBOL(__v4l2_async_register_subdev);  void v4l2_async_unregister_subdev(struct v4l2_subdev *sd)  {  |