xref: /aosp_15_r20/external/pigweed/pw_clock_tree/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_clock_tree:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker================
4*61c4878aSAndroid Build Coastguard Workerpw_clock_tree
5*61c4878aSAndroid Build Coastguard Worker================
6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module::
7*61c4878aSAndroid Build Coastguard Worker   :name: pw_clock_tree
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard Worker   - **Constinit compatible**: Clock tree elements can be declared as ``constinit``
10*61c4878aSAndroid Build Coastguard Worker   - **Platform independent**: Clock tree management sits above the platform layer
11*61c4878aSAndroid Build Coastguard Worker   - **Handles complex topologies**: Clock tree elements can be used to model
12*61c4878aSAndroid Build Coastguard Worker     complex clock tree topologies
13*61c4878aSAndroid Build Coastguard Worker
14*61c4878aSAndroid Build Coastguard Worker``pw_clock_tree`` provides class definitions to implement a platform
15*61c4878aSAndroid Build Coastguard Workerspecific clock tree management solution. By passing the clock tree element
16*61c4878aSAndroid Build Coastguard Workerthat clocks a particular device to the corresponding device driver, the
17*61c4878aSAndroid Build Coastguard Workerdevice driver can ensure that the clock is only enabled when required to
18*61c4878aSAndroid Build Coastguard Workermaximize power savings.
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard WorkerFor example the clock tree functionality could be integrated into a uart device driver
21*61c4878aSAndroid Build Coastguard Workerlike this:
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
24*61c4878aSAndroid Build Coastguard Worker   :language: cpp
25*61c4878aSAndroid Build Coastguard Worker   :linenos:
26*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-IntegrationIntoDeviceDriversClassDef]
27*61c4878aSAndroid Build Coastguard Worker   :end-before: // Device constructor that optionally accepts
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard WorkerIt could be initialized and used like this:
30*61c4878aSAndroid Build Coastguard Worker
31*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples.cc
32*61c4878aSAndroid Build Coastguard Worker   :language: cpp
33*61c4878aSAndroid Build Coastguard Worker   :linenos:
34*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_clock_tree-examples-IntegrationIntoDeviceDriversUsage]
35*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_clock_tree-examples-IntegrationIntoDeviceDriversUsage]
36*61c4878aSAndroid Build Coastguard Worker
37*61c4878aSAndroid Build Coastguard Worker.. grid:: 2
38*61c4878aSAndroid Build Coastguard Worker
39*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`rocket` Quickstart
40*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_clock_tree-examples
41*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
42*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-primary
43*61c4878aSAndroid Build Coastguard Worker
44*61c4878aSAndroid Build Coastguard Worker      Examples that show how to integrate a clock tree into a device driver,
45*61c4878aSAndroid Build Coastguard Worker      and how to define and use platform specific clock tree elements.
46*61c4878aSAndroid Build Coastguard Worker
47*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`code-square` Reference
48*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_clock_tree-reference
49*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
50*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
51*61c4878aSAndroid Build Coastguard Worker
52*61c4878aSAndroid Build Coastguard Worker      API references for ``pw::clock_tree::Element``,
53*61c4878aSAndroid Build Coastguard Worker      ``pw::clock_tree::DependentElement``, ``pw::clock_tree::ClockTree``,
54*61c4878aSAndroid Build Coastguard Worker      and more.
55*61c4878aSAndroid Build Coastguard Worker
56*61c4878aSAndroid Build Coastguard Worker
57*61c4878aSAndroid Build Coastguard Worker--------
58*61c4878aSAndroid Build Coastguard WorkerOverview
59*61c4878aSAndroid Build Coastguard Worker--------
60*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree::ClockTree
61*61c4878aSAndroid Build Coastguard Worker
62*61c4878aSAndroid Build Coastguard WorkerPigweed's clock tree module provides the ability to represent the clock tree of an embedded
63*61c4878aSAndroid Build Coastguard Workerdevice, and to manage the individual clocks and clock tree elements.
64*61c4878aSAndroid Build Coastguard Worker
65*61c4878aSAndroid Build Coastguard WorkerThe :cpp:class:`ClockTree` implements two basic methods that apply to all clock tree elements:
66*61c4878aSAndroid Build Coastguard Worker
67*61c4878aSAndroid Build Coastguard Worker* :cpp:func:`Acquire`
68*61c4878aSAndroid Build Coastguard Worker* :cpp:func:`Release`
69*61c4878aSAndroid Build Coastguard Worker
70*61c4878aSAndroid Build Coastguard WorkerIn addition, clock divider elements can use the :cpp:func:`SetDividerValue` method to update the current
71*61c4878aSAndroid Build Coastguard Workerclock divider value.
72*61c4878aSAndroid Build Coastguard Worker
73*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop::
74*61c4878aSAndroid Build Coastguard Worker
75*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree::Element
76*61c4878aSAndroid Build Coastguard Worker
77*61c4878aSAndroid Build Coastguard WorkerThe clock tree module defines the :cpp:class:`Element` abstract class from which all
78*61c4878aSAndroid Build Coastguard Workerother classes are derived from. The :cpp:class:`Element` abstract class implements basic reference
79*61c4878aSAndroid Build Coastguard Workercounting methods :cpp:func:`IncRef` and :cpp:func:`DecRef`, but requires derived classes to use the
80*61c4878aSAndroid Build Coastguard Workerreference counting methods to properly acquire and release references to clock
81*61c4878aSAndroid Build Coastguard Workertree elements. If an :cpp:class:`Element` reference is passed to a constructor of a
82*61c4878aSAndroid Build Coastguard Workerderived :cpp:class:`Element`, the class object depends on the referenced :cpp:class:`Element` object.
83*61c4878aSAndroid Build Coastguard Worker
84*61c4878aSAndroid Build Coastguard WorkerThree derived abstract classes are defined for :cpp:class:`Element`:
85*61c4878aSAndroid Build Coastguard Worker
86*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop::
87*61c4878aSAndroid Build Coastguard Worker
88*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree
89*61c4878aSAndroid Build Coastguard Worker
90*61c4878aSAndroid Build Coastguard Worker* :cpp:class:`ElementBlocking` for clock tree elements that might block when acquired or released.
91*61c4878aSAndroid Build Coastguard Worker  Acquiring or releasing such a clock tree element might fail.
92*61c4878aSAndroid Build Coastguard Worker* :cpp:class:`ElementNonBlockingCannotFail` for clock tree elements that will not block when
93*61c4878aSAndroid Build Coastguard Worker  acquired or released. Acquiring or releasing such a clock tree element will always succeed.
94*61c4878aSAndroid Build Coastguard Worker* :cpp:class:`ElementNonBlockingMightFail` for clock tree elements that will not block when
95*61c4878aSAndroid Build Coastguard Worker  acquired or released. Acquiring or releasing such a clock tree element might fail.
96*61c4878aSAndroid Build Coastguard Worker
97*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingCannotFail` and :cpp:class:`ElementsNonBlockingMightFail` elements can
98*61c4878aSAndroid Build Coastguard Workerbe acquired from an interrupt context.
99*61c4878aSAndroid Build Coastguard Worker
100*61c4878aSAndroid Build Coastguard WorkerAll classes representing a clock tree element should be implemented as a template and accept
101*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementBlocking`, :cpp:class:`ElementNonBlockingCannotFail` or
102*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingMightFail` as a template argument. Only if it is known at compile time
103*61c4878aSAndroid Build Coastguard Workerthat a clock tree element can only be either blocking or non-blocking, one can directly derive the
104*61c4878aSAndroid Build Coastguard Workerclass from :cpp:class:`ElementBlocking` or :cpp:class:`ElementNonBlockingCannotFail` /
105*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingMightFail`, respectively.
106*61c4878aSAndroid Build Coastguard Worker
107*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop::
108*61c4878aSAndroid Build Coastguard Worker
109*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree::ElementController
110*61c4878aSAndroid Build Coastguard Worker
111*61c4878aSAndroid Build Coastguard WorkerFor ease of use :cpp:class:`ElementController` encapsulates :cpp:class:`ClockTree` and :cpp:class:`Element` into a single object and provides :cpp:func:`Acquire` and :cpp:func:`Release` methods that check whether both optional objects have been specified, and only if yes, call the respective :cpp:class:`ClockTree` methods, otherwise they return ``pw::OkStatus()``.
112*61c4878aSAndroid Build Coastguard Worker
113*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop::
114*61c4878aSAndroid Build Coastguard Worker
115*61c4878aSAndroid Build Coastguard Worker---------------
116*61c4878aSAndroid Build Coastguard WorkerSynchronization
117*61c4878aSAndroid Build Coastguard Worker---------------
118*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-push:: pw::clock_tree
119*61c4878aSAndroid Build Coastguard Worker
120*61c4878aSAndroid Build Coastguard WorkerThe clock tree class uses a mutex to serialize access to :cpp:class:`ElementBlocking` clock tree
121*61c4878aSAndroid Build Coastguard Workerelements, and uses an interrupt spin lock to serialize access to
122*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingCannotFail` and :cpp:class:`ElementNonBlockingMightFail` clock tree
123*61c4878aSAndroid Build Coastguard Workerelements. :cpp:class:`ElementBlocking` clock tree elements and
124*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingCannotFail` / :cpp:class:`ElementNonBlockingMightFail` clock tree
125*61c4878aSAndroid Build Coastguard Workerelements are not serialized with each other, while :cpp:class:`ElementNonBlockingCannotFail` and
126*61c4878aSAndroid Build Coastguard Worker:cpp:class:`ElementNonBlockingMightFail` are serialized with each other.
127*61c4878aSAndroid Build Coastguard Worker
128*61c4878aSAndroid Build Coastguard Worker.. cpp:namespace-pop::
129*61c4878aSAndroid Build Coastguard Worker
130*61c4878aSAndroid Build Coastguard Worker.. toctree::
131*61c4878aSAndroid Build Coastguard Worker   :hidden:
132*61c4878aSAndroid Build Coastguard Worker   :maxdepth: 1
133*61c4878aSAndroid Build Coastguard Worker
134*61c4878aSAndroid Build Coastguard Worker   examples
135*61c4878aSAndroid Build Coastguard Worker   api
136*61c4878aSAndroid Build Coastguard Worker   implementations
137