clk: qcom: Support attaching GDSCs to multiple parents
When a clock-controller has multiple power-domains we need to attach the
GDSCs provided by the clock-controller to each of the list of power-domains
as power subdomains of each of the power-domains respectively.
GDSCs come in three forms:
1. A GDSC which has no parent GDSC in the controller and no child GDSCs.
2. A GDSC which has no parent GDSC in the controller and has child GDSCs.
3. A child GDSC which derives power from the parent GDSC @ #2.
Cases 1 and 2 are "top-level" GDSCs which depend on the power-domains - the
power-rails attached to the clock-controller to power-on.
When dtsi::power-domains = <> points to a single power-domain, Linux'
platform probe code takes care of hooking up the referenced power-domains
to the clock-controller.
When dtsi::power-domains = <> points to more than one power-domain we must
take responsibility to attach the list of power-domains to our
clock-controller.
An added complexity is that currently gdsc_enable() and gdsc_disable() do
not register the top-level GDSCs as power subdomains of the controller's
power-domains.
This patch makes the subdomain association between whatever list of
top-level GDSCs a clock-controller provides and the power-domain list of
that clock-controller.
What we don't do here is take responsibility to adjust the voltages on
those power-rails when ramping clock frequencies - PLL rates - inside of
the clock-controller.
That voltage adjustment should be performed by operating-point/performance
setpoint code in the driver requesting the new frequency.
There are some questions that it is worth discussing in the commit log:
1. Should there be a hierarchy of power-domains in the clock-controller ?
In other words if a list of dtsi::power-domains = <pd_a, pd_b, ..>
should a specific hierarchy be applied by the gdsc code somehow ?
The short answer is no, you must properly represent power-domain
dependencies in your dtsi.
Do this:
pd_a {
compat = "qcom, power-domain-a";
power-domains = <&pd_c>;
};
pd_b {
compat = "qcom, power-domain-b";
};
pd_c {
compat = "qcom, power-domain-c";
};
clock-controller {
compat ="qcom, some-clock-controller";
power-domains = <&pd_a, &pd_b>;
}
Not this:
pd_a {
compat = "qcom, power-domain-a";
};
pd_b {
compat = "qcom, power-domain-b";
};
pd_c {
compat = "qcom, power-domain-c";
};
clock-controller {
compat ="qcom, some-clock-controller";
power-domains = <&pd_c, &pd_a, &pd_b>;
}
2. Should each GDSC inside a clock-controller be attached to each
power-domain listed in dtsi::power-domains = <> ?
In other words should child GDSCs attach to the power-domain list.
The answer to this is no. GDSCs which are children of a GDSC within a
clock-controller need only attach to the parent GDSC.
With a single power-domain or a list of power-domains either way only
the parent/top-level GDSC needs to be a subdomain of the input
dtsi::power-domains = <>.
3. Should top-level GDSCs inside the clock-controller attach to each
power-domain in the clock-controller.
Yes a GDSC that has no parent GDSC inside of the clock-controller has an
inferred dependency on the power-domains powering the clock-controller.
4. Performance states
Right now the best information we have is that performance states should
be applied to a power-domain list equally.
Future implementations may have more detail to differentiate the option
to vote for different voltages on different power-domains when setting
clock frequencies.
Either way setting the performance state of the power-domains for the
clock-controller should be represented by operating-point code in the
hardware driver which depends on the clocks not in the
gdsc_enable()/gdsc_disable() path.
Signed-off-by:
Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Loading
Please register or sign in to comment