| * Generic PM domains |
| |
| System on chip designs are often divided into multiple PM domains that can be |
| used for power gating of selected IP blocks for power saving by reduced leakage |
| current. |
| |
| This device tree binding can be used to bind PM domain consumer devices with |
| their PM domains provided by PM domain providers. A PM domain provider can be |
| represented by any node in the device tree and can provide one or more PM |
| domains. A consumer node can refer to the provider by a phandle and a set of |
| phandle arguments (so called PM domain specifiers) of length specified by the |
| #power-domain-cells property in the PM domain provider node. |
| |
| ==PM domain providers== |
| |
| Required properties: |
| - #power-domain-cells : Number of cells in a PM domain specifier; |
| Typically 0 for nodes representing a single PM domain and 1 for nodes |
| providing multiple PM domains (e.g. power controllers), but can be any value |
| as specified by device tree binding documentation of particular provider. |
| |
| Optional properties: |
| - power-domains : A phandle and PM domain specifier as defined by bindings of |
| the power controller specified by phandle. |
| Some power domains might be powered from another power domain (or have |
| other hardware specific dependencies). For representing such dependency |
| a standard PM domain consumer binding is used. When provided, all domains |
| created by the given provider should be subdomains of the domain |
| specified by this binding. More details about power domain specifier are |
| available in the next section. |
| |
| - domain-idle-states : A phandle of an idle-state that shall be soaked into a |
| generic domain power state. The idle state definitions are |
| compatible with domain-idle-state specified in [1]. phandles |
| that are not compatible with domain-idle-state will be |
| ignored. |
| The domain-idle-state property reflects the idle state of this PM domain and |
| not the idle states of the devices or sub-domains in the PM domain. Devices |
| and sub-domains have their own idle-states independent of the parent |
| domain's idle states. In the absence of this property, the domain would be |
| considered as capable of being powered-on or powered-off. |
| |
| - operating-points-v2 : Phandles to the OPP tables of power domains provided by |
| a power domain provider. If the provider provides a single power domain only |
| or all the power domains provided by the provider have identical OPP tables, |
| then this shall contain a single phandle. Refer to ../opp/opp.txt for more |
| information. |
| |
| Example: |
| |
| power: power-controller@12340000 { |
| compatible = "foo,power-controller"; |
| reg = <0x12340000 0x1000>; |
| #power-domain-cells = <1>; |
| }; |
| |
| The node above defines a power controller that is a PM domain provider and |
| expects one cell as its phandle argument. |
| |
| Example 2: |
| |
| parent: power-controller@12340000 { |
| compatible = "foo,power-controller"; |
| reg = <0x12340000 0x1000>; |
| #power-domain-cells = <1>; |
| }; |
| |
| child: power-controller@12341000 { |
| compatible = "foo,power-controller"; |
| reg = <0x12341000 0x1000>; |
| power-domains = <&parent 0>; |
| #power-domain-cells = <1>; |
| }; |
| |
| The nodes above define two power controllers: 'parent' and 'child'. |
| Domains created by the 'child' power controller are subdomains of '0' power |
| domain provided by the 'parent' power controller. |
| |
| Example 3: |
| parent: power-controller@12340000 { |
| compatible = "foo,power-controller"; |
| reg = <0x12340000 0x1000>; |
| #power-domain-cells = <0>; |
| domain-idle-states = <&DOMAIN_RET>, <&DOMAIN_PWR_DN>; |
| }; |
| |
| child: power-controller@12341000 { |
| compatible = "foo,power-controller"; |
| reg = <0x12341000 0x1000>; |
| power-domains = <&parent>; |
| #power-domain-cells = <0>; |
| domain-idle-states = <&DOMAIN_PWR_DN>; |
| }; |
| |
| DOMAIN_RET: state@0 { |
| compatible = "domain-idle-state"; |
| reg = <0x0>; |
| entry-latency-us = <1000>; |
| exit-latency-us = <2000>; |
| min-residency-us = <10000>; |
| }; |
| |
| DOMAIN_PWR_DN: state@1 { |
| compatible = "domain-idle-state"; |
| reg = <0x1>; |
| entry-latency-us = <5000>; |
| exit-latency-us = <8000>; |
| min-residency-us = <7000>; |
| }; |
| |
| ==PM domain consumers== |
| |
| Required properties: |
| - power-domains : A list of PM domain specifiers, as defined by bindings of |
| the power controller that is the PM domain provider. |
| |
| Optional properties: |
| - power-domain-names : A list of power domain name strings sorted in the same |
| order as the power-domains property. Consumers drivers will use |
| power-domain-names to match power domains with power-domains |
| specifiers. |
| |
| Example: |
| |
| leaky-device@12350000 { |
| compatible = "foo,i-leak-current"; |
| reg = <0x12350000 0x1000>; |
| power-domains = <&power 0>; |
| power-domain-names = "io"; |
| }; |
| |
| leaky-device@12351000 { |
| compatible = "foo,i-leak-current"; |
| reg = <0x12351000 0x1000>; |
| power-domains = <&power 0>, <&power 1> ; |
| power-domain-names = "io", "clk"; |
| }; |
| |
| The first example above defines a typical PM domain consumer device, which is |
| located inside a PM domain with index 0 of a power controller represented by a |
| node with the label "power". |
| In the second example the consumer device are partitioned across two PM domains, |
| the first with index 0 and the second with index 1, of a power controller that |
| is represented by a node with the label "power". |
| |
| Optional properties: |
| - required-opps: This contains phandle to an OPP node in another device's OPP |
| table. It may contain an array of phandles, where each phandle points to an |
| OPP of a different device. It should not contain multiple phandles to the OPP |
| nodes in the same OPP table. This specifies the minimum required OPP of the |
| device(s), whose OPP's phandle is present in this property, for the |
| functioning of the current device at the current OPP (where this property is |
| present). |
| |
| Example: |
| - OPP table for domain provider that provides two domains. |
| |
| domain0_opp_table: opp-table0 { |
| compatible = "operating-points-v2"; |
| |
| domain0_opp_0: opp-1000000000 { |
| opp-hz = /bits/ 64 <1000000000>; |
| opp-microvolt = <975000 970000 985000>; |
| }; |
| domain0_opp_1: opp-1100000000 { |
| opp-hz = /bits/ 64 <1100000000>; |
| opp-microvolt = <1000000 980000 1010000>; |
| }; |
| }; |
| |
| domain1_opp_table: opp-table1 { |
| compatible = "operating-points-v2"; |
| |
| domain1_opp_0: opp-1200000000 { |
| opp-hz = /bits/ 64 <1200000000>; |
| opp-microvolt = <975000 970000 985000>; |
| }; |
| domain1_opp_1: opp-1300000000 { |
| opp-hz = /bits/ 64 <1300000000>; |
| opp-microvolt = <1000000 980000 1010000>; |
| }; |
| }; |
| |
| power: power-controller@12340000 { |
| compatible = "foo,power-controller"; |
| reg = <0x12340000 0x1000>; |
| #power-domain-cells = <1>; |
| operating-points-v2 = <&domain0_opp_table>, <&domain1_opp_table>; |
| }; |
| |
| leaky-device0@12350000 { |
| compatible = "foo,i-leak-current"; |
| reg = <0x12350000 0x1000>; |
| power-domains = <&power 0>; |
| required-opps = <&domain0_opp_0>; |
| }; |
| |
| leaky-device1@12350000 { |
| compatible = "foo,i-leak-current"; |
| reg = <0x12350000 0x1000>; |
| power-domains = <&power 1>; |
| required-opps = <&domain1_opp_1>; |
| }; |
| |
| [1]. Documentation/devicetree/bindings/power/domain-idle-state.txt |