diff mbox series

[v2] Documentation: add a driver API doc for the power sequencing subsystem

Message ID 20240821100818.13763-1-brgl@bgdev.pl (mailing list archive)
State Handled Elsewhere, archived
Headers show
Series [v2] Documentation: add a driver API doc for the power sequencing subsystem | expand

Commit Message

Bartosz Golaszewski Aug. 21, 2024, 10:08 a.m. UTC
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

Describe what the subsystem does, how the consumers and providers work
and add API reference generated from kerneldocs.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
Changes since v1:
- drop unneeded :c:func: directives
- don't include linux/pwrseq/consumer.h as there are no kerneldocs in it
  which results in a sphinx warning

 Documentation/driver-api/index.rst  |  1 +
 Documentation/driver-api/pwrseq.rst | 95 +++++++++++++++++++++++++++++
 MAINTAINERS                         |  1 +
 3 files changed, 97 insertions(+)
 create mode 100644 Documentation/driver-api/pwrseq.rst

Comments

Jonathan Corbet Aug. 21, 2024, 7:59 p.m. UTC | #1
Bartosz Golaszewski <brgl@bgdev.pl> writes:

> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
>
> Describe what the subsystem does, how the consumers and providers work
> and add API reference generated from kerneldocs.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
> Changes since v1:
> - drop unneeded :c:func: directives
> - don't include linux/pwrseq/consumer.h as there are no kerneldocs in it
>   which results in a sphinx warning
>
>  Documentation/driver-api/index.rst  |  1 +
>  Documentation/driver-api/pwrseq.rst | 95 +++++++++++++++++++++++++++++
>  MAINTAINERS                         |  1 +
>  3 files changed, 97 insertions(+)
>  create mode 100644 Documentation/driver-api/pwrseq.rst

Looks good to me, thanks.

Acked-by: Jonathan Corbet <corbet@lwn.net>

jon
Bartosz Golaszewski Aug. 22, 2024, 1:30 p.m. UTC | #2
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>


On Wed, 21 Aug 2024 12:08:18 +0200, Bartosz Golaszewski wrote:
> Describe what the subsystem does, how the consumers and providers work
> and add API reference generated from kerneldocs.
> 
> 

Applied, thanks!

[1/1] Documentation: add a driver API doc for the power sequencing subsystem
      commit: 8b7e0a6c443e855374a426dcdfd0a19912d70df3

Best regards,
diff mbox series

Patch

diff --git a/Documentation/driver-api/index.rst b/Documentation/driver-api/index.rst
index f10decc2c14b6..7f83e05769b4a 100644
--- a/Documentation/driver-api/index.rst
+++ b/Documentation/driver-api/index.rst
@@ -124,6 +124,7 @@  Subsystem-specific APIs
    pps
    ptp
    pwm
+   pwrseq
    regulator
    reset
    rfkill
diff --git a/Documentation/driver-api/pwrseq.rst b/Documentation/driver-api/pwrseq.rst
new file mode 100644
index 0000000000000..a644084ded17a
--- /dev/null
+++ b/Documentation/driver-api/pwrseq.rst
@@ -0,0 +1,95 @@ 
+.. SPDX-License-Identifier: GPL-2.0-only
+.. Copyright 2024 Linaro Ltd.
+
+====================
+Power Sequencing API
+====================
+
+:Author: Bartosz Golaszewski
+
+Introduction
+============
+
+This framework is designed to abstract complex power-up sequences that are
+shared between multiple logical devices in the linux kernel.
+
+The intention is to allow consumers to obtain a power sequencing handle
+exposed by the power sequence provider and delegate the actual requesting and
+control of the underlying resources as well as to allow the provider to
+mitigate any potential conflicts between multiple users behind the scenes.
+
+Glossary
+--------
+
+The power sequencing API uses a number of terms specific to the subsystem:
+
+Unit
+
+    A unit is a discreet chunk of a power sequence. For instance one unit may
+    enable a set of regulators, another may enable a specific GPIO. Units can
+    define dependencies in the form of other units that must be enabled before
+    it itself can be.
+
+Target
+
+    A target is a set of units (composed of the "final" unit and its
+    dependencies) that a consumer selects by its name when requesting a handle
+    to the power sequencer. Via the dependency system, multiple targets may
+    share the same parts of a power sequence but ignore parts that are
+    irrelevant.
+
+Descriptor
+
+    A handle passed by the pwrseq core to every consumer that serves as the
+    entry point to the provider layer. It ensures coherence between different
+    users and keeps reference counting consistent.
+
+Consumer interface
+==================
+
+The consumer API is aimed to be as simple as possible. The driver interested in
+getting a descriptor from the power sequencer should call pwrseq_get() and
+specify the name of the target it wants to reach in the sequence after calling
+pwrseq_power_up(). The descriptor can be released by calling pwrseq_put() and
+the consumer can request the powering down of its target with
+pwrseq_power_off(). Note that there is no guarantee that pwrseq_power_off()
+will have any effect as there may be multiple users of the underlying resources
+who may keep them active.
+
+Provider interface
+==================
+
+The provider API is admittedly not nearly as straightforward as the one for
+consumers but it makes up for it in flexibility.
+
+Each provider can logically split the power-up sequence into descrete chunks
+(units) and define their dependencies. They can then expose named targets that
+consumers may use as the final point in the sequence that they wish to reach.
+
+To that end the providers fill out a set of configuration structures and
+register with the pwrseq subsystem by calling pwrseq_device_register().
+
+Dynamic consumer matching
+-------------------------
+
+The main difference between pwrseq and other linux kernel providers is the
+mechanism for dynamic matching of consumers and providers. Every power sequence
+provider driver must implement the `match()` callback and pass it to the pwrseq
+core when registering with the subsystems.
+
+When a client requests a sequencer handle, the core will call this callback for
+every registered provider and let it flexibly figure out whether the proposed
+client device is indeed its consumer. For example: if the provider binds to the
+device-tree node representing a power management unit of a chipset and the
+consumer driver controls one of its modules, the provider driver may parse the
+relevant regulator supply properties in device tree and see if they lead from
+the PMU to the consumer.
+
+API reference
+=============
+
+.. kernel-doc:: include/linux/pwrseq/provider.h
+   :internal:
+
+.. kernel-doc:: drivers/power/sequencing/core.c
+   :export:
diff --git a/MAINTAINERS b/MAINTAINERS
index a7cb909ffa1d6..6da6d8ae951a1 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -18315,6 +18315,7 @@  M:	Bartosz Golaszewski <brgl@bgdev.pl>
 L:	linux-pm@vger.kernel.org
 S:	Maintained
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git
+F:	Documentation/driver-api/pwrseq.rst
 F:	drivers/power/sequencing/
 F:	include/linux/pwrseq/