Tom Rini | 53633a8 | 2024-02-29 12:33:36 -0500 | [diff] [blame] | 1 | * Generic PM domains |
| 2 | |
| 3 | System on chip designs are often divided into multiple PM domains that can be |
| 4 | used for power gating of selected IP blocks for power saving by reduced leakage |
| 5 | current. |
| 6 | |
| 7 | This device tree binding can be used to bind PM domain consumer devices with |
| 8 | their PM domains provided by PM domain providers. A PM domain provider can be |
| 9 | represented by any node in the device tree and can provide one or more PM |
| 10 | domains. A consumer node can refer to the provider by a phandle and a set of |
| 11 | phandle arguments (so called PM domain specifiers) of length specified by the |
| 12 | #power-domain-cells property in the PM domain provider node. |
| 13 | |
| 14 | ==PM domain providers== |
| 15 | |
| 16 | See power-domain.yaml. |
| 17 | |
| 18 | ==PM domain consumers== |
| 19 | |
| 20 | Required properties: |
| 21 | - power-domains : A list of PM domain specifiers, as defined by bindings of |
| 22 | the power controller that is the PM domain provider. |
| 23 | |
| 24 | Optional properties: |
| 25 | - power-domain-names : A list of power domain name strings sorted in the same |
| 26 | order as the power-domains property. Consumers drivers will use |
| 27 | power-domain-names to match power domains with power-domains |
| 28 | specifiers. |
| 29 | |
| 30 | Example: |
| 31 | |
| 32 | leaky-device@12350000 { |
| 33 | compatible = "foo,i-leak-current"; |
| 34 | reg = <0x12350000 0x1000>; |
| 35 | power-domains = <&power 0>; |
| 36 | power-domain-names = "io"; |
| 37 | }; |
| 38 | |
| 39 | leaky-device@12351000 { |
| 40 | compatible = "foo,i-leak-current"; |
| 41 | reg = <0x12351000 0x1000>; |
| 42 | power-domains = <&power 0>, <&power 1> ; |
| 43 | power-domain-names = "io", "clk"; |
| 44 | }; |
| 45 | |
| 46 | The first example above defines a typical PM domain consumer device, which is |
| 47 | located inside a PM domain with index 0 of a power controller represented by a |
| 48 | node with the label "power". |
| 49 | In the second example the consumer device are partitioned across two PM domains, |
| 50 | the first with index 0 and the second with index 1, of a power controller that |
| 51 | is represented by a node with the label "power". |
| 52 | |
| 53 | Optional properties: |
| 54 | - required-opps: This contains phandle to an OPP node in another device's OPP |
| 55 | table. It may contain an array of phandles, where each phandle points to an |
| 56 | OPP of a different device. It should not contain multiple phandles to the OPP |
| 57 | nodes in the same OPP table. This specifies the minimum required OPP of the |
| 58 | device(s), whose OPP's phandle is present in this property, for the |
| 59 | functioning of the current device at the current OPP (where this property is |
| 60 | present). |
| 61 | |
| 62 | Example: |
| 63 | - OPP table for domain provider that provides two domains. |
| 64 | |
| 65 | domain0_opp_table: opp-table0 { |
| 66 | compatible = "operating-points-v2"; |
| 67 | |
| 68 | domain0_opp_0: opp-1000000000 { |
| 69 | opp-hz = /bits/ 64 <1000000000>; |
| 70 | opp-microvolt = <975000 970000 985000>; |
| 71 | }; |
| 72 | domain0_opp_1: opp-1100000000 { |
| 73 | opp-hz = /bits/ 64 <1100000000>; |
| 74 | opp-microvolt = <1000000 980000 1010000>; |
| 75 | }; |
| 76 | }; |
| 77 | |
| 78 | domain1_opp_table: opp-table1 { |
| 79 | compatible = "operating-points-v2"; |
| 80 | |
| 81 | domain1_opp_0: opp-1200000000 { |
| 82 | opp-hz = /bits/ 64 <1200000000>; |
| 83 | opp-microvolt = <975000 970000 985000>; |
| 84 | }; |
| 85 | domain1_opp_1: opp-1300000000 { |
| 86 | opp-hz = /bits/ 64 <1300000000>; |
| 87 | opp-microvolt = <1000000 980000 1010000>; |
| 88 | }; |
| 89 | }; |
| 90 | |
| 91 | power: power-controller@12340000 { |
| 92 | compatible = "foo,power-controller"; |
| 93 | reg = <0x12340000 0x1000>; |
| 94 | #power-domain-cells = <1>; |
| 95 | operating-points-v2 = <&domain0_opp_table>, <&domain1_opp_table>; |
| 96 | }; |
| 97 | |
| 98 | leaky-device0@12350000 { |
| 99 | compatible = "foo,i-leak-current"; |
| 100 | reg = <0x12350000 0x1000>; |
| 101 | power-domains = <&power 0>; |
| 102 | required-opps = <&domain0_opp_0>; |
| 103 | }; |
| 104 | |
| 105 | leaky-device1@12350000 { |
| 106 | compatible = "foo,i-leak-current"; |
| 107 | reg = <0x12350000 0x1000>; |
| 108 | power-domains = <&power 1>; |
| 109 | required-opps = <&domain1_opp_1>; |
| 110 | }; |
| 111 | |
| 112 | [1]. Documentation/devicetree/bindings/power/domain-idle-state.yaml |