From: Viresh Kumar <viresh.kumar@linaro.org> To: Rafael Wysocki <rjw@rjwysocki.net>, rob.herring@linaro.org, nm@ti.com Cc: linaro-kernel@lists.linaro.org, linux-pm@vger.kernel.org, arnd.bergmann@linaro.org, broonie@kernel.org, mike.turquette@linaro.org, sboyd@codeaurora.org, Sudeep.Holla@arm.com, viswanath.puttagunta@linaro.org, l.stach@pengutronix.de, thomas.petazzoni@free-electrons.com, linux-arm-kernel@lists.infradead.org, ta.omasab@gmail.com, kesavan.abhilash@gmail.com, khilman@linaro.org, santosh.shilimkar@oracle.com, Viresh Kumar <viresh.kumar@linaro.org> Subject: [PATCH 06/10] OPP: Add clock-latency-ns support Date: Mon, 15 Jun 2015 17:27:32 +0530 [thread overview] Message-ID: <1376f9ac3f955e67bd56327ea0ac9aecd06a6070.1434369079.git.viresh.kumar@linaro.org> (raw) In-Reply-To: <cover.1434369079.git.viresh.kumar@linaro.org> In-Reply-To: <cover.1434369079.git.viresh.kumar@linaro.org> With "operating-points-v2" bindings, clock-latency is defined per OPP. Users of this value expect a single value which defines the latency to switch to any clock rate. Find maximum clock-latency-ns from the OPP table to service requests from such users. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- drivers/base/power/opp.c | 41 +++++++++++++++++++++++++++++++++++++++-- include/linux/pm_opp.h | 6 ++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c index 3198c3e77224..fe79e5146a29 100644 --- a/drivers/base/power/opp.c +++ b/drivers/base/power/opp.c @@ -57,6 +57,8 @@ * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP * @u_amp: Maximum current drawn by the device in microamperes + * @clock_latency_ns: Latency (in nanoseconds) of switching to this OPP's + * frequency from any other OPP's frequency. * @dev_opp: points back to the device_opp struct this opp belongs to * @rcu_head: RCU callback head used for deferred freeing * @np: OPP's device node. @@ -79,6 +81,7 @@ struct dev_pm_opp { unsigned long u_volt_min; unsigned long u_volt_max; unsigned long u_amp; + unsigned long clock_latency_ns; struct device_opp *dev_opp; struct rcu_head rcu_head; @@ -113,6 +116,8 @@ struct device_opp { struct srcu_notifier_head srcu_head; struct rcu_head rcu_head; struct list_head opp_list; + + unsigned long clock_latency_ns_max; }; /* @@ -230,6 +235,32 @@ unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp) EXPORT_SYMBOL_GPL(dev_pm_opp_get_freq); /** + * dev_pm_opp_get_max_clock_latency() - Get max clock latency in nanoseconds + * @dev: device for which we do this operation + * + * Return: This function returns the max clock latency in nanoseconds. + * + * Locking: This function takes rcu_read_lock(). + */ +unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev) +{ + struct device_opp *dev_opp; + unsigned long clock_latency_ns; + + rcu_read_lock(); + + dev_opp = _find_device_opp(dev); + if (IS_ERR(dev_opp)) + clock_latency_ns = 0; + else + clock_latency_ns = dev_opp->clock_latency_ns_max; + + rcu_read_unlock(); + return clock_latency_ns; +} +EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_clock_latency); + +/** * dev_pm_opp_get_opp_count() - Get number of opps available in the opp list * @dev: device for which we do this operation * @@ -741,6 +772,8 @@ static int _opp_add_static_v2(struct device *dev, struct device_node *np) new_opp->np = np; new_opp->dynamic = false; new_opp->available = true; + of_property_read_u32(np, "clock-latency-ns", + (u32 *)&new_opp->clock_latency_ns); /* * TODO: Support multiple regulators @@ -765,9 +798,13 @@ static int _opp_add_static_v2(struct device *dev, struct device_node *np) if (ret) goto free_opp; - pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu\n", + if (new_opp->clock_latency_ns > dev_opp->clock_latency_ns_max) + dev_opp->clock_latency_ns_max = new_opp->clock_latency_ns; + + pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu latency:%lu\n", __func__, new_opp->turbo, new_opp->rate, new_opp->u_volt, - new_opp->u_volt_min, new_opp->u_volt_max); + new_opp->u_volt_min, new_opp->u_volt_max, + new_opp->clock_latency_ns); mutex_unlock(&dev_opp_list_lock); diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h index cec2d4540914..20324b579adc 100644 --- a/include/linux/pm_opp.h +++ b/include/linux/pm_opp.h @@ -31,6 +31,7 @@ unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp); int dev_pm_opp_get_opp_count(struct device *dev); +unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev); struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, unsigned long freq, @@ -67,6 +68,11 @@ static inline int dev_pm_opp_get_opp_count(struct device *dev) return 0; } +static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev) +{ + return 0; +} + static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, unsigned long freq, bool available) { -- 2.4.0
WARNING: multiple messages have this Message-ID (diff)
From: viresh.kumar@linaro.org (Viresh Kumar) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 06/10] OPP: Add clock-latency-ns support Date: Mon, 15 Jun 2015 17:27:32 +0530 [thread overview] Message-ID: <1376f9ac3f955e67bd56327ea0ac9aecd06a6070.1434369079.git.viresh.kumar@linaro.org> (raw) In-Reply-To: <cover.1434369079.git.viresh.kumar@linaro.org> With "operating-points-v2" bindings, clock-latency is defined per OPP. Users of this value expect a single value which defines the latency to switch to any clock rate. Find maximum clock-latency-ns from the OPP table to service requests from such users. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- drivers/base/power/opp.c | 41 +++++++++++++++++++++++++++++++++++++++-- include/linux/pm_opp.h | 6 ++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c index 3198c3e77224..fe79e5146a29 100644 --- a/drivers/base/power/opp.c +++ b/drivers/base/power/opp.c @@ -57,6 +57,8 @@ * @u_volt_min: Minimum voltage in microvolts corresponding to this OPP * @u_volt_max: Maximum voltage in microvolts corresponding to this OPP * @u_amp: Maximum current drawn by the device in microamperes + * @clock_latency_ns: Latency (in nanoseconds) of switching to this OPP's + * frequency from any other OPP's frequency. * @dev_opp: points back to the device_opp struct this opp belongs to * @rcu_head: RCU callback head used for deferred freeing * @np: OPP's device node. @@ -79,6 +81,7 @@ struct dev_pm_opp { unsigned long u_volt_min; unsigned long u_volt_max; unsigned long u_amp; + unsigned long clock_latency_ns; struct device_opp *dev_opp; struct rcu_head rcu_head; @@ -113,6 +116,8 @@ struct device_opp { struct srcu_notifier_head srcu_head; struct rcu_head rcu_head; struct list_head opp_list; + + unsigned long clock_latency_ns_max; }; /* @@ -230,6 +235,32 @@ unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp) EXPORT_SYMBOL_GPL(dev_pm_opp_get_freq); /** + * dev_pm_opp_get_max_clock_latency() - Get max clock latency in nanoseconds + * @dev: device for which we do this operation + * + * Return: This function returns the max clock latency in nanoseconds. + * + * Locking: This function takes rcu_read_lock(). + */ +unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev) +{ + struct device_opp *dev_opp; + unsigned long clock_latency_ns; + + rcu_read_lock(); + + dev_opp = _find_device_opp(dev); + if (IS_ERR(dev_opp)) + clock_latency_ns = 0; + else + clock_latency_ns = dev_opp->clock_latency_ns_max; + + rcu_read_unlock(); + return clock_latency_ns; +} +EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_clock_latency); + +/** * dev_pm_opp_get_opp_count() - Get number of opps available in the opp list * @dev: device for which we do this operation * @@ -741,6 +772,8 @@ static int _opp_add_static_v2(struct device *dev, struct device_node *np) new_opp->np = np; new_opp->dynamic = false; new_opp->available = true; + of_property_read_u32(np, "clock-latency-ns", + (u32 *)&new_opp->clock_latency_ns); /* * TODO: Support multiple regulators @@ -765,9 +798,13 @@ static int _opp_add_static_v2(struct device *dev, struct device_node *np) if (ret) goto free_opp; - pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu\n", + if (new_opp->clock_latency_ns > dev_opp->clock_latency_ns_max) + dev_opp->clock_latency_ns_max = new_opp->clock_latency_ns; + + pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu latency:%lu\n", __func__, new_opp->turbo, new_opp->rate, new_opp->u_volt, - new_opp->u_volt_min, new_opp->u_volt_max); + new_opp->u_volt_min, new_opp->u_volt_max, + new_opp->clock_latency_ns); mutex_unlock(&dev_opp_list_lock); diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h index cec2d4540914..20324b579adc 100644 --- a/include/linux/pm_opp.h +++ b/include/linux/pm_opp.h @@ -31,6 +31,7 @@ unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp); unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp); int dev_pm_opp_get_opp_count(struct device *dev); +unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev); struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, unsigned long freq, @@ -67,6 +68,11 @@ static inline int dev_pm_opp_get_opp_count(struct device *dev) return 0; } +static inline unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev) +{ + return 0; +} + static inline struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev, unsigned long freq, bool available) { -- 2.4.0
next prev parent reply other threads:[~2015-06-15 11:58 UTC|newest] Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-06-15 11:57 [PATCH 00/10] OPP: Add code to support operating-points-v2 bindings Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-06-15 11:57 ` [PATCH 01/10] opp: Relocate few routines Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-07-02 1:25 ` Stephen Boyd 2015-07-02 1:25 ` Stephen Boyd 2015-07-24 17:08 ` Bartlomiej Zolnierkiewicz 2015-07-24 17:08 ` Bartlomiej Zolnierkiewicz 2015-06-15 11:57 ` [PATCH 02/10] OPP: Create _remove_device_opp() for freeing dev_opp Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-07-02 1:25 ` Stephen Boyd 2015-07-02 1:25 ` Stephen Boyd 2015-07-24 17:13 ` Bartlomiej Zolnierkiewicz 2015-07-24 17:13 ` Bartlomiej Zolnierkiewicz 2015-06-15 11:57 ` [PATCH 03/10] OPP: Allocate dev_opp from _add_device_opp() Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-07-02 1:02 ` Stephen Boyd 2015-07-02 1:02 ` Stephen Boyd 2015-07-02 6:24 ` Viresh Kumar 2015-07-02 6:24 ` Viresh Kumar 2015-07-02 23:46 ` Stephen Boyd 2015-07-02 23:46 ` Stephen Boyd 2015-07-03 6:45 ` Viresh Kumar 2015-07-03 6:45 ` Viresh Kumar 2015-07-06 22:31 ` Stephen Boyd 2015-07-06 22:31 ` Stephen Boyd 2015-07-24 17:25 ` Bartlomiej Zolnierkiewicz 2015-07-24 17:25 ` Bartlomiej Zolnierkiewicz 2015-06-15 11:57 ` [PATCH 04/10] OPP: Break _opp_add_dynamic() into smaller functions Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-07-24 17:42 ` Bartlomiej Zolnierkiewicz 2015-07-24 17:42 ` Bartlomiej Zolnierkiewicz 2015-06-15 11:57 ` [PATCH 05/10] opp: Add support to parse "operating-points-v2" bindings Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-07-02 1:13 ` Stephen Boyd 2015-07-02 1:13 ` Stephen Boyd 2015-07-02 6:38 ` Viresh Kumar 2015-07-02 6:38 ` Viresh Kumar 2015-07-02 16:07 ` Stephen Boyd 2015-07-02 16:07 ` Stephen Boyd 2015-07-03 6:08 ` Viresh Kumar 2015-07-03 6:08 ` Viresh Kumar 2015-07-08 13:41 ` Bartlomiej Zolnierkiewicz 2015-07-08 13:41 ` Bartlomiej Zolnierkiewicz 2015-07-09 5:18 ` Viresh Kumar 2015-07-09 5:18 ` Viresh Kumar 2015-07-24 18:02 ` Bartlomiej Zolnierkiewicz 2015-07-24 18:02 ` Bartlomiej Zolnierkiewicz 2015-07-27 3:14 ` Viresh Kumar 2015-07-27 3:14 ` Viresh Kumar 2015-07-27 3:02 ` Viresh Kumar 2015-07-27 3:02 ` Viresh Kumar 2015-07-28 23:03 ` Stephen Boyd 2015-07-28 23:03 ` Stephen Boyd 2015-07-29 6:53 ` Viresh Kumar 2015-07-29 6:53 ` Viresh Kumar 2015-07-30 10:17 ` Viresh Kumar 2015-07-30 10:17 ` Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar [this message] 2015-06-15 11:57 ` [PATCH 06/10] OPP: Add clock-latency-ns support Viresh Kumar 2015-07-02 1:27 ` Stephen Boyd 2015-07-02 1:27 ` Stephen Boyd 2015-06-15 11:57 ` [PATCH 07/10] opp: Add OPP sharing information to OPP library Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-07-17 22:51 ` Stephen Boyd 2015-07-17 22:51 ` Stephen Boyd 2015-07-18 6:33 ` Viresh Kumar 2015-07-18 6:33 ` Viresh Kumar 2015-07-20 17:46 ` Stephen Boyd 2015-07-20 17:46 ` Stephen Boyd 2015-07-21 2:18 ` Viresh Kumar 2015-07-21 2:18 ` Viresh Kumar 2015-07-27 3:20 ` Viresh Kumar 2015-07-27 3:20 ` Viresh Kumar 2015-06-15 11:57 ` [PATCH 08/10] OPP: Add support for opp-suspend Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-07-17 19:22 ` Stephen Boyd 2015-07-17 19:22 ` Stephen Boyd 2015-07-18 6:32 ` Viresh Kumar 2015-07-18 6:32 ` Viresh Kumar 2015-06-15 11:57 ` [PATCH 09/10] opp: Add helpers for initializing CPU OPPs Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-06-15 11:57 ` [PATCH 10/10] cpufreq-dt: Add support for operating-points-v2 bindings Viresh Kumar 2015-06-15 11:57 ` Viresh Kumar 2015-07-09 16:13 ` Bartlomiej Zolnierkiewicz 2015-07-09 16:13 ` Bartlomiej Zolnierkiewicz 2015-07-09 16:44 ` Bartlomiej Zolnierkiewicz 2015-07-09 16:44 ` Bartlomiej Zolnierkiewicz 2015-07-15 2:59 ` Viresh Kumar 2015-07-15 2:59 ` Viresh Kumar 2015-06-30 16:44 ` [PATCH 00/10] OPP: Add code to support " Viresh Kumar 2015-06-30 16:44 ` Viresh Kumar 2015-07-17 2:36 ` Viresh Kumar 2015-07-17 2:36 ` Viresh Kumar
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=1376f9ac3f955e67bd56327ea0ac9aecd06a6070.1434369079.git.viresh.kumar@linaro.org \ --to=viresh.kumar@linaro.org \ --cc=Sudeep.Holla@arm.com \ --cc=arnd.bergmann@linaro.org \ --cc=broonie@kernel.org \ --cc=kesavan.abhilash@gmail.com \ --cc=khilman@linaro.org \ --cc=l.stach@pengutronix.de \ --cc=linaro-kernel@lists.linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-pm@vger.kernel.org \ --cc=mike.turquette@linaro.org \ --cc=nm@ti.com \ --cc=rjw@rjwysocki.net \ --cc=rob.herring@linaro.org \ --cc=santosh.shilimkar@oracle.com \ --cc=sboyd@codeaurora.org \ --cc=ta.omasab@gmail.com \ --cc=thomas.petazzoni@free-electrons.com \ --cc=viswanath.puttagunta@linaro.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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.