[V2,2/2] cpufreq: dt: Implement online/offline() callbacks

Message ID 8030961ef762018fc286e4d3d3a010638e900e53.1549955027.git.viresh.kumar@linaro.org
State New
Headers show
Series
  • [V2,1/2] cpufreq: Allow light-weight tear down and bring up of CPUs
Related show

Commit Message

Viresh Kumar Feb. 12, 2019, 7:06 a.m.
Implement the light-weight tear down and bring up helpers to reduce the
amount of work to do on CPU offline/online operation.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>

---
 drivers/cpufreq/cpufreq-dt.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

-- 
2.20.1.321.g9e740568ce00

Comments

Viresh Kumar Feb. 12, 2019, 9:49 a.m. | #1
On 12-02-19, 10:43, Rafael J. Wysocki wrote:
> On Tue, Feb 12, 2019 at 8:07 AM Viresh Kumar <viresh.kumar@linaro.org> wrote:

> >

> > Implement the light-weight tear down and bring up helpers to reduce the

> > amount of work to do on CPU offline/online operation.

> >

> > Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>

> > ---

> >  drivers/cpufreq/cpufreq-dt.c | 17 +++++++++++++++++

> >  1 file changed, 17 insertions(+)

> >

> > diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c

> > index 7ba392911cd0..1aefaa1b0ca2 100644

> > --- a/drivers/cpufreq/cpufreq-dt.c

> > +++ b/drivers/cpufreq/cpufreq-dt.c

> > @@ -295,6 +295,21 @@ static int cpufreq_init(struct cpufreq_policy *policy)

> >         return ret;

> >  }

> >

> > +static int cpufreq_online(struct cpufreq_policy *policy)

> > +{

> > +       /* We did light-weight tear down earlier, nothing to do here */

> > +       return 0;

> > +}

> 

> I think you could avoid having to add this empty stub if the core

> checked for both online and offline, that is

> 

> if (driver->offline || driver->online) {


This doesn't look great as all we should care about here is ->online()
and checking for offline as well looks a bit hacky.

>     ret = driver->online ? driver->online(policy) : 0;

> } else {

>     ret = driver->init(policy);

> }

> 

> or similar.


I also thought of a new flag like: CPUFREQ_LIGHT_WEIGHT_OFFLINE and
then we can get rid of both online/offline dummies but then thought of
starting with the dummy routines to begin with :)

-- 
viresh

Patch

diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c
index 7ba392911cd0..1aefaa1b0ca2 100644
--- a/drivers/cpufreq/cpufreq-dt.c
+++ b/drivers/cpufreq/cpufreq-dt.c
@@ -295,6 +295,21 @@  static int cpufreq_init(struct cpufreq_policy *policy)
 	return ret;
 }
 
+static int cpufreq_online(struct cpufreq_policy *policy)
+{
+	/* We did light-weight tear down earlier, nothing to do here */
+	return 0;
+}
+
+static int cpufreq_offline(struct cpufreq_policy *policy)
+{
+	/*
+	 * Preserve policy->driver_data and don't free resources on light-weight
+	 * tear down.
+	 */
+	return 0;
+}
+
 static int cpufreq_exit(struct cpufreq_policy *policy)
 {
 	struct private_data *priv = policy->driver_data;
@@ -319,6 +334,8 @@  static struct cpufreq_driver dt_cpufreq_driver = {
 	.get = cpufreq_generic_get,
 	.init = cpufreq_init,
 	.exit = cpufreq_exit,
+	.online = cpufreq_online,
+	.offline = cpufreq_offline,
 	.name = "cpufreq-dt",
 	.attr = cpufreq_dt_attr,
 	.suspend = cpufreq_generic_suspend,