xref: /linux/drivers/power/sequencing/core.c (revision 2d5a7d406ecece5837af1e278ffbbf6c0315560a)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2024 Linaro Ltd.
4  */
5 
6 #include <linux/bug.h>
7 #include <linux/cleanup.h>
8 #include <linux/debugfs.h>
9 #include <linux/device.h>
10 #include <linux/err.h>
11 #include <linux/export.h>
12 #include <linux/idr.h>
13 #include <linux/kernel.h>
14 #include <linux/kref.h>
15 #include <linux/list.h>
16 #include <linux/lockdep.h>
17 #include <linux/module.h>
18 #include <linux/mutex.h>
19 #include <linux/property.h>
20 #include <linux/pwrseq/consumer.h>
21 #include <linux/pwrseq/provider.h>
22 #include <linux/radix-tree.h>
23 #include <linux/rwsem.h>
24 #include <linux/slab.h>
25 
26 /*
27  * Power-sequencing framework for linux.
28  *
29  * This subsystem allows power sequence providers to register a set of targets
30  * that consumers may request and power-up/down.
31  *
32  * Glossary:
33  *
34  * Unit - a unit is a discreet chunk of a power sequence. For instance one unit
35  * may enable a set of regulators, another may enable a specific GPIO. Units
36  * can define dependencies in the form of other units that must be enabled
37  * before it itself can be.
38  *
39  * Target - a target is a set of units (composed of the "final" unit and its
40  * dependencies) that a consumer selects by its name when requesting a handle
41  * to the power sequencer. Via the dependency system, multiple targets may
42  * share the same parts of a power sequence but ignore parts that are
43  * irrelevant.
44  *
45  * Descriptor - a handle passed by the pwrseq core to every consumer that
46  * serves as the entry point to the provider layer. It ensures coherence
47  * between different users and keeps reference counting consistent.
48  *
49  * Each provider must define a .match() callback whose role is to determine
50  * whether a potential consumer is in fact associated with this sequencer.
51  * This allows creating abstraction layers on top of regular device-tree
52  * resources like regulators, clocks and other nodes connected to the consumer
53  * via phandle.
54  */
55 
56 static DEFINE_IDA(pwrseq_ida);
57 
58 /*
59  * Protects the device list on the pwrseq bus from concurrent modifications
60  * but allows simultaneous read-only access.
61  */
62 static DECLARE_RWSEM(pwrseq_sem);
63 
64 /**
65  * struct pwrseq_unit - Private power-sequence unit data.
66  * @ref: Reference count for this object. When it goes to 0, the object is
67  *       destroyed.
68  * @name: Name of this target.
69  * @list: Link to siblings on the list of all units of a single sequencer.
70  * @deps: List of units on which this unit depends.
71  * @enable: Callback running the part of the power-on sequence provided by
72  *          this unit.
73  * @disable: Callback running the part of the power-off sequence provided
74  *           by this unit.
75  * @enable_count: Current number of users that enabled this unit. May be the
76  *                consumer of the power sequencer or other units that depend
77  *                on this one.
78  */
79 struct pwrseq_unit {
80 	struct kref ref;
81 	const char *name;
82 	struct list_head list;
83 	struct list_head deps;
84 	pwrseq_power_state_func enable;
85 	pwrseq_power_state_func disable;
86 	unsigned int enable_count;
87 };
88 
89 static struct pwrseq_unit *pwrseq_unit_new(const struct pwrseq_unit_data *data)
90 {
91 	struct pwrseq_unit *unit;
92 
93 	unit = kzalloc_obj(*unit);
94 	if (!unit)
95 		return NULL;
96 
97 	unit->name = kstrdup_const(data->name, GFP_KERNEL);
98 	if (!unit->name) {
99 		kfree(unit);
100 		return NULL;
101 	}
102 
103 	kref_init(&unit->ref);
104 	INIT_LIST_HEAD(&unit->deps);
105 	unit->enable = data->enable;
106 	unit->disable = data->disable;
107 
108 	return unit;
109 }
110 
111 static struct pwrseq_unit *pwrseq_unit_get(struct pwrseq_unit *unit)
112 {
113 	kref_get(&unit->ref);
114 
115 	return unit;
116 }
117 
118 static void pwrseq_unit_release(struct kref *ref);
119 
120 static void pwrseq_unit_put(struct pwrseq_unit *unit)
121 {
122 	kref_put(&unit->ref, pwrseq_unit_release);
123 }
124 
125 /**
126  * struct pwrseq_unit_dep - Wrapper around a reference to the unit structure
127  *                          allowing to keep it on multiple dependency lists
128  *                          in different units.
129  * @list: Siblings on the list.
130  * @unit: Address of the referenced unit.
131  */
132 struct pwrseq_unit_dep {
133 	struct list_head list;
134 	struct pwrseq_unit *unit;
135 };
136 
137 static struct pwrseq_unit_dep *pwrseq_unit_dep_new(struct pwrseq_unit *unit)
138 {
139 	struct pwrseq_unit_dep *dep;
140 
141 	dep = kzalloc_obj(*dep);
142 	if (!dep)
143 		return NULL;
144 
145 	dep->unit = unit;
146 
147 	return dep;
148 }
149 
150 static void pwrseq_unit_dep_free(struct pwrseq_unit_dep *ref)
151 {
152 	pwrseq_unit_put(ref->unit);
153 	kfree(ref);
154 }
155 
156 static void pwrseq_unit_free_deps(struct list_head *list)
157 {
158 	struct pwrseq_unit_dep *dep, *next;
159 
160 	list_for_each_entry_safe(dep, next, list, list) {
161 		list_del(&dep->list);
162 		pwrseq_unit_dep_free(dep);
163 	}
164 }
165 
166 static void pwrseq_unit_release(struct kref *ref)
167 {
168 	struct pwrseq_unit *unit = container_of(ref, struct pwrseq_unit, ref);
169 
170 	pwrseq_unit_free_deps(&unit->deps);
171 	list_del(&unit->list);
172 	kfree_const(unit->name);
173 	kfree(unit);
174 }
175 
176 /**
177  * struct pwrseq_target - Private power-sequence target data.
178  * @list: Siblings on the list of all targets exposed by a power sequencer.
179  * @name: Name of the target.
180  * @unit: Final unit for this target.
181  * @post_enable: Callback run after the target unit has been enabled, *after*
182  *               the state lock has been released. It's useful for implementing
183  *               boot-up delays without blocking other users from powering up
184  *               using the same power sequencer.
185  */
186 struct pwrseq_target {
187 	struct list_head list;
188 	const char *name;
189 	struct pwrseq_unit *unit;
190 	pwrseq_power_state_func post_enable;
191 };
192 
193 static struct pwrseq_target *
194 pwrseq_target_new(const struct pwrseq_target_data *data)
195 {
196 	struct pwrseq_target *target;
197 
198 	target = kzalloc_obj(*target);
199 	if (!target)
200 		return NULL;
201 
202 	target->name = kstrdup_const(data->name, GFP_KERNEL);
203 	if (!target->name) {
204 		kfree(target);
205 		return NULL;
206 	}
207 
208 	target->post_enable = data->post_enable;
209 
210 	return target;
211 }
212 
213 static void pwrseq_target_free(struct pwrseq_target *target)
214 {
215 	if (!IS_ERR_OR_NULL(target->unit))
216 		pwrseq_unit_put(target->unit);
217 	kfree_const(target->name);
218 	kfree(target);
219 }
220 
221 /**
222  * struct pwrseq_device - Private power sequencing data.
223  * @dev: Device struct associated with this sequencer.
224  * @id: Device ID.
225  * @owner: Prevents removal of active power sequencing providers.
226  * @rw_lock: Protects the device from being unregistered while in use.
227  * @state_lock: Prevents multiple users running the power sequence at the same
228  *              time.
229  * @match: Power sequencer matching callback.
230  * @targets: List of targets exposed by this sequencer.
231  * @units: List of all units supported by this sequencer.
232  */
233 struct pwrseq_device {
234 	struct device dev;
235 	int id;
236 	struct module *owner;
237 	struct rw_semaphore rw_lock;
238 	struct mutex state_lock;
239 	pwrseq_match_func match;
240 	struct list_head targets;
241 	struct list_head units;
242 };
243 
244 static struct pwrseq_device *to_pwrseq_device(struct device *dev)
245 {
246 	return container_of(dev, struct pwrseq_device, dev);
247 }
248 
249 static struct pwrseq_device *pwrseq_device_get(struct pwrseq_device *pwrseq)
250 {
251 	get_device(&pwrseq->dev);
252 
253 	return pwrseq;
254 }
255 
256 static void pwrseq_device_put(struct pwrseq_device *pwrseq)
257 {
258 	put_device(&pwrseq->dev);
259 }
260 
261 /**
262  * struct pwrseq_desc - Wraps access to the pwrseq_device and ensures that one
263  *                      user cannot break the reference counting for others.
264  * @pwrseq: Reference to the power sequencing device.
265  * @target: Reference to the target this descriptor allows to control.
266  * @powered_on: Power state set by the holder of the descriptor (not necessarily
267  * corresponding to the actual power state of the device).
268  */
269 struct pwrseq_desc {
270 	struct pwrseq_device *pwrseq;
271 	struct pwrseq_target *target;
272 	bool powered_on;
273 };
274 
275 static const struct bus_type pwrseq_bus = {
276 	.name = "pwrseq",
277 };
278 
279 static void pwrseq_release(struct device *dev)
280 {
281 	struct pwrseq_device *pwrseq = to_pwrseq_device(dev);
282 	struct pwrseq_target *target, *pos;
283 
284 	list_for_each_entry_safe(target, pos, &pwrseq->targets, list) {
285 		list_del(&target->list);
286 		pwrseq_target_free(target);
287 	}
288 
289 	mutex_destroy(&pwrseq->state_lock);
290 	ida_free(&pwrseq_ida, pwrseq->id);
291 	kfree(pwrseq);
292 }
293 
294 static const struct device_type pwrseq_device_type = {
295 	.name = "power_sequencer",
296 	.release = pwrseq_release,
297 };
298 
299 static int pwrseq_check_unit_deps(const struct pwrseq_unit_data *data,
300 				  struct radix_tree_root *visited_units)
301 {
302 	const struct pwrseq_unit_data *tmp, **cur;
303 	int ret;
304 
305 	ret = radix_tree_insert(visited_units, (unsigned long)data,
306 				(void *)data);
307 	if (ret)
308 		return ret;
309 
310 	for (cur = data->deps; cur && *cur; cur++) {
311 		tmp = radix_tree_lookup(visited_units, (unsigned long)*cur);
312 		if (tmp) {
313 			WARN(1, "Circular dependency in power sequencing flow detected!\n");
314 			return -EINVAL;
315 		}
316 
317 		ret = pwrseq_check_unit_deps(*cur, visited_units);
318 		if (ret)
319 			return ret;
320 	}
321 
322 	return 0;
323 }
324 
325 static int pwrseq_check_target_deps(const struct pwrseq_target_data *data)
326 {
327 	struct radix_tree_root visited_units;
328 	struct radix_tree_iter iter;
329 	void __rcu **slot;
330 	int ret;
331 
332 	if (!data->unit)
333 		return -EINVAL;
334 
335 	INIT_RADIX_TREE(&visited_units, GFP_KERNEL);
336 	ret = pwrseq_check_unit_deps(data->unit, &visited_units);
337 	radix_tree_for_each_slot(slot, &visited_units, &iter, 0)
338 		radix_tree_delete(&visited_units, iter.index);
339 
340 	return ret;
341 }
342 
343 static int pwrseq_unit_setup_deps(const struct pwrseq_unit_data **data,
344 				  struct list_head *dep_list,
345 				  struct list_head *unit_list,
346 				  struct radix_tree_root *processed_units);
347 
348 static struct pwrseq_unit *
349 pwrseq_unit_setup(const struct pwrseq_unit_data *data,
350 		  struct list_head *unit_list,
351 		  struct radix_tree_root *processed_units)
352 {
353 	struct pwrseq_unit *unit;
354 	int ret;
355 
356 	unit = radix_tree_lookup(processed_units, (unsigned long)data);
357 	if (unit)
358 		return pwrseq_unit_get(unit);
359 
360 	unit = pwrseq_unit_new(data);
361 	if (!unit)
362 		return ERR_PTR(-ENOMEM);
363 
364 	if (data->deps) {
365 		ret = pwrseq_unit_setup_deps(data->deps, &unit->deps,
366 					     unit_list, processed_units);
367 		if (ret) {
368 			pwrseq_unit_put(unit);
369 			return ERR_PTR(ret);
370 		}
371 	}
372 
373 	ret = radix_tree_insert(processed_units, (unsigned long)data, unit);
374 	if (ret) {
375 		pwrseq_unit_put(unit);
376 		return ERR_PTR(ret);
377 	}
378 
379 	list_add_tail(&unit->list, unit_list);
380 
381 	return unit;
382 }
383 
384 static int pwrseq_unit_setup_deps(const struct pwrseq_unit_data **data,
385 				  struct list_head *dep_list,
386 				  struct list_head *unit_list,
387 				  struct radix_tree_root *processed_units)
388 {
389 	const struct pwrseq_unit_data *pos;
390 	struct pwrseq_unit_dep *dep;
391 	struct pwrseq_unit *unit;
392 	int i;
393 
394 	for (i = 0; data[i]; i++) {
395 		pos = data[i];
396 
397 		unit = pwrseq_unit_setup(pos, unit_list, processed_units);
398 		if (IS_ERR(unit))
399 			return PTR_ERR(unit);
400 
401 		dep = pwrseq_unit_dep_new(unit);
402 		if (!dep) {
403 			pwrseq_unit_put(unit);
404 			return -ENOMEM;
405 		}
406 
407 		list_add_tail(&dep->list, dep_list);
408 	}
409 
410 	return 0;
411 }
412 
413 static int pwrseq_do_setup_targets(const struct pwrseq_target_data **data,
414 				   struct pwrseq_device *pwrseq,
415 				   struct radix_tree_root *processed_units)
416 {
417 	const struct pwrseq_target_data *pos;
418 	struct pwrseq_target *target;
419 	int ret, i;
420 
421 	for (i = 0; data[i]; i++) {
422 		pos = data[i];
423 
424 		ret = pwrseq_check_target_deps(pos);
425 		if (ret)
426 			return ret;
427 
428 		target = pwrseq_target_new(pos);
429 		if (!target)
430 			return -ENOMEM;
431 
432 		target->unit = pwrseq_unit_setup(pos->unit, &pwrseq->units,
433 						 processed_units);
434 		if (IS_ERR(target->unit)) {
435 			ret = PTR_ERR(target->unit);
436 			pwrseq_target_free(target);
437 			return ret;
438 		}
439 
440 		list_add_tail(&target->list, &pwrseq->targets);
441 	}
442 
443 	return 0;
444 }
445 
446 static int pwrseq_setup_targets(const struct pwrseq_target_data **targets,
447 				struct pwrseq_device *pwrseq)
448 {
449 	struct radix_tree_root processed_units;
450 	struct radix_tree_iter iter;
451 	void __rcu **slot;
452 	int ret;
453 
454 	INIT_RADIX_TREE(&processed_units, GFP_KERNEL);
455 	ret = pwrseq_do_setup_targets(targets, pwrseq, &processed_units);
456 	radix_tree_for_each_slot(slot, &processed_units, &iter, 0)
457 		radix_tree_delete(&processed_units, iter.index);
458 
459 	return ret;
460 }
461 
462 /**
463  * pwrseq_device_register() - Register a new power sequencer.
464  * @config: Configuration of the new power sequencing device.
465  *
466  * The config structure is only used during the call and can be freed after
467  * the function returns. The config structure *must* have the parent device
468  * as well as the match() callback and at least one target set.
469  *
470  * Returns:
471  * Returns the address of the new pwrseq device or ERR_PTR() on failure.
472  */
473 struct pwrseq_device *
474 pwrseq_device_register(const struct pwrseq_config *config)
475 {
476 	struct pwrseq_device *pwrseq;
477 	int ret, id;
478 
479 	if (!config->parent || !config->match || !config->targets ||
480 	    !config->targets[0])
481 		return ERR_PTR(-EINVAL);
482 
483 	pwrseq = kzalloc(sizeof(*pwrseq), GFP_KERNEL);
484 	if (!pwrseq)
485 		return ERR_PTR(-ENOMEM);
486 
487 	pwrseq->dev.type = &pwrseq_device_type;
488 	pwrseq->dev.bus = &pwrseq_bus;
489 	pwrseq->dev.parent = config->parent;
490 	device_set_node(&pwrseq->dev, dev_fwnode(config->parent));
491 	dev_set_drvdata(&pwrseq->dev, config->drvdata);
492 
493 	id = ida_alloc(&pwrseq_ida, GFP_KERNEL);
494 	if (id < 0) {
495 		kfree(pwrseq);
496 		return ERR_PTR(id);
497 	}
498 
499 	pwrseq->id = id;
500 
501 	/*
502 	 * From this point onwards the device's release() callback is
503 	 * responsible for freeing resources.
504 	 */
505 	device_initialize(&pwrseq->dev);
506 
507 	ret = dev_set_name(&pwrseq->dev, "pwrseq.%d", pwrseq->id);
508 	if (ret)
509 		goto err_put_pwrseq;
510 
511 	pwrseq->owner = config->owner ?: THIS_MODULE;
512 	pwrseq->match = config->match;
513 
514 	init_rwsem(&pwrseq->rw_lock);
515 	mutex_init(&pwrseq->state_lock);
516 	INIT_LIST_HEAD(&pwrseq->targets);
517 	INIT_LIST_HEAD(&pwrseq->units);
518 
519 	ret = pwrseq_setup_targets(config->targets, pwrseq);
520 	if (ret)
521 		goto err_put_pwrseq;
522 
523 	scoped_guard(rwsem_write, &pwrseq_sem) {
524 		ret = device_add(&pwrseq->dev);
525 		if (ret)
526 			goto err_put_pwrseq;
527 	}
528 
529 	return pwrseq;
530 
531 err_put_pwrseq:
532 	pwrseq_device_put(pwrseq);
533 	return ERR_PTR(ret);
534 }
535 EXPORT_SYMBOL_GPL(pwrseq_device_register);
536 
537 /**
538  * pwrseq_device_unregister() - Unregister the power sequencer.
539  * @pwrseq: Power sequencer to unregister.
540  */
541 void pwrseq_device_unregister(struct pwrseq_device *pwrseq)
542 {
543 	struct device *dev = &pwrseq->dev;
544 	struct pwrseq_target *target;
545 
546 	scoped_guard(rwsem_write, &pwrseq_sem) {
547 		guard(rwsem_write)(&pwrseq->rw_lock);
548 
549 		/*
550 		 * Holding rw_lock for write excludes all power on/off callers
551 		 * (they hold it for read), so it's safe to read enable_count
552 		 * here without taking the state_lock.
553 		 */
554 		list_for_each_entry(target, &pwrseq->targets, list)
555 			WARN(target->unit->enable_count,
556 			     "REMOVING POWER SEQUENCER WITH ACTIVE USERS\n");
557 
558 		device_del(dev);
559 	}
560 
561 	pwrseq_device_put(pwrseq);
562 }
563 EXPORT_SYMBOL_GPL(pwrseq_device_unregister);
564 
565 static void devm_pwrseq_device_unregister(void *data)
566 {
567 	struct pwrseq_device *pwrseq = data;
568 
569 	pwrseq_device_unregister(pwrseq);
570 }
571 
572 /**
573  * devm_pwrseq_device_register() - Managed variant of pwrseq_device_register().
574  * @dev: Managing device.
575  * @config: Configuration of the new power sequencing device.
576  *
577  * Returns:
578  * Returns the address of the new pwrseq device or ERR_PTR() on failure.
579  */
580 struct pwrseq_device *
581 devm_pwrseq_device_register(struct device *dev,
582 			    const struct pwrseq_config *config)
583 {
584 	struct pwrseq_device *pwrseq;
585 	int ret;
586 
587 	pwrseq = pwrseq_device_register(config);
588 	if (IS_ERR(pwrseq))
589 		return pwrseq;
590 
591 	ret = devm_add_action_or_reset(dev, devm_pwrseq_device_unregister,
592 				       pwrseq);
593 	if (ret)
594 		return ERR_PTR(ret);
595 
596 	return pwrseq;
597 }
598 EXPORT_SYMBOL_GPL(devm_pwrseq_device_register);
599 
600 /**
601  * pwrseq_device_get_drvdata() - Get the driver private data associated with
602  *                               this sequencer.
603  * @pwrseq: Power sequencer object.
604  *
605  * Returns:
606  * Address of the private driver data.
607  */
608 void *pwrseq_device_get_drvdata(struct pwrseq_device *pwrseq)
609 {
610 	return dev_get_drvdata(&pwrseq->dev);
611 }
612 EXPORT_SYMBOL_GPL(pwrseq_device_get_drvdata);
613 
614 struct pwrseq_match_data {
615 	struct pwrseq_desc *desc;
616 	struct device *dev;
617 	const char *target;
618 };
619 
620 static int pwrseq_match_device(struct device *pwrseq_dev, void *data)
621 {
622 	struct pwrseq_device *pwrseq = to_pwrseq_device(pwrseq_dev);
623 	struct pwrseq_match_data *match_data = data;
624 	struct pwrseq_target *target;
625 	int ret;
626 
627 	lockdep_assert_held_read(&pwrseq_sem);
628 
629 	guard(rwsem_read)(&pwrseq->rw_lock);
630 	if (!device_is_registered(&pwrseq->dev))
631 		return 0;
632 
633 	ret = pwrseq->match(pwrseq, match_data->dev);
634 	if (ret == PWRSEQ_NO_MATCH || ret < 0)
635 		return ret;
636 
637 	/* We got the matching device, let's find the right target. */
638 	list_for_each_entry(target, &pwrseq->targets, list) {
639 		if (strcmp(target->name, match_data->target))
640 			continue;
641 
642 		match_data->desc->target = target;
643 	}
644 
645 	/*
646 	 * This device does not have this target. No point in deferring as it
647 	 * will not get a new target dynamically later.
648 	 */
649 	if (!match_data->desc->target)
650 		return -ENOENT;
651 
652 	if (!try_module_get(pwrseq->owner))
653 		return -EPROBE_DEFER;
654 
655 	match_data->desc->pwrseq = pwrseq_device_get(pwrseq);
656 
657 	return PWRSEQ_MATCH_OK;
658 }
659 
660 /**
661  * pwrseq_get() - Get the power sequencer associated with this device.
662  * @dev: Device for which to get the sequencer.
663  * @target: Name of the target exposed by the sequencer this device wants to
664  *          reach.
665  *
666  * Returns:
667  * New power sequencer descriptor for use by the consumer driver or ERR_PTR()
668  * on failure.
669  */
670 struct pwrseq_desc *pwrseq_get(struct device *dev, const char *target)
671 {
672 	struct pwrseq_match_data match_data;
673 	int ret;
674 
675 	struct pwrseq_desc *desc __free(kfree) = kzalloc_obj(*desc);
676 	if (!desc)
677 		return ERR_PTR(-ENOMEM);
678 
679 	match_data.desc = desc;
680 	match_data.dev = dev;
681 	match_data.target = target;
682 
683 	guard(rwsem_read)(&pwrseq_sem);
684 
685 	ret = bus_for_each_dev(&pwrseq_bus, NULL, &match_data,
686 			       pwrseq_match_device);
687 	if (ret < 0)
688 		return ERR_PTR(ret);
689 	if (ret == PWRSEQ_NO_MATCH)
690 		/* No device matched. */
691 		return ERR_PTR(-EPROBE_DEFER);
692 
693 	return_ptr(desc);
694 }
695 EXPORT_SYMBOL_GPL(pwrseq_get);
696 
697 /**
698  * pwrseq_put() - Release the power sequencer descriptor.
699  * @desc: Descriptor to release.
700  */
701 void pwrseq_put(struct pwrseq_desc *desc)
702 {
703 	struct pwrseq_device *pwrseq;
704 
705 	if (!desc)
706 		return;
707 
708 	pwrseq = desc->pwrseq;
709 
710 	if (desc->powered_on)
711 		pwrseq_power_off(desc);
712 
713 	kfree(desc);
714 	module_put(pwrseq->owner);
715 	pwrseq_device_put(pwrseq);
716 }
717 EXPORT_SYMBOL_GPL(pwrseq_put);
718 
719 static void devm_pwrseq_put(void *data)
720 {
721 	struct pwrseq_desc *desc = data;
722 
723 	pwrseq_put(desc);
724 }
725 
726 /**
727  * devm_pwrseq_get() - Managed variant of pwrseq_get().
728  * @dev: Device for which to get the sequencer and which also manages its
729  *       lifetime.
730  * @target: Name of the target exposed by the sequencer this device wants to
731  *          reach.
732  *
733  * Returns:
734  * New power sequencer descriptor for use by the consumer driver or ERR_PTR()
735  * on failure.
736  */
737 struct pwrseq_desc *devm_pwrseq_get(struct device *dev, const char *target)
738 {
739 	struct pwrseq_desc *desc;
740 	int ret;
741 
742 	desc = pwrseq_get(dev, target);
743 	if (IS_ERR(desc))
744 		return desc;
745 
746 	ret = devm_add_action_or_reset(dev, devm_pwrseq_put, desc);
747 	if (ret)
748 		return ERR_PTR(ret);
749 
750 	return desc;
751 }
752 EXPORT_SYMBOL_GPL(devm_pwrseq_get);
753 
754 static int pwrseq_unit_enable(struct pwrseq_device *pwrseq,
755 			      struct pwrseq_unit *target);
756 static int pwrseq_unit_disable(struct pwrseq_device *pwrseq,
757 			       struct pwrseq_unit *target);
758 
759 static int pwrseq_unit_enable_deps(struct pwrseq_device *pwrseq,
760 				   struct list_head *list)
761 {
762 	struct pwrseq_unit_dep *pos;
763 	int ret = 0;
764 
765 	list_for_each_entry(pos, list, list) {
766 		ret = pwrseq_unit_enable(pwrseq, pos->unit);
767 		if (ret) {
768 			list_for_each_entry_continue_reverse(pos, list, list)
769 				pwrseq_unit_disable(pwrseq, pos->unit);
770 			break;
771 		}
772 	}
773 
774 	return ret;
775 }
776 
777 static int pwrseq_unit_disable_deps(struct pwrseq_device *pwrseq,
778 				    struct list_head *list)
779 {
780 	struct pwrseq_unit_dep *pos;
781 	int ret = 0;
782 
783 	list_for_each_entry_reverse(pos, list, list) {
784 		ret = pwrseq_unit_disable(pwrseq, pos->unit);
785 		if (ret) {
786 			list_for_each_entry_continue(pos, list, list)
787 				pwrseq_unit_enable(pwrseq, pos->unit);
788 			break;
789 		}
790 	}
791 
792 	return ret;
793 }
794 
795 static int pwrseq_unit_enable(struct pwrseq_device *pwrseq,
796 			      struct pwrseq_unit *unit)
797 {
798 	int ret;
799 
800 	lockdep_assert_held_read(&pwrseq->rw_lock);
801 	lockdep_assert_held(&pwrseq->state_lock);
802 
803 	if (unit->enable_count != 0) {
804 		unit->enable_count++;
805 		return 0;
806 	}
807 
808 	ret = pwrseq_unit_enable_deps(pwrseq, &unit->deps);
809 	if (ret) {
810 		dev_err(&pwrseq->dev,
811 			"Failed to enable dependencies before power-on for target '%s': %d\n",
812 			unit->name, ret);
813 		return ret;
814 	}
815 
816 	if (unit->enable) {
817 		ret = unit->enable(pwrseq);
818 		if (ret) {
819 			dev_err(&pwrseq->dev,
820 				"Failed to enable target '%s': %d\n",
821 				unit->name, ret);
822 			pwrseq_unit_disable_deps(pwrseq, &unit->deps);
823 			return ret;
824 		}
825 	}
826 
827 	unit->enable_count++;
828 
829 	return 0;
830 }
831 
832 static int pwrseq_unit_disable(struct pwrseq_device *pwrseq,
833 			       struct pwrseq_unit *unit)
834 {
835 	int ret;
836 
837 	lockdep_assert_held_read(&pwrseq->rw_lock);
838 	lockdep_assert_held(&pwrseq->state_lock);
839 
840 	if (unit->enable_count == 0) {
841 		WARN(1, "Unmatched power-off for target '%s'\n",
842 		     unit->name);
843 		return -EBUSY;
844 	}
845 
846 	if (unit->enable_count != 1) {
847 		unit->enable_count--;
848 		return 0;
849 	}
850 
851 	if (unit->disable) {
852 		ret = unit->disable(pwrseq);
853 		if (ret) {
854 			dev_err(&pwrseq->dev,
855 				"Failed to disable target '%s': %d\n",
856 				unit->name, ret);
857 			return ret;
858 		}
859 	}
860 
861 	ret = pwrseq_unit_disable_deps(pwrseq, &unit->deps);
862 	if (ret) {
863 		dev_err(&pwrseq->dev,
864 			"Failed to disable dependencies after power-off for target '%s': %d\n",
865 			unit->name, ret);
866 		if (unit->enable)
867 			unit->enable(pwrseq);
868 		return ret;
869 	}
870 
871 	unit->enable_count--;
872 
873 	return 0;
874 }
875 
876 /**
877  * pwrseq_power_on() - Issue a power-on request on behalf of the consumer
878  *                     device.
879  * @desc: Descriptor referencing the power sequencer.
880  *
881  * This function tells the power sequencer that the consumer wants to be
882  * powered-up. The sequencer may already have powered-up the device in which
883  * case the function returns 0. If the power-up sequence is already in
884  * progress, the function will block until it's done and return 0. If this is
885  * the first request, the device will be powered up.
886  *
887  * Returns:
888  * 0 on success, negative error number on failure.
889  */
890 int pwrseq_power_on(struct pwrseq_desc *desc)
891 {
892 	struct pwrseq_device *pwrseq;
893 	struct pwrseq_target *target;
894 	struct pwrseq_unit *unit;
895 	int ret;
896 
897 	might_sleep();
898 
899 	if (!desc || desc->powered_on)
900 		return 0;
901 
902 	pwrseq = desc->pwrseq;
903 	target = desc->target;
904 	unit = target->unit;
905 
906 	guard(rwsem_read)(&pwrseq->rw_lock);
907 	if (!device_is_registered(&pwrseq->dev))
908 		return -ENODEV;
909 
910 	scoped_guard(mutex, &pwrseq->state_lock) {
911 		ret = pwrseq_unit_enable(pwrseq, unit);
912 		if (!ret)
913 			desc->powered_on = true;
914 	}
915 
916 	if (target->post_enable) {
917 		ret = target->post_enable(pwrseq);
918 		if (ret) {
919 			scoped_guard(mutex, &pwrseq->state_lock) {
920 				pwrseq_unit_disable(pwrseq, unit);
921 				desc->powered_on = false;
922 			}
923 		}
924 	}
925 
926 	return ret;
927 }
928 EXPORT_SYMBOL_GPL(pwrseq_power_on);
929 
930 /**
931  * pwrseq_power_off() - Issue a power-off request on behalf of the consumer
932  *                      device.
933  * @desc: Descriptor referencing the power sequencer.
934  *
935  * This undoes the effects of pwrseq_power_on(). It issues a power-off request
936  * on behalf of the consumer and when the last remaining user does so, the
937  * power-down sequence will be started. If one is in progress, the function
938  * will block until it's complete and then return.
939  *
940  * Returns:
941  * 0 on success, negative error number on failure.
942  */
943 int pwrseq_power_off(struct pwrseq_desc *desc)
944 {
945 	struct pwrseq_device *pwrseq;
946 	struct pwrseq_unit *unit;
947 	int ret;
948 
949 	might_sleep();
950 
951 	if (!desc || !desc->powered_on)
952 		return 0;
953 
954 	pwrseq = desc->pwrseq;
955 	unit = desc->target->unit;
956 
957 	guard(rwsem_read)(&pwrseq->rw_lock);
958 	if (!device_is_registered(&pwrseq->dev))
959 		return -ENODEV;
960 
961 	guard(mutex)(&pwrseq->state_lock);
962 
963 	ret = pwrseq_unit_disable(pwrseq, unit);
964 	if (!ret)
965 		desc->powered_on = false;
966 
967 	return ret;
968 }
969 EXPORT_SYMBOL_GPL(pwrseq_power_off);
970 
971 /**
972  * pwrseq_to_device() - Get the pwrseq device pointer from a descriptor.
973  * @desc: Descriptor referencing the power sequencer.
974  *
975  * Return the 'dev' pointer of the power sequencer device associated with @desc.
976  * Consumer drivers can use this to query the pwrseq provider's device tree
977  * node, for example to check for the existence of specific properties.
978  *
979  * Since pwrseq_get() already takes a reference to the pwrseq device, this
980  * function does not take an additional reference.
981  *
982  * Returns:
983  * Pointer to the pwrseq struct device, or NULL if @desc is NULL.
984  */
985 struct device *pwrseq_to_device(struct pwrseq_desc *desc)
986 {
987 	if (!desc)
988 		return NULL;
989 
990 	return &desc->pwrseq->dev;
991 }
992 EXPORT_SYMBOL_GPL(pwrseq_to_device);
993 
994 #if IS_ENABLED(CONFIG_DEBUG_FS)
995 
996 struct pwrseq_debugfs_count_ctx {
997 	struct device *dev;
998 	loff_t index;
999 };
1000 
1001 static int pwrseq_debugfs_seq_count(struct device *dev, void *data)
1002 {
1003 	struct pwrseq_debugfs_count_ctx *ctx = data;
1004 
1005 	ctx->dev = dev;
1006 
1007 	return ctx->index-- ? 0 : 1;
1008 }
1009 
1010 static void *pwrseq_debugfs_seq_start(struct seq_file *seq, loff_t *pos)
1011 {
1012 	struct pwrseq_debugfs_count_ctx ctx;
1013 
1014 	ctx.dev = NULL;
1015 	ctx.index = *pos;
1016 
1017 	/*
1018 	 * Hold the lock for the entire printout to prevent device removal.
1019 	 * Reference counts are managed by start()/next()/stop() as required
1020 	 * by the seq_file contract.
1021 	 */
1022 	down_read(&pwrseq_sem);
1023 
1024 	bus_for_each_dev(&pwrseq_bus, NULL, &ctx, pwrseq_debugfs_seq_count);
1025 	if (!ctx.index)
1026 		return NULL;
1027 
1028 	return get_device(ctx.dev);
1029 }
1030 
1031 static void *pwrseq_debugfs_seq_next(struct seq_file *seq, void *data,
1032 				     loff_t *pos)
1033 {
1034 	struct device *curr = data;
1035 
1036 	++*pos;
1037 
1038 	struct device *next = bus_find_next_device(&pwrseq_bus, curr);
1039 
1040 	put_device(curr);
1041 	return next;
1042 }
1043 
1044 static void pwrseq_debugfs_seq_show_target(struct seq_file *seq,
1045 					   struct pwrseq_target *target)
1046 {
1047 	seq_printf(seq, "    target: [%s] (target unit: [%s])\n",
1048 		   target->name, target->unit->name);
1049 }
1050 
1051 static void pwrseq_debugfs_seq_show_unit(struct seq_file *seq,
1052 					 struct pwrseq_unit *unit)
1053 {
1054 	struct pwrseq_unit_dep *ref;
1055 
1056 	seq_printf(seq, "    unit: [%s] - enable count: %u\n",
1057 		   unit->name, unit->enable_count);
1058 
1059 	if (list_empty(&unit->deps))
1060 		return;
1061 
1062 	seq_puts(seq, "      dependencies:\n");
1063 	list_for_each_entry(ref, &unit->deps, list)
1064 		seq_printf(seq, "        [%s]\n", ref->unit->name);
1065 }
1066 
1067 static int pwrseq_debugfs_seq_show(struct seq_file *seq, void *data)
1068 {
1069 	struct device *dev = data;
1070 	struct pwrseq_device *pwrseq = to_pwrseq_device(dev);
1071 	struct pwrseq_target *target;
1072 	struct pwrseq_unit *unit;
1073 
1074 	seq_printf(seq, "%s (%s):\n", dev_name(dev), dev_name(dev->parent));
1075 
1076 	seq_puts(seq, "  targets:\n");
1077 	list_for_each_entry(target, &pwrseq->targets, list)
1078 		pwrseq_debugfs_seq_show_target(seq, target);
1079 
1080 	seq_puts(seq, "  units:\n");
1081 	list_for_each_entry(unit, &pwrseq->units, list)
1082 		pwrseq_debugfs_seq_show_unit(seq, unit);
1083 
1084 	return 0;
1085 }
1086 
1087 static void pwrseq_debugfs_seq_stop(struct seq_file *seq, void *data)
1088 {
1089 	if (data)
1090 		put_device(data);
1091 	up_read(&pwrseq_sem);
1092 }
1093 
1094 static const struct seq_operations pwrseq_debugfs_sops = {
1095 	.start = pwrseq_debugfs_seq_start,
1096 	.next = pwrseq_debugfs_seq_next,
1097 	.show = pwrseq_debugfs_seq_show,
1098 	.stop = pwrseq_debugfs_seq_stop,
1099 };
1100 DEFINE_SEQ_ATTRIBUTE(pwrseq_debugfs);
1101 
1102 static struct dentry *pwrseq_debugfs_dentry;
1103 
1104 #endif /* CONFIG_DEBUG_FS */
1105 
1106 static int __init pwrseq_init(void)
1107 {
1108 	int ret;
1109 
1110 	ret = bus_register(&pwrseq_bus);
1111 	if (ret) {
1112 		pr_err("Failed to register the power sequencer bus\n");
1113 		return ret;
1114 	}
1115 
1116 #if IS_ENABLED(CONFIG_DEBUG_FS)
1117 	pwrseq_debugfs_dentry = debugfs_create_file("pwrseq", 0444, NULL, NULL,
1118 						    &pwrseq_debugfs_fops);
1119 #endif  /* CONFIG_DEBUG_FS */
1120 
1121 	return 0;
1122 }
1123 subsys_initcall(pwrseq_init);
1124 
1125 static void __exit pwrseq_exit(void)
1126 {
1127 #if IS_ENABLED(CONFIG_DEBUG_FS)
1128 	debugfs_remove_recursive(pwrseq_debugfs_dentry);
1129 #endif  /* CONFIG_DEBUG_FS */
1130 
1131 	bus_unregister(&pwrseq_bus);
1132 }
1133 module_exit(pwrseq_exit);
1134 
1135 MODULE_AUTHOR("Bartosz Golaszewski <bartosz.golaszewski@linaro.org>");
1136 MODULE_DESCRIPTION("Power Sequencing subsystem core");
1137 MODULE_LICENSE("GPL");
1138