Skip to content

Commit 55286a2

Browse files
Rajendra Nayakrafaeljw
authored andcommitted
OPP: Fix handling of multiple power domains
We seem to rely on the number of phandles specified in the 'required-opps' property to identify cases where a device is associated with multiple power domains and hence would have multiple virtual devices that have to be dealt with. In cases where we do have devices with multiple power domains but with only one of them being scalable, this logic seems to fail. Instead read the number of power domains from DT to identify such cases. Signed-off-by: Rajendra Nayak <rnayak@codeaurora.org> Reviewed-by: Stephen Boyd <sboyd@kernel.org> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent ef80068 commit 55286a2

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

drivers/opp/of.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table,
173173
struct opp_table **required_opp_tables;
174174
struct device **genpd_virt_devs = NULL;
175175
struct device_node *required_np, *np;
176-
int count, i;
176+
int count, count_pd, i;
177177

178178
/* Traversing the first OPP node is all we need */
179179
np = of_get_next_available_child(opp_np, NULL);
@@ -186,7 +186,19 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table,
186186
if (!count)
187187
goto put_np;
188188

189-
if (count > 1) {
189+
/*
190+
* Check the number of power-domains to know if we need to deal
191+
* with virtual devices. In some cases we have devices with multiple
192+
* power domains but with only one of them being scalable, hence
193+
* 'count' could be 1, but we still have to deal with multiple genpds
194+
* and virtual devices.
195+
*/
196+
count_pd = of_count_phandle_with_args(dev->of_node, "power-domains",
197+
"#power-domain-cells");
198+
if (!count_pd)
199+
goto put_np;
200+
201+
if (count_pd > 1) {
190202
genpd_virt_devs = kcalloc(count, sizeof(*genpd_virt_devs),
191203
GFP_KERNEL);
192204
if (!genpd_virt_devs)

0 commit comments

Comments
 (0)