xref: /linux/drivers/gpio/gpiolib-shared.c (revision c31f4aa8fed048fa70e742c4bb49bb48dc489ab3)
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 auxiliary_device adev;
42 	struct gpiod_lookup_table *lookup;
43 };
44 
45 /* Represents a single GPIO pin. */
46 struct gpio_shared_entry {
47 	struct list_head list;
48 	/* Firmware node associated with the GPIO controller. */
49 	struct fwnode_handle *fwnode;
50 	/* Hardware offset of the GPIO within its chip. */
51 	unsigned int offset;
52 	/* Index in the property value array. */
53 	size_t index;
54 	/* Synchronizes the modification of shared_desc. */
55 	struct mutex lock;
56 	struct gpio_shared_desc *shared_desc;
57 	struct kref ref;
58 	struct list_head refs;
59 };
60 
61 static LIST_HEAD(gpio_shared_list);
62 static DEFINE_IDA(gpio_shared_ida);
63 
64 #if IS_ENABLED(CONFIG_OF)
65 static struct gpio_shared_entry *
66 gpio_shared_find_entry(struct fwnode_handle *controller_node,
67 		       unsigned int offset)
68 {
69 	struct gpio_shared_entry *entry;
70 
71 	list_for_each_entry(entry, &gpio_shared_list, list) {
72 		if (entry->fwnode == controller_node && entry->offset == offset)
73 			return entry;
74 	}
75 
76 	return NULL;
77 }
78 
79 /* Handle all special nodes that we should ignore. */
80 static bool gpio_shared_of_node_ignore(struct device_node *node)
81 {
82 	/* Ignore disabled devices. */
83 	if (!of_device_is_available(node))
84 		return true;
85 
86 	/*
87 	 * __symbols__ is a special, internal node and should not be considered
88 	 * when scanning for shared GPIOs.
89 	 */
90 	if (of_node_name_eq(node, "__symbols__"))
91 		return true;
92 
93 	/*
94 	 * GPIO hogs have a "gpios" property which is not a phandle and can't
95 	 * possibly refer to a shared GPIO.
96 	 */
97 	if (of_property_present(node, "gpio-hog"))
98 		return true;
99 
100 	return false;
101 }
102 
103 static int gpio_shared_of_traverse(struct device_node *curr)
104 {
105 	struct gpio_shared_entry *entry;
106 	size_t con_id_len, suffix_len;
107 	struct fwnode_handle *fwnode;
108 	struct of_phandle_args args;
109 	struct property *prop;
110 	unsigned int offset;
111 	const char *suffix;
112 	int ret, count, i;
113 
114 	if (gpio_shared_of_node_ignore(curr))
115 		return 0;
116 
117 	for_each_property_of_node(curr, prop) {
118 		/*
119 		 * The standard name for a GPIO property is "foo-gpios"
120 		 * or "foo-gpio". Some bindings also use "gpios" or "gpio".
121 		 * There are some legacy device-trees which have a different
122 		 * naming convention and for which we have rename quirks in
123 		 * place in gpiolib-of.c. I don't think any of them require
124 		 * support for shared GPIOs so for now let's just ignore
125 		 * them. We can always just export the quirk list and
126 		 * iterate over it here.
127 		 */
128 		if (!strends(prop->name, "-gpios") &&
129 		    !strends(prop->name, "-gpio") &&
130 		    strcmp(prop->name, "gpios") != 0 &&
131 		    strcmp(prop->name, "gpio") != 0)
132 			continue;
133 
134 		count = of_count_phandle_with_args(curr, prop->name,
135 						   "#gpio-cells");
136 		if (count <= 0)
137 			continue;
138 
139 		for (i = 0; i < count; i++) {
140 			struct device_node *np __free(device_node) = NULL;
141 
142 			ret = of_parse_phandle_with_args(curr, prop->name,
143 							 "#gpio-cells", i,
144 							 &args);
145 			if (ret)
146 				continue;
147 
148 			np = args.np;
149 
150 			if (!of_property_present(np, "gpio-controller"))
151 				continue;
152 
153 			/*
154 			 * We support 1, 2 and 3 cell GPIO bindings in the
155 			 * kernel currently. There's only one old MIPS dts that
156 			 * has a one-cell binding but there's no associated
157 			 * consumer so it may as well be an error. There don't
158 			 * seem to be any 3-cell users of non-exclusive GPIOs,
159 			 * so we can skip this as well. Let's occupy ourselves
160 			 * with the predominant 2-cell binding with the first
161 			 * cell indicating the hardware offset of the GPIO and
162 			 * the second defining the GPIO flags of the request.
163 			 */
164 			if (args.args_count != 2)
165 				continue;
166 
167 			fwnode = of_fwnode_handle(args.np);
168 			offset = args.args[0];
169 
170 			entry = gpio_shared_find_entry(fwnode, offset);
171 			if (!entry) {
172 				entry = kzalloc(sizeof(*entry), GFP_KERNEL);
173 				if (!entry)
174 					return -ENOMEM;
175 
176 				entry->fwnode = fwnode_handle_get(fwnode);
177 				entry->offset = offset;
178 				entry->index = count;
179 				INIT_LIST_HEAD(&entry->refs);
180 				mutex_init(&entry->lock);
181 
182 				list_add_tail(&entry->list, &gpio_shared_list);
183 			}
184 
185 			struct gpio_shared_ref *ref __free(kfree) =
186 					kzalloc(sizeof(*ref), GFP_KERNEL);
187 			if (!ref)
188 				return -ENOMEM;
189 
190 			ref->fwnode = fwnode_handle_get(of_fwnode_handle(curr));
191 			ref->flags = args.args[1];
192 			mutex_init(&ref->lock);
193 
194 			if (strends(prop->name, "gpios"))
195 				suffix = "-gpios";
196 			else if (strends(prop->name, "gpio"))
197 				suffix = "-gpio";
198 			else
199 				suffix = NULL;
200 			if (!suffix)
201 				continue;
202 
203 			/* We only set con_id if there's actually one. */
204 			if (strcmp(prop->name, "gpios") && strcmp(prop->name, "gpio")) {
205 				ref->con_id = kstrdup(prop->name, GFP_KERNEL);
206 				if (!ref->con_id)
207 					return -ENOMEM;
208 
209 				con_id_len = strlen(ref->con_id);
210 				suffix_len = strlen(suffix);
211 
212 				ref->con_id[con_id_len - suffix_len] = '\0';
213 			}
214 
215 			ref->dev_id = ida_alloc(&gpio_shared_ida, GFP_KERNEL);
216 			if (ref->dev_id < 0) {
217 				kfree(ref->con_id);
218 				return -ENOMEM;
219 			}
220 
221 			if (!list_empty(&entry->refs))
222 				pr_debug("GPIO %u at %s is shared by multiple firmware nodes\n",
223 					 entry->offset, fwnode_get_name(entry->fwnode));
224 
225 			list_add_tail(&no_free_ptr(ref)->list, &entry->refs);
226 		}
227 	}
228 
229 	for_each_child_of_node_scoped(curr, child) {
230 		ret = gpio_shared_of_traverse(child);
231 		if (ret)
232 			return ret;
233 	}
234 
235 	return 0;
236 }
237 
238 static int gpio_shared_of_scan(void)
239 {
240 	if (of_root)
241 		return gpio_shared_of_traverse(of_root);
242 
243 	return 0;
244 }
245 #else
246 static int gpio_shared_of_scan(void)
247 {
248 	return 0;
249 }
250 #endif /* CONFIG_OF */
251 
252 static void gpio_shared_adev_release(struct device *dev)
253 {
254 
255 }
256 
257 static int gpio_shared_make_adev(struct gpio_device *gdev,
258 				 struct gpio_shared_entry *entry,
259 				 struct gpio_shared_ref *ref)
260 {
261 	struct auxiliary_device *adev = &ref->adev;
262 	int ret;
263 
264 	guard(mutex)(&ref->lock);
265 
266 	memset(adev, 0, sizeof(*adev));
267 
268 	adev->id = ref->dev_id;
269 	adev->name = "proxy";
270 	adev->dev.parent = gdev->dev.parent;
271 	adev->dev.platform_data = entry;
272 	adev->dev.release = gpio_shared_adev_release;
273 
274 	ret = auxiliary_device_init(adev);
275 	if (ret)
276 		return ret;
277 
278 	ret = auxiliary_device_add(adev);
279 	if (ret) {
280 		auxiliary_device_uninit(adev);
281 		return ret;
282 	}
283 
284 	pr_debug("Created an auxiliary GPIO proxy %s for GPIO device %s\n",
285 		 dev_name(&adev->dev), gpio_device_get_label(gdev));
286 
287 	return 0;
288 }
289 
290 #if IS_ENABLED(CONFIG_RESET_GPIO)
291 /*
292  * Special case: reset-gpio is an auxiliary device that's created dynamically
293  * and put in between the GPIO controller and consumers of shared GPIOs
294  * referred to by the "reset-gpios" property.
295  *
296  * If the supposed consumer of a shared GPIO didn't match any of the mappings
297  * we created when scanning the firmware nodes, it's still possible that it's
298  * the reset-gpio device which didn't exist at the time of the scan.
299  *
300  * This function verifies it an return true if it's the case.
301  */
302 static bool gpio_shared_dev_is_reset_gpio(struct device *consumer,
303 					  struct gpio_shared_entry *entry,
304 					  struct gpio_shared_ref *ref)
305 {
306 	struct fwnode_handle *reset_fwnode = dev_fwnode(consumer);
307 	struct fwnode_reference_args ref_args, aux_args;
308 	struct device *parent = consumer->parent;
309 	bool match;
310 	int ret;
311 
312 	/* The reset-gpio device must have a parent AND a firmware node. */
313 	if (!parent || !reset_fwnode)
314 		return false;
315 
316 	/*
317 	 * FIXME: use device_is_compatible() once the reset-gpio drivers gains
318 	 * a compatible string which it currently does not have.
319 	 */
320 	if (!strstarts(dev_name(consumer), "reset.gpio."))
321 		return false;
322 
323 	/*
324 	 * Parent of the reset-gpio auxiliary device is the GPIO chip whose
325 	 * fwnode we stored in the entry structure.
326 	 */
327 	if (!device_match_fwnode(parent, entry->fwnode))
328 		return false;
329 
330 	/*
331 	 * The device associated with the shared reference's firmware node is
332 	 * the consumer of the reset control exposed by the reset-gpio device.
333 	 * It must have a "reset-gpios" property that's referencing the entry's
334 	 * firmware node.
335 	 *
336 	 * The reference args must agree between the real consumer and the
337 	 * auxiliary reset-gpio device.
338 	 */
339 	ret = fwnode_property_get_reference_args(ref->fwnode, "reset-gpios",
340 						 NULL, 2, 0, &ref_args);
341 	if (ret)
342 		return false;
343 
344 	ret = fwnode_property_get_reference_args(reset_fwnode, "reset-gpios",
345 						 NULL, 2, 0, &aux_args);
346 	if (ret) {
347 		fwnode_handle_put(ref_args.fwnode);
348 		return false;
349 	}
350 
351 	match = ((ref_args.fwnode == entry->fwnode) &&
352 		 (aux_args.fwnode == entry->fwnode) &&
353 		 (ref_args.args[0] == aux_args.args[0]));
354 
355 	fwnode_handle_put(ref_args.fwnode);
356 	fwnode_handle_put(aux_args.fwnode);
357 	return match;
358 }
359 #else
360 static bool gpio_shared_dev_is_reset_gpio(struct device *consumer,
361 					  struct gpio_shared_entry *entry,
362 					  struct gpio_shared_ref *ref)
363 {
364 	return false;
365 }
366 #endif /* CONFIG_RESET_GPIO */
367 
368 int gpio_shared_add_proxy_lookup(struct device *consumer, unsigned long lflags)
369 {
370 	const char *dev_id = dev_name(consumer);
371 	struct gpio_shared_entry *entry;
372 	struct gpio_shared_ref *ref;
373 
374 	struct gpiod_lookup_table *lookup __free(kfree) =
375 			kzalloc(struct_size(lookup, table, 2), GFP_KERNEL);
376 	if (!lookup)
377 		return -ENOMEM;
378 
379 	list_for_each_entry(entry, &gpio_shared_list, list) {
380 		list_for_each_entry(ref, &entry->refs, list) {
381 			if (!device_match_fwnode(consumer, ref->fwnode) &&
382 			    !gpio_shared_dev_is_reset_gpio(consumer, entry, ref))
383 				continue;
384 
385 			guard(mutex)(&ref->lock);
386 
387 			/* We've already done that on a previous request. */
388 			if (ref->lookup)
389 				return 0;
390 
391 			char *key __free(kfree) =
392 				kasprintf(GFP_KERNEL,
393 					  KBUILD_MODNAME ".proxy.%u",
394 					  ref->adev.id);
395 			if (!key)
396 				return -ENOMEM;
397 
398 			pr_debug("Adding machine lookup entry for a shared GPIO for consumer %s, with key '%s' and con_id '%s'\n",
399 				 dev_id, key, ref->con_id ?: "none");
400 
401 			lookup->dev_id = dev_id;
402 			lookup->table[0] = GPIO_LOOKUP(no_free_ptr(key), 0,
403 						       ref->con_id, lflags);
404 
405 			ref->lookup = no_free_ptr(lookup);
406 			gpiod_add_lookup_table(ref->lookup);
407 
408 			return 0;
409 		}
410 	}
411 
412 	/* We warn here because this can only happen if the programmer borked. */
413 	WARN_ON(1);
414 	return -ENOENT;
415 }
416 
417 static void gpio_shared_remove_adev(struct auxiliary_device *adev)
418 {
419 	auxiliary_device_delete(adev);
420 	auxiliary_device_uninit(adev);
421 }
422 
423 int gpio_device_setup_shared(struct gpio_device *gdev)
424 {
425 	struct gpio_shared_entry *entry;
426 	struct gpio_shared_ref *ref;
427 	unsigned long *flags;
428 	int ret;
429 
430 	list_for_each_entry(entry, &gpio_shared_list, list) {
431 		list_for_each_entry(ref, &entry->refs, list) {
432 			if (gdev->dev.parent == &ref->adev.dev) {
433 				/*
434 				 * This is a shared GPIO proxy. Mark its
435 				 * descriptor as such and return here.
436 				 */
437 				__set_bit(GPIOD_FLAG_SHARED_PROXY,
438 					  &gdev->descs[0].flags);
439 				return 0;
440 			}
441 		}
442 	}
443 
444 	/*
445 	 * This is not a shared GPIO proxy but it still may be the device
446 	 * exposing shared pins. Find them and create the proxy devices.
447 	 */
448 	list_for_each_entry(entry, &gpio_shared_list, list) {
449 		if (!device_match_fwnode(&gdev->dev, entry->fwnode))
450 			continue;
451 
452 		if (list_count_nodes(&entry->refs) <= 1)
453 			continue;
454 
455 		flags = &gdev->descs[entry->offset].flags;
456 
457 		__set_bit(GPIOD_FLAG_SHARED, flags);
458 		/*
459 		 * Shared GPIOs are not requested via the normal path. Make
460 		 * them inaccessible to anyone even before we register the
461 		 * chip.
462 		 */
463 		__set_bit(GPIOD_FLAG_REQUESTED, flags);
464 
465 		pr_debug("GPIO %u owned by %s is shared by multiple consumers\n",
466 			 entry->offset, gpio_device_get_label(gdev));
467 
468 		list_for_each_entry(ref, &entry->refs, list) {
469 			pr_debug("Setting up a shared GPIO entry for %s\n",
470 				 fwnode_get_name(ref->fwnode));
471 
472 			ret = gpio_shared_make_adev(gdev, entry, ref);
473 			if (ret)
474 				return ret;
475 		}
476 	}
477 
478 	return 0;
479 }
480 
481 void gpio_device_teardown_shared(struct gpio_device *gdev)
482 {
483 	struct gpio_shared_entry *entry;
484 	struct gpio_shared_ref *ref;
485 
486 	list_for_each_entry(entry, &gpio_shared_list, list) {
487 		if (!device_match_fwnode(&gdev->dev, entry->fwnode))
488 			continue;
489 
490 		/*
491 		 * For some reason if we call synchronize_srcu() in GPIO core,
492 		 * descent here and take this mutex and then recursively call
493 		 * synchronize_srcu() again from gpiochip_remove() (which is
494 		 * totally fine) called after gpio_shared_remove_adev(),
495 		 * lockdep prints a false positive deadlock splat. Disable
496 		 * lockdep here.
497 		 */
498 		lockdep_off();
499 		list_for_each_entry(ref, &entry->refs, list) {
500 			guard(mutex)(&ref->lock);
501 
502 			if (ref->lookup) {
503 				gpiod_remove_lookup_table(ref->lookup);
504 				kfree(ref->lookup->table[0].key);
505 				kfree(ref->lookup);
506 				ref->lookup = NULL;
507 			}
508 
509 			gpio_shared_remove_adev(&ref->adev);
510 		}
511 		lockdep_on();
512 	}
513 }
514 
515 static void gpio_shared_release(struct kref *kref)
516 {
517 	struct gpio_shared_entry *entry =
518 		container_of(kref, struct gpio_shared_entry, ref);
519 	struct gpio_shared_desc *shared_desc;
520 
521 	guard(mutex)(&entry->lock);
522 
523 	shared_desc = entry->shared_desc;
524 	gpio_device_put(shared_desc->desc->gdev);
525 	if (shared_desc->can_sleep)
526 		mutex_destroy(&shared_desc->mutex);
527 	kfree(shared_desc);
528 	entry->shared_desc = NULL;
529 }
530 
531 static void gpiod_shared_put(void *data)
532 {
533 	struct gpio_shared_entry *entry = data;
534 
535 	kref_put(&entry->ref, gpio_shared_release);
536 }
537 
538 static struct gpio_shared_desc *
539 gpiod_shared_desc_create(struct gpio_shared_entry *entry)
540 {
541 	struct gpio_shared_desc *shared_desc;
542 	struct gpio_device *gdev;
543 
544 	lockdep_assert_held(&entry->lock);
545 
546 	shared_desc = kzalloc(sizeof(*shared_desc), GFP_KERNEL);
547 	if (!shared_desc)
548 		return ERR_PTR(-ENOMEM);
549 
550 	gdev = gpio_device_find_by_fwnode(entry->fwnode);
551 	if (!gdev) {
552 		kfree(shared_desc);
553 		return ERR_PTR(-EPROBE_DEFER);
554 	}
555 
556 	shared_desc->desc = &gdev->descs[entry->offset];
557 	shared_desc->can_sleep = gpiod_cansleep(shared_desc->desc);
558 	if (shared_desc->can_sleep)
559 		mutex_init(&shared_desc->mutex);
560 	else
561 		spin_lock_init(&shared_desc->spinlock);
562 
563 	return shared_desc;
564 }
565 
566 struct gpio_shared_desc *devm_gpiod_shared_get(struct device *dev)
567 {
568 	struct gpio_shared_desc *shared_desc;
569 	struct gpio_shared_entry *entry;
570 	int ret;
571 
572 	entry = dev_get_platdata(dev);
573 	if (WARN_ON(!entry))
574 		/* Programmer bug */
575 		return ERR_PTR(-ENOENT);
576 
577 	scoped_guard(mutex, &entry->lock) {
578 		if (entry->shared_desc) {
579 			kref_get(&entry->ref);
580 			shared_desc = entry->shared_desc;
581 		} else {
582 			shared_desc = gpiod_shared_desc_create(entry);
583 			if (IS_ERR(shared_desc))
584 				return ERR_CAST(shared_desc);
585 
586 			kref_init(&entry->ref);
587 			entry->shared_desc = shared_desc;
588 		}
589 
590 		pr_debug("Device %s acquired a reference to the shared GPIO %u owned by %s\n",
591 			 dev_name(dev), gpiod_hwgpio(shared_desc->desc),
592 			 gpio_device_get_label(shared_desc->desc->gdev));
593 	}
594 
595 	ret = devm_add_action_or_reset(dev, gpiod_shared_put, entry);
596 	if (ret)
597 		return ERR_PTR(ret);
598 
599 	return shared_desc;
600 }
601 EXPORT_SYMBOL_GPL(devm_gpiod_shared_get);
602 
603 static void gpio_shared_drop_ref(struct gpio_shared_ref *ref)
604 {
605 	list_del(&ref->list);
606 	mutex_destroy(&ref->lock);
607 	kfree(ref->con_id);
608 	ida_free(&gpio_shared_ida, ref->dev_id);
609 	fwnode_handle_put(ref->fwnode);
610 	kfree(ref);
611 }
612 
613 static void gpio_shared_drop_entry(struct gpio_shared_entry *entry)
614 {
615 	list_del(&entry->list);
616 	mutex_destroy(&entry->lock);
617 	fwnode_handle_put(entry->fwnode);
618 	kfree(entry);
619 }
620 
621 /*
622  * This is only called if gpio_shared_init() fails so it's in fact __init and
623  * not __exit.
624  */
625 static void __init gpio_shared_teardown(void)
626 {
627 	struct gpio_shared_entry *entry, *epos;
628 	struct gpio_shared_ref *ref, *rpos;
629 
630 	list_for_each_entry_safe(entry, epos, &gpio_shared_list, list) {
631 		list_for_each_entry_safe(ref, rpos, &entry->refs, list)
632 			gpio_shared_drop_ref(ref);
633 
634 		gpio_shared_drop_entry(entry);
635 	}
636 }
637 
638 static void gpio_shared_free_exclusive(void)
639 {
640 	struct gpio_shared_entry *entry, *epos;
641 
642 	list_for_each_entry_safe(entry, epos, &gpio_shared_list, list) {
643 		if (list_count_nodes(&entry->refs) > 1)
644 			continue;
645 
646 		gpio_shared_drop_ref(list_first_entry(&entry->refs,
647 						      struct gpio_shared_ref,
648 						      list));
649 		gpio_shared_drop_entry(entry);
650 	}
651 }
652 
653 static int __init gpio_shared_init(void)
654 {
655 	int ret;
656 
657 	/* Right now, we only support OF-based systems. */
658 	ret = gpio_shared_of_scan();
659 	if (ret) {
660 		gpio_shared_teardown();
661 		pr_err("Failed to scan OF nodes for shared GPIOs: %d\n", ret);
662 		return ret;
663 	}
664 
665 	gpio_shared_free_exclusive();
666 
667 	pr_debug("Finished scanning firmware nodes for shared GPIOs\n");
668 	return 0;
669 }
670 postcore_initcall(gpio_shared_init);
671