On 06-03-19, 09:37, Rajendra Nayak wrote: > 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@xxxxxxxxxxxxxx> > --- > drivers/opp/of.c | 16 ++++++++++++++-- > 1 file changed, 14 insertions(+), 2 deletions(-) > > diff --git a/drivers/opp/of.c b/drivers/opp/of.c > index 06f0f632ec47..443c305ae100 100644 > --- a/drivers/opp/of.c > +++ b/drivers/opp/of.c > @@ -172,7 +172,7 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table, > struct opp_table **required_opp_tables; > struct device **genpd_virt_devs = NULL; > struct device_node *required_np, *np; > - int count, i; > + int count, count_pd, i; > > /* Traversing the first OPP node is all we need */ > np = of_get_next_available_child(opp_np, NULL); > @@ -185,7 +185,19 @@ static void _opp_table_alloc_required_tables(struct opp_table *opp_table, > if (!count) > goto put_np; > > - if (count > 1) { > + /* > + * Check the number of power-domains to know if we need to deal > + * with virtual devices. In some cases we have devices with multiple > + * power domains but with only one of them being scalable, hence > + * 'count' could be 1, but we still have to deal with multiple genpds > + * and virtual devices. > + */ > + count_pd = of_count_phandle_with_args(dev->of_node, "power-domains", > + "#power-domain-cells"); > + if (!count_pd) > + goto put_np; > + > + if (count_pd > 1) { > genpd_virt_devs = kcalloc(count, sizeof(*genpd_virt_devs), > GFP_KERNEL); > if (!genpd_virt_devs) Acked-by: Viresh Kumar <viresh.kumar@xxxxxxxxxx> @Rafael, please pick this up for 5.1-rc2 directly. Thanks. -- viresh