linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: viresh.kumar@linaro.org (Viresh Kumar)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH V3 14/16] cpufreq: Allow drivers to enable boost support after registering driver
Date: Wed, 29 Jul 2015 16:23:09 +0530	[thread overview]
Message-ID: <98379f9625b9cc8ade2e052c29e86c29e11cea5e.1438166099.git.viresh.kumar@linaro.org> (raw)
In-Reply-To: <cover.1438166099.git.viresh.kumar@linaro.org>

In some cases it wouldn't be known at time of driver registration, if
the driver needs to support boost frequencies.

For example, while getting boost information from DT with opp-v2
bindings, we need to parse the bindings for all the CPUs to know if
turbo/boost OPPs are supported or not.

One way out to do that efficiently is to delay supporting boost mode
(i.e. creating /sys/devices/system/cpu/cpufreq/boost file), until the
time OPP bindings are parsed.

At that point, the driver can enable boost support. This can be done at
->init(), where the frequency table is created.

To do that, the driver requires few APIs from cpufreq core that let him
do this. This patch provides these APIs.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
 drivers/cpufreq/cpufreq.c    | 68 +++++++++++++++++++++++++++++++-------------
 drivers/cpufreq/freq_table.c | 15 ++++++++++
 include/linux/cpufreq.h      | 12 ++++++++
 3 files changed, 75 insertions(+), 20 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 46251e8d30f2..db4390ca5243 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -2459,6 +2459,49 @@ int cpufreq_boost_supported(void)
 }
 EXPORT_SYMBOL_GPL(cpufreq_boost_supported);
 
