Lines Matching full:ref

59 	struct kref ref;  member
87 struct gpio_shared_ref *ref __free(kfree) = kzalloc_obj(*ref); in gpio_shared_make_ref()
88 if (!ref) in gpio_shared_make_ref()
97 ref->dev_id = ida_alloc(&gpio_shared_ida, GFP_KERNEL); in gpio_shared_make_ref()
98 if (ref->dev_id < 0) in gpio_shared_make_ref()
101 ref->flags = flags; in gpio_shared_make_ref()
102 ref->con_id = no_free_ptr(con_id_cpy); in gpio_shared_make_ref()
103 ref->fwnode = fwnode; in gpio_shared_make_ref()
104 lockdep_register_key(&ref->lock_key); in gpio_shared_make_ref()
105 mutex_init_with_key(&ref->lock, &ref->lock_key); in gpio_shared_make_ref()
107 return no_free_ptr(ref); in gpio_shared_make_ref()
113 struct gpio_shared_ref *ref; in gpio_shared_setup_reset_proxy() local
115 list_for_each_entry(ref, &entry->refs, list) { in gpio_shared_setup_reset_proxy()
116 if (ref->is_reset_gpio) in gpio_shared_setup_reset_proxy()
121 ref = gpio_shared_make_ref(NULL, "reset", flags); in gpio_shared_setup_reset_proxy()
122 if (!ref) in gpio_shared_setup_reset_proxy()
125 ref->is_reset_gpio = true; in gpio_shared_setup_reset_proxy()
127 list_add_tail(&ref->list, &entry->refs); in gpio_shared_setup_reset_proxy()
165 struct gpio_shared_ref *ref; in gpio_shared_of_traverse() local
264 ref = gpio_shared_make_ref(fwnode_handle_get(of_fwnode_handle(curr)), in gpio_shared_of_traverse()
266 if (!ref) in gpio_shared_of_traverse()
273 list_add_tail(&ref->list, &entry->refs); in gpio_shared_of_traverse()
313 struct gpio_shared_ref *ref) in gpio_shared_make_adev() argument
315 struct auxiliary_device *adev = &ref->adev; in gpio_shared_make_adev()
318 guard(mutex)(&ref->lock); in gpio_shared_make_adev()
322 adev->id = ref->dev_id; in gpio_shared_make_adev()
358 struct gpio_shared_ref *ref) in gpio_shared_dev_is_reset_gpio() argument
367 lockdep_assert_held(&ref->lock); in gpio_shared_dev_is_reset_gpio()
387 if (real_ref == ref) in gpio_shared_dev_is_reset_gpio()
431 ref->fwnode = fwnode_handle_get(reset_fwnode); in gpio_shared_dev_is_reset_gpio()
440 struct gpio_shared_ref *ref) in gpio_shared_dev_is_reset_gpio() argument
452 struct gpio_shared_ref *ref; in gpio_shared_add_proxy_lookup() local
455 list_for_each_entry(ref, &entry->refs, list) { in gpio_shared_add_proxy_lookup()
456 guard(mutex)(&ref->lock); in gpio_shared_add_proxy_lookup()
458 if (!ref->fwnode && device_is_compatible(consumer, "reset-gpio")) { in gpio_shared_add_proxy_lookup()
459 if (!gpio_shared_dev_is_reset_gpio(consumer, entry, ref)) in gpio_shared_add_proxy_lookup()
461 } else if (!device_match_fwnode(consumer, ref->fwnode)) { in gpio_shared_add_proxy_lookup()
465 if ((!con_id && ref->con_id) || (con_id && !ref->con_id) || in gpio_shared_add_proxy_lookup()
466 (con_id && ref->con_id && strcmp(con_id, ref->con_id) != 0)) in gpio_shared_add_proxy_lookup()
470 if (ref->lookup) in gpio_shared_add_proxy_lookup()
476 ref->adev.id); in gpio_shared_add_proxy_lookup()
485 dev_id, key, ref->con_id ?: "none"); in gpio_shared_add_proxy_lookup()
489 ref->con_id, lflags); in gpio_shared_add_proxy_lookup()
491 ref->lookup = lookup; in gpio_shared_add_proxy_lookup()
492 gpiod_add_lookup_table(ref->lookup); in gpio_shared_add_proxy_lookup()
512 struct gpio_shared_ref *ref; in gpio_device_setup_shared() local
517 list_for_each_entry(ref, &entry->refs, list) { in gpio_device_setup_shared()
518 if (gdev->dev.parent == &ref->adev.dev) { in gpio_device_setup_shared()
556 list_for_each_entry(ref, &entry->refs, list) { in gpio_device_setup_shared()
558 fwnode_get_name(ref->fwnode) ?: "(no fwnode)", in gpio_device_setup_shared()
559 ref->con_id ?: "(none)"); in gpio_device_setup_shared()
561 ret = gpio_shared_make_adev(gdev, entry, ref); in gpio_device_setup_shared()
575 struct gpio_shared_ref *ref; in gpio_device_teardown_shared() local
583 list_for_each_entry(ref, &entry->refs, list) { in gpio_device_teardown_shared()
584 guard(mutex)(&ref->lock); in gpio_device_teardown_shared()
586 if (ref->lookup) { in gpio_device_teardown_shared()
587 gpiod_remove_lookup_table(ref->lookup); in gpio_device_teardown_shared()
588 kfree(ref->lookup->table[0].key); in gpio_device_teardown_shared()
589 kfree(ref->lookup); in gpio_device_teardown_shared()
590 ref->lookup = NULL; in gpio_device_teardown_shared()
593 gpio_shared_remove_adev(&ref->adev); in gpio_device_teardown_shared()
601 container_of(kref, struct gpio_shared_entry, ref); in gpio_shared_release()
618 kref_put(&entry->ref, gpio_shared_release); in gpiod_shared_put()
662 kref_get(&entry->ref); in devm_gpiod_shared_get()
669 kref_init(&entry->ref); in devm_gpiod_shared_get()
686 static void gpio_shared_drop_ref(struct gpio_shared_ref *ref) in gpio_shared_drop_ref() argument
688 list_del(&ref->list); in gpio_shared_drop_ref()
689 mutex_destroy(&ref->lock); in gpio_shared_drop_ref()
690 lockdep_unregister_key(&ref->lock_key); in gpio_shared_drop_ref()
691 kfree(ref->con_id); in gpio_shared_drop_ref()
692 ida_free(&gpio_shared_ida, ref->dev_id); in gpio_shared_drop_ref()
693 fwnode_handle_put(ref->fwnode); in gpio_shared_drop_ref()
694 kfree(ref); in gpio_shared_drop_ref()
712 struct gpio_shared_ref *ref, *rpos; in gpio_shared_teardown() local
715 list_for_each_entry_safe(ref, rpos, &entry->refs, list) in gpio_shared_teardown()
716 gpio_shared_drop_ref(ref); in gpio_shared_teardown()
725 struct gpio_shared_ref *ref; in gpio_shared_entry_is_really_shared() local
734 list_for_each_entry(ref, &entry->refs, list) { in gpio_shared_entry_is_really_shared()
741 if (ref->is_reset_gpio) in gpio_shared_entry_is_really_shared()