Message ID | 6a4a0da974d5944a111af6f0b57bcba63a91fe40.1434369079.git.viresh.kumar@linaro.org |
---|---|
State | New |
Headers | show |
On 17-07-15, 12:22, Stephen Boyd wrote: > On 06/15/2015 04:57 AM, Viresh Kumar wrote: > >diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c > >index 6b554e417b1f..0022453e4b60 100644 > >--- a/drivers/base/power/opp.c > >+++ b/drivers/base/power/opp.c > >@@ -1218,6 +1219,8 @@ static int _of_init_opp_table_v2(struct device *dev, > > goto put_opp_np; > > if (!ret) { > >+ const phandle *handle; > >+ > > if (!dev_opp) { > > dev_opp = _find_device_opp(dev); > > if (WARN_ON(!dev_opp)) > >@@ -1227,6 +1230,25 @@ static int _of_init_opp_table_v2(struct device *dev, > > dev_opp->np = opp_np; > > if (of_get_property(opp_np, "opp-shared", NULL)) > > dev_opp->shared_opp = true; > >+ > >+ /* OPP to select on device suspend */ > >+ handle = of_get_property(opp_np, "opp-suspend", NULL); > >+ if (handle) { > >+ struct device_node *suspend_opp_np; > >+ struct dev_pm_opp *opp; > >+ > >+ suspend_opp_np = of_find_node_by_phandle(be32_to_cpup(handle)); > > Couldn't this be done with of_parse_phandle() instead? Otherwise the > patch looks ok. Yeah, it could have been. Over that, this patch requires certain modifications as the bindings changed this property before merging. Its now part of individual OPPs and so no phandles. I will reiterate the patches soon with updates.
diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c index 6b554e417b1f..0022453e4b60 100644 --- a/drivers/base/power/opp.c +++ b/drivers/base/power/opp.c @@ -137,6 +137,7 @@ struct device_opp { struct device_node *np; unsigned long clock_latency_ns_max; bool shared_opp; + struct dev_pm_opp *suspend_opp; }; /* @@ -1218,6 +1219,8 @@ static int _of_init_opp_table_v2(struct device *dev, goto put_opp_np; if (!ret) { + const phandle *handle; + if (!dev_opp) { dev_opp = _find_device_opp(dev); if (WARN_ON(!dev_opp)) @@ -1227,6 +1230,25 @@ static int _of_init_opp_table_v2(struct device *dev, dev_opp->np = opp_np; if (of_get_property(opp_np, "opp-shared", NULL)) dev_opp->shared_opp = true; + + /* OPP to select on device suspend */ + handle = of_get_property(opp_np, "opp-suspend", NULL); + if (handle) { + struct device_node *suspend_opp_np; + struct dev_pm_opp *opp; + + suspend_opp_np = of_find_node_by_phandle(be32_to_cpup(handle)); + + list_for_each_entry_rcu(opp, &dev_opp->opp_list, node) + if (opp->np == suspend_opp_np) { + dev_opp->suspend_opp = opp; + break; + } + + if (!dev_opp->suspend_opp) + dev_err(dev, "%s: Invalid opp-suspend\n", + __func__); + } } else { of_free_opp_table(dev); }
With "operating-points-v2" bindings, its possible to specify the OPP to which the device must be switched, before suspending. This patch adds support for getting that information. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- drivers/base/power/opp.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)