opp: of: Support multiple suspend OPPs defined in DT
authorAnson Huang <Anson.Huang@nxp.com>
Tue, 9 Jul 2019 08:00:13 +0000 (16:00 +0800)
committerViresh Kumar <viresh.kumar@linaro.org>
Fri, 26 Jul 2019 07:55:52 +0000 (13:25 +0530)
With property "opp-supported-hw" introduced, the OPP table
in DT could be a large OPP table and ONLY a subset of OPPs
are available, based on the version of the hardware running
on. That introduces restriction of using "opp-suspend"
property to define the suspend OPP, as we are NOT sure if the
OPP containing "opp-suspend" property is available for the
hardware running on, and the of opp core does NOT allow multiple
suspend OPPs defined in DT OPP table.

To eliminate this restrition, make of opp core allow multiple
suspend OPPs defined in DT, and pick the OPP with highest rate
and with "opp-suspend" property present to be suspend OPP, it
can speed up the suspend/resume process.

Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
drivers/opp/of.c

index 698a92c..1813f5a 100644 (file)
@@ -617,9 +617,12 @@ static struct dev_pm_opp *_opp_add_static_v2(struct opp_table *opp_table,
        /* OPP to select on device suspend */
        if (of_property_read_bool(np, "opp-suspend")) {
                if (opp_table->suspend_opp) {
-                       dev_warn(dev, "%s: Multiple suspend OPPs found (%lu %lu)\n",
-                                __func__, opp_table->suspend_opp->rate,
-                                new_opp->rate);
+                       /* Pick the OPP with higher rate as suspend OPP */
+                       if (new_opp->rate > opp_table->suspend_opp->rate) {
+                               opp_table->suspend_opp->suspend = false;
+                               new_opp->suspend = true;
+                               opp_table->suspend_opp = new_opp;
+                       }
                } else {
                        new_opp->suspend = true;
                        opp_table->suspend_opp = new_opp;