Lines Matching refs:notifier
55 static bool match_i2c(struct v4l2_async_notifier *notifier, in match_i2c() argument
69 static bool match_fwnode(struct v4l2_async_notifier *notifier, in match_fwnode() argument
130 dev = notifier->v4l2_dev ? notifier->v4l2_dev->dev in match_fwnode()
131 : notifier->sd->dev; in match_fwnode()
151 v4l2_async_find_match(struct v4l2_async_notifier *notifier, in v4l2_async_find_match() argument
154 bool (*match)(struct v4l2_async_notifier *notifier, in v4l2_async_find_match()
158 list_for_each_entry(asd, ¬ifier->waiting, list) { in v4l2_async_find_match()
174 if (match(notifier, sd, asd)) in v4l2_async_find_match()
218 v4l2_async_notifier_find_v4l2_dev(struct v4l2_async_notifier *notifier) in v4l2_async_notifier_find_v4l2_dev() argument
220 while (notifier->parent) in v4l2_async_notifier_find_v4l2_dev()
221 notifier = notifier->parent; in v4l2_async_notifier_find_v4l2_dev()
223 return notifier->v4l2_dev; in v4l2_async_notifier_find_v4l2_dev()
230 v4l2_async_notifier_can_complete(struct v4l2_async_notifier *notifier) in v4l2_async_notifier_can_complete() argument
234 if (!list_empty(¬ifier->waiting)) in v4l2_async_notifier_can_complete()
237 list_for_each_entry(sd, ¬ifier->done, async_list) { in v4l2_async_notifier_can_complete()
254 v4l2_async_notifier_try_complete(struct v4l2_async_notifier *notifier) in v4l2_async_notifier_try_complete() argument
257 if (!list_empty(¬ifier->waiting)) in v4l2_async_notifier_try_complete()
261 while (notifier->parent) in v4l2_async_notifier_try_complete()
262 notifier = notifier->parent; in v4l2_async_notifier_try_complete()
265 if (!notifier->v4l2_dev) in v4l2_async_notifier_try_complete()
269 if (!v4l2_async_notifier_can_complete(notifier)) in v4l2_async_notifier_try_complete()
272 return v4l2_async_notifier_call_complete(notifier); in v4l2_async_notifier_try_complete()
276 v4l2_async_notifier_try_all_subdevs(struct v4l2_async_notifier *notifier);
278 static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier, in v4l2_async_match_notify() argument
290 ret = v4l2_async_notifier_call_bound(notifier, sd, asd); in v4l2_async_match_notify()
299 sd->notifier = notifier; in v4l2_async_match_notify()
302 list_move(&sd->async_list, ¬ifier->done); in v4l2_async_match_notify()
316 subdev_notifier->parent = notifier; in v4l2_async_match_notify()
323 v4l2_async_notifier_try_all_subdevs(struct v4l2_async_notifier *notifier) in v4l2_async_notifier_try_all_subdevs() argument
326 v4l2_async_notifier_find_v4l2_dev(notifier); in v4l2_async_notifier_try_all_subdevs()
337 asd = v4l2_async_find_match(notifier, sd); in v4l2_async_notifier_try_all_subdevs()
341 ret = v4l2_async_match_notify(notifier, v4l2_dev, sd, asd); in v4l2_async_notifier_try_all_subdevs()
370 v4l2_async_notifier_unbind_all_subdevs(struct v4l2_async_notifier *notifier) in v4l2_async_notifier_unbind_all_subdevs() argument
374 list_for_each_entry_safe(sd, tmp, ¬ifier->done, async_list) { in v4l2_async_notifier_unbind_all_subdevs()
381 v4l2_async_notifier_call_unbind(notifier, sd, sd->asd); in v4l2_async_notifier_unbind_all_subdevs()
387 notifier->parent = NULL; in v4l2_async_notifier_unbind_all_subdevs()
392 __v4l2_async_notifier_has_async_subdev(struct v4l2_async_notifier *notifier, in __v4l2_async_notifier_has_async_subdev() argument
398 list_for_each_entry(asd_y, ¬ifier->waiting, list) in __v4l2_async_notifier_has_async_subdev()
402 list_for_each_entry(sd, ¬ifier->done, async_list) { in __v4l2_async_notifier_has_async_subdev()
419 v4l2_async_notifier_has_async_subdev(struct v4l2_async_notifier *notifier, in v4l2_async_notifier_has_async_subdev() argument
429 list_for_each_entry(asd_y, ¬ifier->asd_list, asd_list) { in v4l2_async_notifier_has_async_subdev()
437 list_for_each_entry(notifier, ¬ifier_list, list) in v4l2_async_notifier_has_async_subdev()
438 if (__v4l2_async_notifier_has_async_subdev(notifier, asd)) in v4l2_async_notifier_has_async_subdev()
444 static int v4l2_async_notifier_asd_valid(struct v4l2_async_notifier *notifier, in v4l2_async_notifier_asd_valid() argument
449 notifier->v4l2_dev ? notifier->v4l2_dev->dev : NULL; in v4l2_async_notifier_asd_valid()
457 if (v4l2_async_notifier_has_async_subdev(notifier, asd, in v4l2_async_notifier_asd_valid()
472 void v4l2_async_notifier_init(struct v4l2_async_notifier *notifier) in v4l2_async_notifier_init() argument
474 INIT_LIST_HEAD(¬ifier->asd_list); in v4l2_async_notifier_init()
478 static int __v4l2_async_notifier_register(struct v4l2_async_notifier *notifier) in __v4l2_async_notifier_register() argument
483 INIT_LIST_HEAD(¬ifier->waiting); in __v4l2_async_notifier_register()
484 INIT_LIST_HEAD(¬ifier->done); in __v4l2_async_notifier_register()
488 list_for_each_entry(asd, ¬ifier->asd_list, asd_list) { in __v4l2_async_notifier_register()
489 ret = v4l2_async_notifier_asd_valid(notifier, asd, i++); in __v4l2_async_notifier_register()
493 list_add_tail(&asd->list, ¬ifier->waiting); in __v4l2_async_notifier_register()
496 ret = v4l2_async_notifier_try_all_subdevs(notifier); in __v4l2_async_notifier_register()
500 ret = v4l2_async_notifier_try_complete(notifier); in __v4l2_async_notifier_register()
505 list_add(¬ifier->list, ¬ifier_list); in __v4l2_async_notifier_register()
515 v4l2_async_notifier_unbind_all_subdevs(notifier); in __v4l2_async_notifier_register()
524 struct v4l2_async_notifier *notifier) in v4l2_async_notifier_register() argument
528 if (WARN_ON(!v4l2_dev || notifier->sd)) in v4l2_async_notifier_register()
531 notifier->v4l2_dev = v4l2_dev; in v4l2_async_notifier_register()
533 ret = __v4l2_async_notifier_register(notifier); in v4l2_async_notifier_register()
535 notifier->v4l2_dev = NULL; in v4l2_async_notifier_register()
542 struct v4l2_async_notifier *notifier) in v4l2_async_subdev_notifier_register() argument
546 if (WARN_ON(!sd || notifier->v4l2_dev)) in v4l2_async_subdev_notifier_register()
549 notifier->sd = sd; in v4l2_async_subdev_notifier_register()
551 ret = __v4l2_async_notifier_register(notifier); in v4l2_async_subdev_notifier_register()
553 notifier->sd = NULL; in v4l2_async_subdev_notifier_register()
560 __v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier) in __v4l2_async_notifier_unregister() argument
562 if (!notifier || (!notifier->v4l2_dev && !notifier->sd)) in __v4l2_async_notifier_unregister()
565 v4l2_async_notifier_unbind_all_subdevs(notifier); in __v4l2_async_notifier_unregister()
567 notifier->sd = NULL; in __v4l2_async_notifier_unregister()
568 notifier->v4l2_dev = NULL; in __v4l2_async_notifier_unregister()
570 list_del(¬ifier->list); in __v4l2_async_notifier_unregister()
573 void v4l2_async_notifier_unregister(struct v4l2_async_notifier *notifier) in v4l2_async_notifier_unregister() argument
577 __v4l2_async_notifier_unregister(notifier); in v4l2_async_notifier_unregister()
583 static void __v4l2_async_notifier_cleanup(struct v4l2_async_notifier *notifier) in __v4l2_async_notifier_cleanup() argument
587 if (!notifier || !notifier->asd_list.next) in __v4l2_async_notifier_cleanup()
590 list_for_each_entry_safe(asd, tmp, ¬ifier->asd_list, asd_list) { in __v4l2_async_notifier_cleanup()
604 void v4l2_async_notifier_cleanup(struct v4l2_async_notifier *notifier) in v4l2_async_notifier_cleanup() argument
608 __v4l2_async_notifier_cleanup(notifier); in v4l2_async_notifier_cleanup()
614 int __v4l2_async_notifier_add_subdev(struct v4l2_async_notifier *notifier, in __v4l2_async_notifier_add_subdev() argument
621 ret = v4l2_async_notifier_asd_valid(notifier, asd, -1); in __v4l2_async_notifier_add_subdev()
625 list_add_tail(&asd->asd_list, ¬ifier->asd_list); in __v4l2_async_notifier_add_subdev()
634 __v4l2_async_notifier_add_fwnode_subdev(struct v4l2_async_notifier *notifier, in __v4l2_async_notifier_add_fwnode_subdev() argument
648 ret = __v4l2_async_notifier_add_subdev(notifier, asd); in __v4l2_async_notifier_add_fwnode_subdev()
683 __v4l2_async_notifier_add_i2c_subdev(struct v4l2_async_notifier *notifier, in __v4l2_async_notifier_add_i2c_subdev() argument
698 ret = __v4l2_async_notifier_add_subdev(notifier, asd); in __v4l2_async_notifier_add_i2c_subdev()
711 struct v4l2_async_notifier *notifier; in v4l2_async_register_subdev() local
726 list_for_each_entry(notifier, ¬ifier_list, list) { in v4l2_async_register_subdev()
728 v4l2_async_notifier_find_v4l2_dev(notifier); in v4l2_async_register_subdev()
734 asd = v4l2_async_find_match(notifier, sd); in v4l2_async_register_subdev()
738 ret = v4l2_async_match_notify(notifier, v4l2_dev, sd, asd); in v4l2_async_register_subdev()
742 ret = v4l2_async_notifier_try_complete(notifier); in v4l2_async_register_subdev()
767 v4l2_async_notifier_call_unbind(notifier, sd, sd->asd); in v4l2_async_register_subdev()
789 struct v4l2_async_notifier *notifier = sd->notifier; in v4l2_async_unregister_subdev() local
791 list_add(&sd->asd->list, ¬ifier->waiting); in v4l2_async_unregister_subdev()
793 v4l2_async_notifier_call_unbind(notifier, sd, sd->asd); in v4l2_async_unregister_subdev()
828 v4l2_async_notifier_name(struct v4l2_async_notifier *notifier) in v4l2_async_notifier_name() argument
830 if (notifier->v4l2_dev) in v4l2_async_notifier_name()
831 return notifier->v4l2_dev->name; in v4l2_async_notifier_name()
832 else if (notifier->sd) in v4l2_async_notifier_name()
833 return notifier->sd->name; in v4l2_async_notifier_name()