1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (C) 2025 Linaro Ltd.
4 */
5
6 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
7
8 #include <linux/auxiliary_bus.h>
9 #include <linux/cleanup.h>
10 #include <linux/device.h>
11 #include <linux/fwnode.h>
12 #include <linux/gpio/consumer.h>
13 #include <linux/gpio/machine.h>
14 #include <linux/idr.h>
15 #include <linux/kref.h>
16 #include <linux/list.h>
17 #include <linux/lockdep.h>
18 #include <linux/module.h>
19 #include <linux/mutex.h>
20 #include <linux/of.h>
21 #include <linux/overflow.h>
22 #include <linux/printk.h>
23 #include <linux/property.h>
24 #include <linux/slab.h>
25 #include <linux/string.h>
26
27 #include "gpiolib.h"
28 #include "gpiolib-shared.h"
29
30 /* Represents a single reference to a GPIO pin. */
31 struct gpio_shared_ref {
32 struct list_head list;
33 /* Firmware node associated with this GPIO's consumer. */
34 struct fwnode_handle *fwnode;
35 /* GPIO flags this consumer uses for the request. */
36 enum gpiod_flags flags;
37 char *con_id;
38 int dev_id;
39 /* Protects the auxiliary device struct and the lookup table. */
40 struct mutex lock;
41 struct lock_class_key lock_key;
42 struct auxiliary_device adev;
43 struct gpiod_lookup_table *lookup;
44 bool is_reset_gpio;
45 };
46
47 /* Represents a single GPIO pin. */
48 struct gpio_shared_entry {
49 struct list_head list;
50 /* Firmware node associated with the GPIO controller. */
51 struct fwnode_handle *fwnode;
52 /* Hardware offset of the GPIO within its chip. */
53 unsigned int offset;
54 /* Index in the property value array. */
55 size_t index;
56 /* Synchronizes the modification of shared_desc. */
57 struct mutex lock;
58 struct gpio_shared_desc *shared_desc;
59 struct kref ref;
60 struct list_head refs;
61 };
62
63 static LIST_HEAD(gpio_shared_list);
64 static DEFINE_IDA(gpio_shared_ida);
65
66 #if IS_ENABLED(CONFIG_OF)
67 static struct gpio_shared_entry *
gpio_shared_find_entry(struct fwnode_handle * controller_node,unsigned int offset)68 gpio_shared_find_entry(struct fwnode_handle *controller_node,
69 unsigned int offset)
70 {
71 struct gpio_shared_entry *entry;
72
73 list_for_each_entry(entry, &gpio_shared_list, list) {
74 if (entry->fwnode == controller_node && entry->offset == offset)
75 return entry;
76 }
77
78 return NULL;
79 }
80
gpio_shared_make_ref(struct fwnode_handle * fwnode,const char * con_id,enum gpiod_flags flags)81 static struct gpio_shared_ref *gpio_shared_make_ref(struct fwnode_handle *fwnode,
82 const char *con_id,
83 enum gpiod_flags flags)
84 {
85 char *con_id_cpy __free(kfree) = NULL;
86
87 struct gpio_shared_ref *ref __free(kfree) = kzalloc_obj(*ref);
88 if (!ref)
89 return NULL;
90
91 if (con_id) {
92 con_id_cpy = kstrdup(con_id, GFP_KERNEL);
93 if (!con_id_cpy)
94 return NULL;
95 }
96
97 ref->dev_id = ida_alloc(&gpio_shared_ida, GFP_KERNEL);
98 if (ref->dev_id < 0)
99 return NULL;
100
101 ref->flags = flags;
102 ref->con_id = no_free_ptr(con_id_cpy);
103 ref->fwnode = fwnode;
104 lockdep_register_key(&ref->lock_key);
105 mutex_init_with_key(&ref->lock, &ref->lock_key);
106
107 return no_free_ptr(ref);
108 }
109
gpio_shared_setup_reset_proxy(struct gpio_shared_entry * entry,enum gpiod_flags flags)110 static int gpio_shared_setup_reset_proxy(struct gpio_shared_entry *entry,
111 enum gpiod_flags flags)
112 {
113 struct gpio_shared_ref *ref;
114
115 list_for_each_entry(ref, &entry->refs, list) {
116 if (ref->is_reset_gpio)
117 /* Already set-up. */
118 return 0;
119 }
120
121 ref = gpio_shared_make_ref(NULL, "reset", flags);
122 if (!ref)
123 return -ENOMEM;
124
125 ref->is_reset_gpio = true;
126
127 list_add_tail(&ref->list, &entry->refs);
128
129 pr_debug("Created a secondary shared GPIO reference for potential reset-gpio device for GPIO %u at %s\n",
130 entry->offset, fwnode_get_name(entry->fwnode));
131
132 return 0;
133 }
134
135 /* Handle all special nodes that we should ignore. */
gpio_shared_of_node_ignore(struct device_node * node)136 static bool gpio_shared_of_node_ignore(struct device_node *node)
137 {
138 /* Ignore disabled devices. */
139 if (!of_device_is_available(node))
140 return true;
141
142 /*
143 * __symbols__ is a special, internal node and should not be considered
144 * when scanning for shared GPIOs.
145 */
146 if (of_node_name_eq(node, "__symbols__"))
147 return true;
148
149 /*
150 * GPIO hogs have a "gpios" property which is not a phandle and can't
151 * possibly refer to a shared GPIO.
152 */
153 if (of_property_present(node, "gpio-hog"))
154 return true;
155
156 return false;
157 }
158
gpio_shared_of_traverse(struct device_node * curr)159 static int gpio_shared_of_traverse(struct device_node *curr)
160 {
161 struct gpio_shared_entry *entry;
162 size_t con_id_len, suffix_len;
163 struct fwnode_handle *fwnode;
164 struct of_phandle_args args;
165 struct gpio_shared_ref *ref;
166 struct property *prop;
167 unsigned int offset;
168 const char *suffix;
169 int ret, count, i;
170
171 if (gpio_shared_of_node_ignore(curr))
172 return 0;
173
174 for_each_property_of_node(curr, prop) {
175 /*
176 * The standard name for a GPIO property is "foo-gpios"
177 * or "foo-gpio". Some bindings also use "gpios" or "gpio".
178 * There are some legacy device-trees which have a different
179 * naming convention and for which we have rename quirks in
180 * place in gpiolib-of.c. I don't think any of them require
181 * support for shared GPIOs so for now let's just ignore
182 * them. We can always just export the quirk list and
183 * iterate over it here.
184 */
185 if (!strends(prop->name, "-gpios") &&
186 !strends(prop->name, "-gpio") &&
187 strcmp(prop->name, "gpios") != 0 &&
188 strcmp(prop->name, "gpio") != 0)
189 continue;
190
191 count = of_count_phandle_with_args(curr, prop->name,
192 "#gpio-cells");
193 if (count <= 0)
194 continue;
195
196 for (i = 0; i < count; i++) {
197 struct device_node *np __free(device_node) = NULL;
198 char *con_id __free(kfree) = NULL;
199
200 ret = of_parse_phandle_with_args(curr, prop->name,
201 "#gpio-cells", i,
202 &args);
203 if (ret)
204 continue;
205
206 np = args.np;
207
208 if (!of_property_present(np, "gpio-controller"))
209 continue;
210
211 /*
212 * We support 1, 2 and 3 cell GPIO bindings in the
213 * kernel currently. There's only one old MIPS dts that
214 * has a one-cell binding but there's no associated
215 * consumer so it may as well be an error. There don't
216 * seem to be any 3-cell users of non-exclusive GPIOs,
217 * so we can skip this as well. Let's occupy ourselves
218 * with the predominant 2-cell binding with the first
219 * cell indicating the hardware offset of the GPIO and
220 * the second defining the GPIO flags of the request.
221 */
222 if (args.args_count != 2)
223 continue;
224
225 fwnode = of_fwnode_handle(args.np);
226 offset = args.args[0];
227
228 entry = gpio_shared_find_entry(fwnode, offset);
229 if (!entry) {
230 entry = kzalloc_obj(*entry);
231 if (!entry)
232 return -ENOMEM;
233
234 entry->fwnode = fwnode_handle_get(fwnode);
235 entry->offset = offset;
236 entry->index = count;
237 INIT_LIST_HEAD(&entry->refs);
238 mutex_init(&entry->lock);
239
240 list_add_tail(&entry->list, &gpio_shared_list);
241 }
242
243 if (strends(prop->name, "gpios"))
244 suffix = "-gpios";
245 else if (strends(prop->name, "gpio"))
246 suffix = "-gpio";
247 else
248 suffix = NULL;
249 if (!suffix)
250 continue;
251
252 /* We only set con_id if there's actually one. */
253 if (strcmp(prop->name, "gpios") && strcmp(prop->name, "gpio")) {
254 con_id = kstrdup(prop->name, GFP_KERNEL);
255 if (!con_id)
256 return -ENOMEM;
257
258 con_id_len = strlen(con_id);
259 suffix_len = strlen(suffix);
260
261 con_id[con_id_len - suffix_len] = '\0';
262 }
263
264 ref = gpio_shared_make_ref(fwnode_handle_get(of_fwnode_handle(curr)),
265 con_id, args.args[1]);
266 if (!ref)
267 return -ENOMEM;
268
269 if (!list_empty(&entry->refs))
270 pr_debug("GPIO %u at %s is shared by multiple firmware nodes\n",
271 entry->offset, fwnode_get_name(entry->fwnode));
272
273 list_add_tail(&ref->list, &entry->refs);
274
275 if (strcmp(prop->name, "reset-gpios") == 0) {
276 ret = gpio_shared_setup_reset_proxy(entry, args.args[1]);
277 if (ret)
278 return ret;
279 }
280 }
281 }
282
283 for_each_child_of_node_scoped(curr, child) {
284 ret = gpio_shared_of_traverse(child);
285 if (ret)
286 return ret;
287 }
288
289 return 0;
290 }
291
gpio_shared_of_scan(void)292 static int gpio_shared_of_scan(void)
293 {
294 if (of_root)
295 return gpio_shared_of_traverse(of_root);
296
297 return 0;
298 }
299 #else
gpio_shared_of_scan(void)300 static int gpio_shared_of_scan(void)
301 {
302 return 0;
303 }
304 #endif /* CONFIG_OF */
305
gpio_shared_adev_release(struct device * dev)306 static void gpio_shared_adev_release(struct device *dev)
307 {
308
309 }
310
gpio_shared_make_adev(struct gpio_device * gdev,struct gpio_shared_entry * entry,struct gpio_shared_ref * ref)311 static int gpio_shared_make_adev(struct gpio_device *gdev,
312 struct gpio_shared_entry *entry,
313 struct gpio_shared_ref *ref)
314 {
315 struct auxiliary_device *adev = &ref->adev;
316 int ret;
317
318 guard(mutex)(&ref->lock);
319
320 memset(adev, 0, sizeof(*adev));
321
322 adev->id = ref->dev_id;
323 adev->name = "proxy";
324 adev->dev.parent = gdev->dev.parent;
325 adev->dev.platform_data = entry;
326 adev->dev.release = gpio_shared_adev_release;
327
328 ret = auxiliary_device_init(adev);
329 if (ret)
330 return ret;
331
332 ret = auxiliary_device_add(adev);
333 if (ret) {
334 auxiliary_device_uninit(adev);
335 return ret;
336 }
337
338 pr_debug("Created an auxiliary GPIO proxy %s for GPIO device %s\n",
339 dev_name(&adev->dev), gpio_device_get_label(gdev));
340
341 return 0;
342 }
343
344 #if IS_ENABLED(CONFIG_RESET_GPIO)
345 /*
346 * Special case: reset-gpio is an auxiliary device that's created dynamically
347 * and put in between the GPIO controller and consumers of shared GPIOs
348 * referred to by the "reset-gpios" property.
349 *
350 * If the supposed consumer of a shared GPIO didn't match any of the mappings
351 * we created when scanning the firmware nodes, it's still possible that it's
352 * the reset-gpio device which didn't exist at the time of the scan.
353 *
354 * This function verifies it an return true if it's the case.
355 */
gpio_shared_dev_is_reset_gpio(struct device * consumer,struct gpio_shared_entry * entry,struct gpio_shared_ref * ref)356 static bool gpio_shared_dev_is_reset_gpio(struct device *consumer,
357 struct gpio_shared_entry *entry,
358 struct gpio_shared_ref *ref)
359 {
360 struct fwnode_handle *reset_fwnode = dev_fwnode(consumer);
361 struct fwnode_reference_args ref_args, aux_args;
362 struct device *parent = consumer->parent;
363 struct gpio_shared_ref *real_ref;
364 bool match;
365 int ret;
366
367 lockdep_assert_held(&ref->lock);
368
369 /* The reset-gpio device must have a parent AND a firmware node. */
370 if (!parent || !reset_fwnode)
371 return false;
372
373 /*
374 * Parent of the reset-gpio auxiliary device is the GPIO chip whose
375 * fwnode we stored in the entry structure.
376 */
377 if (!device_match_fwnode(parent, entry->fwnode))
378 return false;
379
380 /*
381 * Now we need to find the actual pin we want to assign to this
382 * reset-gpio device. To that end: iterate over the list of references
383 * of this entry and see if there's one, whose reset-gpios property's
384 * arguments match the ones from this consumer's node.
385 */
386 list_for_each_entry(real_ref, &entry->refs, list) {
387 if (real_ref == ref)
388 continue;
389
390 guard(mutex)(&real_ref->lock);
391
392 if (!real_ref->fwnode)
393 continue;
394
395 /*
396 * The device associated with the shared reference's firmware
397 * node is the consumer of the reset control exposed by the
398 * reset-gpio device. It must have a "reset-gpios" property
399 * that's referencing the entry's firmware node.
400 *
401 * The reference args must agree between the real consumer and
402 * the auxiliary reset-gpio device.
403 */
404 ret = fwnode_property_get_reference_args(real_ref->fwnode,
405 "reset-gpios",
406 NULL, 2, 0, &ref_args);
407 if (ret)
408 continue;
409
410 ret = fwnode_property_get_reference_args(reset_fwnode, "reset-gpios",
411 NULL, 2, 0, &aux_args);
412 if (ret) {
413 fwnode_handle_put(ref_args.fwnode);
414 continue;
415 }
416
417 match = ((ref_args.fwnode == entry->fwnode) &&
418 (aux_args.fwnode == entry->fwnode) &&
419 (ref_args.args[0] == aux_args.args[0]));
420
421 fwnode_handle_put(ref_args.fwnode);
422 fwnode_handle_put(aux_args.fwnode);
423
424 if (!match)
425 continue;
426
427 /*
428 * Reuse the fwnode of the real device, next time we'll use it
429 * in the normal path.
430 */
431 ref->fwnode = fwnode_handle_get(reset_fwnode);
432 return true;
433 }
434
435 return false;
436 }
437 #else
gpio_shared_dev_is_reset_gpio(struct device * consumer,struct gpio_shared_entry * entry,struct gpio_shared_ref * ref)438 static bool gpio_shared_dev_is_reset_gpio(struct device *consumer,
439 struct gpio_shared_entry *entry,
440 struct gpio_shared_ref *ref)
441 {
442 return false;
443 }
444 #endif /* CONFIG_RESET_GPIO */
445
gpio_shared_add_proxy_lookup(struct device * consumer,struct fwnode_handle * fwnode,const char * con_id,unsigned long lflags)446 int gpio_shared_add_proxy_lookup(struct device *consumer, struct fwnode_handle *fwnode,
447 const char *con_id, unsigned long lflags)
448 {
449 const char *dev_id = dev_name(consumer);
450 struct gpiod_lookup_table *lookup;
451 struct gpio_shared_entry *entry;
452 struct gpio_shared_ref *ref;
453
454 list_for_each_entry(entry, &gpio_shared_list, list) {
455 list_for_each_entry(ref, &entry->refs, list) {
456 guard(mutex)(&ref->lock);
457
458 if (!ref->fwnode && device_is_compatible(consumer, "reset-gpio")) {
459 if (!gpio_shared_dev_is_reset_gpio(consumer, entry, ref))
460 continue;
461 } else if (fwnode != ref->fwnode) {
462 continue;
463 }
464
465 if ((!con_id && ref->con_id) || (con_id && !ref->con_id) ||
466 (con_id && ref->con_id && strcmp(con_id, ref->con_id) != 0))
467 continue;
468
469 /* We've already done that on a previous request. */
470 if (ref->lookup)
471 return 0;
472
473 char *key __free(kfree) =
474 kasprintf(GFP_KERNEL,
475 KBUILD_MODNAME ".proxy.%u",
476 ref->adev.id);
477 if (!key)
478 return -ENOMEM;
479
480 lookup = kzalloc_flex(*lookup, table, 2);
481 if (!lookup)
482 return -ENOMEM;
483
484 pr_debug("Adding machine lookup entry for a shared GPIO for consumer %s, with key '%s' and con_id '%s'\n",
485 dev_id, key, ref->con_id ?: "none");
486
487 lookup->dev_id = dev_id;
488 lookup->table[0] = GPIO_LOOKUP(no_free_ptr(key), 0,
489 ref->con_id, lflags);
490
491 ref->lookup = lookup;
492 gpiod_add_lookup_table(ref->lookup);
493
494 return 0;
495 }
496 }
497
498 /* We warn here because this can only happen if the programmer borked. */
499 WARN_ON(1);
500 return -ENOENT;
501 }
502
gpio_shared_remove_adev(struct auxiliary_device * adev)503 static void gpio_shared_remove_adev(struct auxiliary_device *adev)
504 {
505 auxiliary_device_delete(adev);
506 auxiliary_device_uninit(adev);
507 }
508
gpiochip_setup_shared(struct gpio_chip * gc)509 int gpiochip_setup_shared(struct gpio_chip *gc)
510 {
511 struct gpio_device *gdev = gc->gpiodev;
512 struct gpio_shared_entry *entry;
513 struct gpio_shared_ref *ref;
514 struct gpio_desc *desc;
515 int ret;
516
517 list_for_each_entry(entry, &gpio_shared_list, list) {
518 list_for_each_entry(ref, &entry->refs, list) {
519 if (gdev->dev.parent == &ref->adev.dev) {
520 /*
521 * This is a shared GPIO proxy. Mark its
522 * descriptor as such and return here.
523 */
524 __set_bit(GPIOD_FLAG_SHARED_PROXY,
525 &gdev->descs[0].flags);
526 return 0;
527 }
528 }
529 }
530
531 /*
532 * This is not a shared GPIO proxy but it still may be the device
533 * exposing shared pins. Find them and create the proxy devices.
534 */
535 list_for_each_entry(entry, &gpio_shared_list, list) {
536 if (!device_match_fwnode(&gdev->dev, entry->fwnode))
537 continue;
538
539 if (list_count_nodes(&entry->refs) <= 1)
540 continue;
541
542 scoped_guard(mutex, &entry->lock) {
543 #if IS_ENABLED(CONFIG_OF)
544 if (is_of_node(entry->fwnode) && gc->of_xlate) {
545 /*
546 * This is the earliest that we can tranlate the
547 * devicetree offset to the chip offset.
548 */
549 struct of_phandle_args gpiospec = { };
550
551 gpiospec.np = to_of_node(entry->fwnode);
552 gpiospec.args_count = 2;
553 gpiospec.args[0] = entry->offset;
554
555 ret = gc->of_xlate(gc, &gpiospec, NULL);
556 if (ret < 0)
557 return ret;
558
559 entry->offset = ret;
560 }
561 #endif /* CONFIG_OF */
562
563 desc = &gdev->descs[entry->offset];
564
565 __set_bit(GPIOD_FLAG_SHARED, &desc->flags);
566 /*
567 * Shared GPIOs are not requested via the normal path. Make
568 * them inaccessible to anyone even before we register the
569 * chip.
570 */
571 ret = gpiod_request_commit(desc, "shared");
572 if (ret)
573 return ret;
574
575 pr_debug("GPIO %u owned by %s is shared by multiple consumers\n",
576 entry->offset, gpio_device_get_label(gdev));
577 }
578
579 list_for_each_entry(ref, &entry->refs, list) {
580 pr_debug("Setting up a shared GPIO entry for %s (con_id: '%s')\n",
581 fwnode_get_name(ref->fwnode) ?: "(no fwnode)",
582 ref->con_id ?: "(none)");
583
584 ret = gpio_shared_make_adev(gdev, entry, ref);
585 if (ret) {
586 gpiod_free_commit(desc);
587 return ret;
588 }
589 }
590 }
591
592 return 0;
593 }
594
gpio_device_teardown_shared(struct gpio_device * gdev)595 void gpio_device_teardown_shared(struct gpio_device *gdev)
596 {
597 struct gpio_shared_entry *entry;
598 struct gpio_shared_ref *ref;
599
600 list_for_each_entry(entry, &gpio_shared_list, list) {
601 guard(mutex)(&entry->lock);
602
603 if (!device_match_fwnode(&gdev->dev, entry->fwnode))
604 continue;
605
606 gpiod_free_commit(&gdev->descs[entry->offset]);
607
608 list_for_each_entry(ref, &entry->refs, list) {
609 guard(mutex)(&ref->lock);
610
611 if (ref->lookup) {
612 gpiod_remove_lookup_table(ref->lookup);
613 kfree(ref->lookup->table[0].key);
614 kfree(ref->lookup);
615 ref->lookup = NULL;
616 }
617
618 gpio_shared_remove_adev(&ref->adev);
619 }
620 }
621 }
622
gpio_shared_release(struct kref * kref)623 static void gpio_shared_release(struct kref *kref)
624 {
625 struct gpio_shared_entry *entry =
626 container_of(kref, struct gpio_shared_entry, ref);
627 struct gpio_shared_desc *shared_desc;
628
629 guard(mutex)(&entry->lock);
630
631 shared_desc = entry->shared_desc;
632 gpio_device_put(shared_desc->desc->gdev);
633 if (shared_desc->can_sleep)
634 mutex_destroy(&shared_desc->mutex);
635 kfree(shared_desc);
636 entry->shared_desc = NULL;
637 }
638
gpiod_shared_put(void * data)639 static void gpiod_shared_put(void *data)
640 {
641 struct gpio_shared_entry *entry = data;
642
643 kref_put(&entry->ref, gpio_shared_release);
644 }
645
646 static struct gpio_shared_desc *
gpiod_shared_desc_create(struct gpio_shared_entry * entry)647 gpiod_shared_desc_create(struct gpio_shared_entry *entry)
648 {
649 struct gpio_shared_desc *shared_desc;
650 struct gpio_device *gdev;
651
652 lockdep_assert_held(&entry->lock);
653
654 shared_desc = kzalloc_obj(*shared_desc);
655 if (!shared_desc)
656 return ERR_PTR(-ENOMEM);
657
658 gdev = gpio_device_find_by_fwnode(entry->fwnode);
659 if (!gdev) {
660 kfree(shared_desc);
661 return ERR_PTR(-EPROBE_DEFER);
662 }
663
664 shared_desc->desc = &gdev->descs[entry->offset];
665 shared_desc->can_sleep = gpiod_cansleep(shared_desc->desc);
666 if (shared_desc->can_sleep)
667 mutex_init(&shared_desc->mutex);
668 else
669 spin_lock_init(&shared_desc->spinlock);
670
671 return shared_desc;
672 }
673
devm_gpiod_shared_get(struct device * dev)674 struct gpio_shared_desc *devm_gpiod_shared_get(struct device *dev)
675 {
676 struct gpio_shared_desc *shared_desc;
677 struct gpio_shared_entry *entry;
678 int ret;
679
680 entry = dev_get_platdata(dev);
681 if (WARN_ON(!entry))
682 /* Programmer bug */
683 return ERR_PTR(-ENOENT);
684
685 scoped_guard(mutex, &entry->lock) {
686 if (entry->shared_desc) {
687 kref_get(&entry->ref);
688 shared_desc = entry->shared_desc;
689 } else {
690 shared_desc = gpiod_shared_desc_create(entry);
691 if (IS_ERR(shared_desc))
692 return ERR_CAST(shared_desc);
693
694 kref_init(&entry->ref);
695 entry->shared_desc = shared_desc;
696 }
697
698 pr_debug("Device %s acquired a reference to the shared GPIO %u owned by %s\n",
699 dev_name(dev), gpiod_hwgpio(shared_desc->desc),
700 gpio_device_get_label(shared_desc->desc->gdev));
701 }
702
703 ret = devm_add_action_or_reset(dev, gpiod_shared_put, entry);
704 if (ret)
705 return ERR_PTR(ret);
706
707 return shared_desc;
708 }
709 EXPORT_SYMBOL_GPL(devm_gpiod_shared_get);
710
gpio_shared_drop_ref(struct gpio_shared_ref * ref)711 static void gpio_shared_drop_ref(struct gpio_shared_ref *ref)
712 {
713 list_del(&ref->list);
714 mutex_destroy(&ref->lock);
715 lockdep_unregister_key(&ref->lock_key);
716 kfree(ref->con_id);
717 ida_free(&gpio_shared_ida, ref->dev_id);
718 fwnode_handle_put(ref->fwnode);
719 kfree(ref);
720 }
721
gpio_shared_drop_entry(struct gpio_shared_entry * entry)722 static void gpio_shared_drop_entry(struct gpio_shared_entry *entry)
723 {
724 list_del(&entry->list);
725 mutex_destroy(&entry->lock);
726 fwnode_handle_put(entry->fwnode);
727 kfree(entry);
728 }
729
730 /*
731 * This is only called if gpio_shared_init() fails so it's in fact __init and
732 * not __exit.
733 */
gpio_shared_teardown(void)734 static void __init gpio_shared_teardown(void)
735 {
736 struct gpio_shared_entry *entry, *epos;
737 struct gpio_shared_ref *ref, *rpos;
738
739 list_for_each_entry_safe(entry, epos, &gpio_shared_list, list) {
740 list_for_each_entry_safe(ref, rpos, &entry->refs, list)
741 gpio_shared_drop_ref(ref);
742
743 gpio_shared_drop_entry(entry);
744 }
745 }
746
gpio_shared_entry_is_really_shared(struct gpio_shared_entry * entry)747 static bool gpio_shared_entry_is_really_shared(struct gpio_shared_entry *entry)
748 {
749 size_t num_nodes = list_count_nodes(&entry->refs);
750 struct gpio_shared_ref *ref;
751
752 if (num_nodes <= 1)
753 return false;
754
755 if (num_nodes > 2)
756 return true;
757
758 /* Exactly two references: */
759 list_for_each_entry(ref, &entry->refs, list) {
760 /*
761 * Corner-case: the second reference comes from the potential
762 * reset-gpio instance. However, this pin is not really shared
763 * as it would have three references in this case. Avoid
764 * creating unnecessary proxies.
765 */
766 if (ref->is_reset_gpio)
767 return false;
768 }
769
770 return true;
771 }
772
gpio_shared_free_exclusive(void)773 static void gpio_shared_free_exclusive(void)
774 {
775 struct gpio_shared_entry *entry, *epos;
776 struct gpio_shared_ref *ref, *rpos;
777
778 list_for_each_entry_safe(entry, epos, &gpio_shared_list, list) {
779 if (gpio_shared_entry_is_really_shared(entry))
780 continue;
781
782 list_for_each_entry_safe(ref, rpos, &entry->refs, list)
783 gpio_shared_drop_ref(ref);
784 gpio_shared_drop_entry(entry);
785 }
786 }
787
gpio_shared_init(void)788 static int __init gpio_shared_init(void)
789 {
790 int ret;
791
792 /* Right now, we only support OF-based systems. */
793 ret = gpio_shared_of_scan();
794 if (ret) {
795 gpio_shared_teardown();
796 pr_err("Failed to scan OF nodes for shared GPIOs: %d\n", ret);
797 return ret;
798 }
799
800 gpio_shared_free_exclusive();
801
802 pr_debug("Finished scanning firmware nodes for shared GPIOs\n");
803 return 0;
804 }
805 postcore_initcall(gpio_shared_init);
806