aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/opp/of.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/opp/of.c b/drivers/opp/of.c
index 62504b18f198..c10c782d15aa 100644
--- a/drivers/opp/of.c
+++ b/drivers/opp/of.c
@@ -173,7 +173,7 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table,
173 struct opp_table **required_opp_tables; 173 struct opp_table **required_opp_tables;
174 struct device **genpd_virt_devs = NULL; 174 struct device **genpd_virt_devs = NULL;
175 struct device_node *required_np, *np; 175 struct device_node *required_np, *np;
176 int count, i; 176 int count, count_pd, i;
177 177
178 /* Traversing the first OPP node is all we need */ 178 /* Traversing the first OPP node is all we need */
179 np = of_get_next_available_child(opp_np, NULL); 179 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,
186 if (!count) 186 if (!count)
187 goto put_np; 187 goto put_np;
188 188
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) {
190 genpd_virt_devs = kcalloc(count, sizeof(*genpd_virt_devs), 202 genpd_virt_devs = kcalloc(count, sizeof(*genpd_virt_devs),
191 GFP_KERNEL); 203 GFP_KERNEL);
192 if (!genpd_virt_devs) 204 if (!genpd_virt_devs)