+static int create_boost_sysfs_file(void)
+{
+	int ret;
+
+	if (!cpufreq_boost_supported())
+		return 0;
+
+	/*
+	 * Check if driver provides function to enable boost -
+	 * if not, use cpufreq_boost_set_sw as default
+	 */
+	if (!cpufreq_driver->set_boost)
+		cpufreq_driver->set_boost = cpufreq_boost_set_sw;
+
+	ret = cpufreq_sysfs_create_file(&boost.attr);
+	if (ret)
+		pr_err("%s: cannot register global BOOST sysfs file\n",
+		       __func__);
+
+	return ret;
+}
+
+static void remove_boost_sysfs_file(void)
+{
+	if (cpufreq_boost_supported())
+		cpufreq_sysfs_remove_file(&boost.attr);
+}
+
+int cpufreq_enable_boost_support(void)
+{
+	if (!cpufreq_driver)
+		return -EINVAL;
+
+	if (cpufreq_boost_supported())
+		return 0;
+
+	cpufreq_driver->boost_supported = true;
+
+	/* This will get removed on driver unregister */
+	return create_boost_sysfs_file();
+}
+EXPORT_SYMBOL_GPL(cpufreq_enable_boost_support);
+
 int cpufreq_boost_enabled(void)
 {
 	return cpufreq_driver->boost_enabled;
@@ -2508,21 +2551,9 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 	if (driver_data->setpolicy)
 		driver_data->flags |= CPUFREQ_CONST_LOOPS;
 
-	if (cpufreq_boost_supported()) {
-		/*
-		 * Check if driver provides function to enable boost -
-		 * if not, use cpufreq_boost_set_sw as default
-		 */
-		if (!cpufreq_driver->set_boost)
-			cpufreq_driver->set_boost = cpufreq_boost_set_sw;
-
-		ret = cpufreq_sysfs_create_file(&boost.attr);
-		if (ret) {
-			pr_err("%s: cannot register global BOOST sysfs file\n",
-			       __func__);
-			goto err_null_driver;
-		}
-	}
+	ret = create_boost_sysfs_file();
+	if (ret)
+		goto err_null_driver;
 
 	ret = subsys_interface_register(&cpufreq_interface);
 	if (ret)
@@ -2543,8 +2574,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 err_if_unreg:
 	subsys_interface_unregister(&cpufreq_interface);
 err_boost_unreg:
-	if (cpufreq_boost_supported())
-		cpufreq_sysfs_remove_file(&boost.attr);
+	remove_boost_sysfs_file();
 err_null_driver:
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
 	cpufreq_driver = NULL;
@@ -2573,9 +2603,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
 	/* Protect against concurrent cpu hotplug */
 	get_online_cpus();
 	subsys_interface_unregister(&cpufreq_interface);
-	if (cpufreq_boost_supported())
-		cpufreq_sysfs_remove_file(&boost.attr);
-
+	remove_boost_sysfs_file();
 	unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
 
 	write_lock_irqsave(&cpufreq_driver_lock, flags);
diff --git a/drivers/cpufreq/freq_table.c b/drivers/cpufreq/freq_table.c
index dfbbf981ed56..a8f1daffc9bc 100644
--- a/drivers/cpufreq/freq_table.c
+++ b/drivers/cpufreq/freq_table.c
@@ -18,6 +18,21 @@
  *                     FREQUENCY TABLE HELPERS                       *
  *********************************************************************/
 
+bool policy_has_boost_freq(struct cpufreq_policy *policy)
+{
+	struct cpufreq_frequency_table *pos, *table = policy->freq_table;
+
+	if (!table)
+		return false;
+
+	cpufreq_for_each_valid_entry(pos, table)
+		if (pos->flags & CPUFREQ_BOOST_FREQ)
+			return true;
+
+	return false;
+}
+EXPORT_SYMBOL_GPL(policy_has_boost_freq);
+
 int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
 				    struct cpufreq_frequency_table *table)
 {
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
index bde1e567b3a9..95f018649abf 100644
--- a/include/linux/cpufreq.h
+++ b/include/linux/cpufreq.h
@@ -578,6 +578,8 @@ ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
 int cpufreq_boost_trigger_state(int state);
 int cpufreq_boost_supported(void);
 int cpufreq_boost_enabled(void);
+int cpufreq_enable_boost_support(void);
+bool policy_has_boost_freq(struct cpufreq_policy *policy);
 #else
 static inline int cpufreq_boost_trigger_state(int state)
 {
@@ -591,6 +593,16 @@ static inline int cpufreq_boost_enabled(void)
 {
 	return 0;
 }
+
+static inline int cpufreq_enable_boost_support(void)
+{
+	return -EINVAL;
+}
+
+static inline bool policy_has_boost_freq(struct cpufreq_policy *policy)
+{
+	return false;
+}
 #endif
 /* the following funtion is for cpufreq core use only */
 struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
-- 
2.4.0

  parent reply	other threads:[~2015-07-29 10:53 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-29 10:52 [PATCH V3 00/16] OPP: Add code to support operating-points-v2 bindings Viresh Kumar
2015-07-29 10:52 ` [PATCH V3 01/16] PM / OPP: Update bindings to make opp-hz a 64 bit value Viresh Kumar
2015-07-30 13:23   ` Rob Herring
2015-07-29 10:52 ` [PATCH V3 02/16] PM / OPP: Create a directory for opp bindings Viresh Kumar
2015-07-30 13:18   ` Rob Herring
2015-07-30 13:49     ` Viresh Kumar
2015-07-30 16:24       ` Rob Herring
2015-07-30 16:52         ` Viresh Kumar
2015-07-30 16:57           ` [PATCH V3 resend] " Viresh Kumar
2015-07-29 10:52 ` [PATCH V3 03/16] PM / OPP: Relocate few routines Viresh Kumar
2015-07-29 10:52 ` [PATCH V3 04/16] PM / OPP: Create _remove_device_opp() for freeing dev_opp Viresh Kumar
2015-07-29 10:53 ` [PATCH V3 05/16] PM / OPP: Allocate dev_opp from _add_device_opp() Viresh Kumar
2015-07-29 10:53 ` [PATCH V3 06/16] PM / OPP: Break _opp_add_dynamic() into smaller functions Viresh Kumar
2015-07-31  5:43   ` Stephen Boyd
2015-07-29 10:53 ` [PATCH V3 07/16] PM / OPP: Add support to parse "operating-points-v2" bindings Viresh Kumar
2015-07-31  5:51   ` Stephen Boyd
2015-07-31  5:58     ` Viresh Kumar
2015-07-31  6:20       ` Stephen Boyd
2015-07-29 10:53 ` [PATCH V3 08/16] PM / OPP: Add clock-latency-ns support Viresh Kumar
2015-07-29 10:53 ` [PATCH V3 09/16] PM / OPP: Add OPP sharing information to OPP library Viresh Kumar
2015-07-29 10:53 ` [PATCH V3 10/16] PM / OPP: Add support for opp-suspend Viresh Kumar
2015-07-31  6:24   ` Stephen Boyd
2015-07-31  6:26     ` Viresh Kumar
2015-07-29 10:53 ` [PATCH V3 11/16] PM / OPP: Add helpers for initializing CPU OPPs Viresh Kumar
2015-07-31  6:07   ` Stephen Boyd
2015-07-31  6:13     ` Viresh Kumar
2015-07-29 10:53 ` [PATCH V3 12/16] PM / OPP: add dev_pm_opp_is_turbo() helper Viresh Kumar
2015-07-31  6:10   ` Stephen Boyd
2015-07-31  6:17     ` Viresh Kumar
2015-07-29 10:53 ` [PATCH V3 13/16] cpufreq: Update boost flag while initializing freq table from OPPs Viresh Kumar
2015-07-31  6:11   ` Stephen Boyd
2015-07-29 10:53 ` Viresh Kumar [this message]
2015-07-31  6:12   ` [PATCH V3 14/16] cpufreq: Allow drivers to enable boost support after registering driver Stephen Boyd
2015-07-29 10:53 ` [PATCH V3 15/16] cpufreq: dt: Add support for operating-points-v2 bindings Viresh Kumar
2015-07-31  6:15   ` Stephen Boyd
2015-07-29 10:53 ` [PATCH V3 16/16] cpufreq: dt: Add support for turbo/boost mode Viresh Kumar
2015-07-31  6:16   ` Stephen Boyd
2015-07-31 18:55 ` [PATCH V3 00/16] OPP: Add code to support operating-points-v2 bindings Bartlomiej Zolnierkiewicz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=98379f9625b9cc8ade2e052c29e86c29e11cea5e.1438166099.git.viresh.kumar@linaro.org \
    --to=viresh.kumar@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).