From: Rob Herring <robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
Cc: Kevin Hilman <khilman-l0cyMroinI0@public.gmane.org>,
Nishanth Menon <nm-l0cyMroinI0@public.gmane.org>,
Mike Turquette
<mturquette-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
Richard Zhao
<richard.zhao-KZfg59tc24xl57MIdRCFDg@public.gmane.org>,
linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
Mark Brown
<broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org>,
cpufreq-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
"Rafael J. Wysocki" <rjw-KKrjLPT3xs0@public.gmane.org>,
Shilimkar Santosh
<santosh.shilimkar-l0cyMroinI0@public.gmane.org>,
Russell King - ARM Linux
<linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: Re: [PATCH v2 2/4] PM / OPP: Initialize OPP table from device tree
Date: Sun, 05 Aug 2012 21:50:32 -0500 [thread overview]
Message-ID: <501F30F8.1040105@gmail.com> (raw)
In-Reply-To: <1344179121-17738-3-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
On 08/05/2012 10:05 AM, Shawn Guo wrote:
> With a lot of devices booting from device tree nowadays, it requires
> that OPP table can be initialized from device tree. The patch adds
> a helper function of_init_opp_table together with a binding doc for
> that purpose.
>
> Signed-off-by: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
> ---
> Documentation/devicetree/bindings/power/opp.txt | 25 +++++++++
> drivers/base/power/opp.c | 65 +++++++++++++++++++++++
> include/linux/opp.h | 8 +++
> 3 files changed, 98 insertions(+), 0 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/power/opp.txt
>
> diff --git a/Documentation/devicetree/bindings/power/opp.txt b/Documentation/devicetree/bindings/power/opp.txt
> new file mode 100644
> index 0000000..2238520
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/opp.txt
> @@ -0,0 +1,25 @@
> +* Generic OPP Interface
> +
> +SoCs have a standard set of tuples consisting of frequency and
> +voltage pairs that the device will support per voltage domain. These
> +are called Operating Performance Points or OPPs.
> +
> +Properties:
> +- operating-points: An array of 3-tuples items, and each item consists
3 tuples?
> + of frequency and voltage like <freq-kHz vol-uV>.
> + freq: clock frequency in kHz
> + vol: voltage in microvolt
Although maybe 3 fields would be good for a flags field? I'm concerned
it's a pretty generic name and not very future proof. What about
transition times? Not sure how you would represent that as it probably
depends on which points you are changing between rather than a property
of the opp.
I'm not saying we have to address that now, but just have some path in
the future.
> +
> +Examples:
> +
> +cpu@0 {
> + compatible = "arm,cortex-a9";
> + reg = <0>;
> + next-level-cache = <&L2>;
> + operating-points = <
> + /* kHz uV */
> + 792000 1100000
> + 396000 950000
> + 198000 850000
> + >;
> +};
> diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c
> index ac993ea..1bf1be8 100644
> --- a/drivers/base/power/opp.c
> +++ b/drivers/base/power/opp.c
> @@ -22,6 +22,7 @@
> #include <linux/rculist.h>
> #include <linux/rcupdate.h>
> #include <linux/opp.h>
> +#include <linux/of.h>
>
> /*
> * Internal data structure organization with the OPP layer library is as
> @@ -674,3 +675,67 @@ struct srcu_notifier_head *opp_get_notifier(struct device *dev)
>
> return &dev_opp->head;
> }
> +
> +#ifdef CONFIG_OF
> +/**
> + * of_init_opp_table() - Initialize opp table from device tree
> + * @dev: device pointer used to lookup device OPPs.
> + *
> + * Register the initial OPP table with the OPP library for given device.
> + */
> +int of_init_opp_table(struct device *dev)
> +{
> + struct device_node *np = dev->of_node;
> + const char *propname = "operating-points";
> + const struct property *pp;
> + u32 *opp;
> + int ret, i, nr;
> +
> + pp = of_find_property(np, propname, NULL);
> + if (!pp) {
> + dev_err(dev, "%s: Unable to find property", __func__);
> + return -ENODEV;
> + }
> +
> + opp = kzalloc(pp->length, GFP_KERNEL);
> + if (!opp) {
> + dev_err(dev, "%s: Unable to allocate array\n", __func__);
> + return -ENOMEM;
> + }
> +
> + nr = pp->length / sizeof(u32);
> + ret = of_property_read_u32_array(np, propname, opp, nr);
> + if (ret) {
> + dev_err(dev, "%s: Unable to read OPPs\n", __func__);
> + goto out;
> + }
> +
> + if (nr % 2) {
> + dev_err(dev, "%s: Invalid OPP list\n", __func__);
> + ret = -EINVAL;
> + goto out;
> + }
> +
> + nr /= 2;
> + for (i = 0; i < nr; i++) {
> + /*
> + * Each OPP is a set of tuples consisting of frequency and
> + * voltage like <freq-kHz vol-uV>.
> + */
> + u32 *val = opp + i * 2;
> +
> + val[0] *= 1000;
> + ret = opp_add(dev, val[0], val[1]);
> + if (ret) {
> + dev_warn(dev, "%s: Failed to add OPP %d: %d\n",
> + __func__, val[0], ret);
> + continue;
> + }
> + }
I think this whole function can be written more concisely. Just iterate
over the property and avoid the intermediate array allocation.
Rob
next prev parent reply other threads:[~2012-08-06 2:50 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-05 15:05 [PATCH v2 0/4] Add a generic cpufreq-cpu0 driver Shawn Guo
[not found] ` <1344179121-17738-1-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-08-05 15:05 ` [PATCH v2 1/4] ARM: add cpufreq transiton notifier to adjust loops_per_jiffy for smp Shawn Guo
2012-08-05 15:05 ` [PATCH v2 2/4] PM / OPP: Initialize OPP table from device tree Shawn Guo
[not found] ` <1344179121-17738-3-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-08-06 2:50 ` Rob Herring [this message]
2012-08-06 3:19 ` Shawn Guo
2012-08-06 4:43 ` Rob Herring
2012-08-06 5:23 ` Shawn Guo
2012-08-05 15:05 ` [PATCH v2 3/4] regulator: add a new API regulator_set_voltage_tol() Shawn Guo
2012-08-08 13:35 ` Mark Brown
2012-08-08 14:30 ` Shawn Guo
2012-08-09 10:53 ` Mark Brown
2012-08-05 15:05 ` [PATCH v2 4/4] cpufreq: Add a generic cpufreq-cpu0 driver Shawn Guo
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=501F30F8.1040105@gmail.com \
--to=robherring2-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org \
--cc=cpufreq-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
--cc=khilman-l0cyMroinI0@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \
--cc=linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mturquette-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=nm-l0cyMroinI0@public.gmane.org \
--cc=richard.zhao-KZfg59tc24xl57MIdRCFDg@public.gmane.org \
--cc=rjw-KKrjLPT3xs0@public.gmane.org \
--cc=santosh.shilimkar-l0cyMroinI0@public.gmane.org \
--cc=shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.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).