1.. SPDX-License-Identifier: GPL-2.0-only 2.. Copyright 2024 Linaro Ltd. 3 4==================== 5Power Sequencing API 6==================== 7 8:Author: Bartosz Golaszewski 9 10Introduction 11============ 12 13This framework is designed to abstract complex power-up sequences that are 14shared between multiple logical devices in the Linux kernel. 15 16The intention is to allow consumers to obtain a power sequencing handle 17exposed by the power sequence provider and delegate the actual requesting and 18control of the underlying resources as well as to allow the provider to 19mitigate any potential conflicts between multiple users behind the scenes. 20 21Glossary 22-------- 23 24The power sequencing API uses a number of terms specific to the subsystem: 25 26Unit 27 28 A unit is a discrete chunk of a power sequence. For instance one unit may 29 enable a set of regulators, another may enable a specific GPIO. Units can 30 define dependencies in the form of other units that must be enabled before 31 it itself can be. 32 33Target 34 35 A target is a set of units (composed of the "final" unit and its 36 dependencies) that a consumer selects by its name when requesting a handle 37 to the power sequencer. Via the dependency system, multiple targets may 38 share the same parts of a power sequence but ignore parts that are 39 irrelevant. 40 41Descriptor 42 43 A handle passed by the pwrseq core to every consumer that serves as the 44 entry point to the provider layer. It ensures coherence between different 45 users and keeps reference counting consistent. 46 47Consumer interface 48================== 49 50The consumer API is aimed to be as simple as possible. The driver interested in 51getting a descriptor from the power sequencer should call pwrseq_get() and 52specify the name of the target it wants to reach in the sequence after calling 53pwrseq_power_up(). The descriptor can be released by calling pwrseq_put() and 54the consumer can request the powering down of its target with 55pwrseq_power_off(). Note that there is no guarantee that pwrseq_power_off() 56will have any effect as there may be multiple users of the underlying resources 57who may keep them active. 58 59Provider interface 60================== 61 62The provider API is admittedly not nearly as straightforward as the one for 63consumers but it makes up for it in flexibility. 64 65Each provider can logically split the power-up sequence into discrete chunks 66(units) and define their dependencies. They can then expose named targets that 67consumers may use as the final point in the sequence that they wish to reach. 68 69To that end the providers fill out a set of configuration structures and 70register with the pwrseq subsystem by calling pwrseq_device_register(). 71 72Dynamic consumer matching 73------------------------- 74 75The main difference between pwrseq and other Linux kernel providers is the 76mechanism for dynamic matching of consumers and providers. Every power sequence 77provider driver must implement the `match()` callback and pass it to the pwrseq 78core when registering with the subsystems. 79 80When a client requests a sequencer handle, the core will call this callback for 81every registered provider and let it flexibly figure out whether the proposed 82client device is indeed its consumer. For example: if the provider binds to the 83device-tree node representing a power management unit of a chipset and the 84consumer driver controls one of its modules, the provider driver may parse the 85relevant regulator supply properties in device tree and see if they lead from 86the PMU to the consumer. 87 88API reference 89============= 90 91.. kernel-doc:: include/linux/pwrseq/provider.h 92 :internal: 93 94.. kernel-doc:: drivers/power/sequencing/core.c 95 :export: 96