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
pwrseq_unit_new(const struct pwrseq_unit_data * data)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
pwrseq_unit_get(struct pwrseq_unit * unit)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
pwrseq_unit_put(struct pwrseq_unit * unit)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
pwrseq_unit_dep_new(struct pwrseq_unit * unit)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
pwrseq_unit_dep_free(struct pwrseq_unit_dep * ref)150 static void pwrseq_unit_dep_free(struct pwrseq_unit_dep *ref)
151 {
152 pwrseq_unit_put(ref->unit);
153 kfree(ref);
154 }
155
pwrseq_unit_free_deps(struct list_head * list)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
pwrseq_unit_release(struct kref * ref)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 *
pwrseq_target_new(const struct pwrseq_target_data * data)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
pwrseq_target_free(struct pwrseq_target * target)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
to_pwrseq_device(struct device * dev)244 static struct pwrseq_device *to_pwrseq_device(struct device *dev)
245 {
246 return container_of(dev, struct pwrseq_device, dev);
247 }
248
pwrseq_device_get(struct pwrseq_device * pwrseq)249 static struct pwrseq_device *pwrseq_device_get(struct pwrseq_device *pwrseq)
250 {
251 get_device(&pwrseq->dev);
252
253 return pwrseq;
254 }
255
pwrseq_device_put(struct pwrseq_device * pwrseq)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
pwrseq_release(struct device * dev)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
pwrseq_check_unit_deps(const struct pwrseq_unit_data * data,struct radix_tree_root * visited_units)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
pwrseq_check_target_deps(const struct pwrseq_target_data * data)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 *
pwrseq_unit_setup(const struct pwrseq_unit_data * data,struct list_head * unit_list,struct radix_tree_root * processed_units)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
pwrseq_unit_setup_deps(const struct pwrseq_unit_data ** data,struct list_head * dep_list,struct list_head * unit_list,struct radix_tree_root * processed_units)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
pwrseq_do_setup_targets(const struct pwrseq_target_data ** data,struct pwrseq_device * pwrseq,struct radix_tree_root * processed_units)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
pwrseq_setup_targets(const struct pwrseq_target_data ** targets,struct pwrseq_device * pwrseq)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 *
pwrseq_device_register(const struct pwrseq_config * config)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 */
pwrseq_device_unregister(struct pwrseq_device * pwrseq)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
devm_pwrseq_device_unregister(void * data)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 *
devm_pwrseq_device_register(struct device * dev,const struct pwrseq_config * config)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 */
pwrseq_device_get_drvdata(struct pwrseq_device * pwrseq)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
pwrseq_match_device(struct device * pwrseq_dev,void * data)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 */
pwrseq_get(struct device * dev,const char * target)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 */
pwrseq_put(struct pwrseq_desc * desc)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_disable(desc);
712
713 kfree(desc);
714 module_put(pwrseq->owner);
715 pwrseq_device_put(pwrseq);
716 }
717 EXPORT_SYMBOL_GPL(pwrseq_put);
718
devm_pwrseq_put(void * data)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 */
devm_pwrseq_get(struct device * dev,const char * target)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
pwrseq_unit_enable_deps(struct pwrseq_device * pwrseq,struct list_head * list)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
pwrseq_unit_disable_deps(struct pwrseq_device * pwrseq,struct list_head * list)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
pwrseq_unit_enable(struct pwrseq_device * pwrseq,struct pwrseq_unit * unit)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
pwrseq_unit_disable(struct pwrseq_device * pwrseq,struct pwrseq_unit * unit)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_enable() - 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 */
pwrseq_enable(struct pwrseq_desc * desc)890 int pwrseq_enable(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_enable);
929
930 /**
931 * pwrseq_disable() - 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_enable(). 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 */
pwrseq_disable(struct pwrseq_desc * desc)943 int pwrseq_disable(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_disable);
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 */
pwrseq_to_device(struct pwrseq_desc * desc)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
pwrseq_debugfs_seq_count(struct device * dev,void * data)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
pwrseq_debugfs_seq_start(struct seq_file * seq,loff_t * pos)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
pwrseq_debugfs_seq_next(struct seq_file * seq,void * data,loff_t * pos)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
pwrseq_debugfs_seq_show_target(struct seq_file * seq,struct pwrseq_target * target)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
pwrseq_debugfs_seq_show_unit(struct seq_file * seq,struct pwrseq_unit * unit)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
pwrseq_debugfs_seq_show(struct seq_file * seq,void * data)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
pwrseq_debugfs_seq_stop(struct seq_file * seq,void * data)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
pwrseq_init(void)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
pwrseq_exit(void)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