Lines Matching full:ref
59 struct kref ref; member
87 struct gpio_shared_ref *ref __free(kfree) = kzalloc(sizeof(*ref), GFP_KERNEL); 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()
463 if (!ref->fwnode && strstarts(dev_name(consumer), "reset.gpio.")) { in gpio_shared_add_proxy_lookup()
464 if (!gpio_shared_dev_is_reset_gpio(consumer, entry, ref)) in gpio_shared_add_proxy_lookup()
466 } else if (!device_match_fwnode(consumer, ref->fwnode)) { in gpio_shared_add_proxy_lookup()
470 if ((!con_id && ref->con_id) || (con_id && !ref->con_id) || in gpio_shared_add_proxy_lookup()
471 (con_id && ref->con_id && strcmp(con_id, ref->con_id) != 0)) in gpio_shared_add_proxy_lookup()
475 if (ref->lookup) in gpio_shared_add_proxy_lookup()
481 ref->adev.id); in gpio_shared_add_proxy_lookup()
490 dev_id, key, ref->con_id ?: "none"); in gpio_shared_add_proxy_lookup()
494 ref->con_id, lflags); in gpio_shared_add_proxy_lookup()
496 ref->lookup = lookup; in gpio_shared_add_proxy_lookup()
497 gpiod_add_lookup_table(ref->lookup); in gpio_shared_add_proxy_lookup()
517 struct gpio_shared_ref *ref; in gpio_device_setup_shared() local
522 list_for_each_entry(ref, &entry->refs, list) { in gpio_device_setup_shared()
523 if (gdev->dev.parent == &ref->adev.dev) { in gpio_device_setup_shared()
561 list_for_each_entry(ref, &entry->refs, list) { in gpio_device_setup_shared()
563 fwnode_get_name(ref->fwnode) ?: "(no fwnode)", in gpio_device_setup_shared()
564 ref->con_id ?: "(none)"); in gpio_device_setup_shared()
566 ret = gpio_shared_make_adev(gdev, entry, ref); in gpio_device_setup_shared()
580 struct gpio_shared_ref *ref; in gpio_device_teardown_shared() local
588 list_for_each_entry(ref, &entry->refs, list) { in gpio_device_teardown_shared()
589 guard(mutex)(&ref->lock); in gpio_device_teardown_shared()
591 if (ref->lookup) { in gpio_device_teardown_shared()
592 gpiod_remove_lookup_table(ref->lookup); in gpio_device_teardown_shared()
593 kfree(ref->lookup->table[0].key); in gpio_device_teardown_shared()
594 kfree(ref->lookup); in gpio_device_teardown_shared()
595 ref->lookup = NULL; in gpio_device_teardown_shared()
598 gpio_shared_remove_adev(&ref->adev); in gpio_device_teardown_shared()
606 container_of(kref, struct gpio_shared_entry, ref); in gpio_shared_release()
623 kref_put(&entry->ref, gpio_shared_release); in gpiod_shared_put()
667 kref_get(&entry->ref); in devm_gpiod_shared_get()
674 kref_init(&entry->ref); in devm_gpiod_shared_get()
691 static void gpio_shared_drop_ref(struct gpio_shared_ref *ref) in gpio_shared_drop_ref() argument
693 list_del(&ref->list); in gpio_shared_drop_ref()
694 mutex_destroy(&ref->lock); in gpio_shared_drop_ref()
695 lockdep_unregister_key(&ref->lock_key); in gpio_shared_drop_ref()
696 kfree(ref->con_id); in gpio_shared_drop_ref()
697 ida_free(&gpio_shared_ida, ref->dev_id); in gpio_shared_drop_ref()
698 fwnode_handle_put(ref->fwnode); in gpio_shared_drop_ref()
699 kfree(ref); in gpio_shared_drop_ref()
717 struct gpio_shared_ref *ref, *rpos; in gpio_shared_teardown() local
720 list_for_each_entry_safe(ref, rpos, &entry->refs, list) in gpio_shared_teardown()
721 gpio_shared_drop_ref(ref); in gpio_shared_teardown()
730 struct gpio_shared_ref *ref; in gpio_shared_entry_is_really_shared() local
739 list_for_each_entry(ref, &entry->refs, list) { in gpio_shared_entry_is_really_shared()
746 if (ref->is_reset_gpio) in gpio_shared_entry_is_really_shared()