From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Shawn Guo <shawn.guo@linaro.org>
Cc: cpufreq@vger.kernel.org, linux-pm@vger.kernel.org,
Kevin Hilman <khilman@ti.com>, Nishanth Menon <nm@ti.com>,
Shilimkar Santosh <santosh.shilimkar@ti.com>,
Richard Zhao <richard.zhao@freescale.com>,
Russell King - ARM Linux <linux@arm.linux.org.uk>,
Mike Turquette <mturquette@linaro.org>,
Mark Brown <broonie@opensource.wolfsonmicro.com>,
Rob Herring <rob.herring@calxeda.com>,
devicetree-discuss@lists.ozlabs.org,
linux-arm-kernel@lists.infradead.org,
Arnd Bergmann <arnd@arndb.de>
Subject: Re: [PATCH v3 2/3] PM / OPP: Initialize OPP table from device tree
Date: Thu, 16 Aug 2012 23:05:54 +0200 [thread overview]
Message-ID: <201208162305.55114.rjw@sisk.pl> (raw)
In-Reply-To: <1344577046-14847-3-git-send-email-shawn.guo@linaro.org>
On Friday, August 10, 2012, 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@linaro.org>
I need an ACK from whoever maintains the DT bindings for that.
Thanks,
Rafael
> ---
> Documentation/devicetree/bindings/power/opp.txt | 25 ++++++++++++
> drivers/base/power/opp.c | 47 +++++++++++++++++++++++
> include/linux/opp.h | 8 ++++
> 3 files changed, 80 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..74499e5
> --- /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 2-tuples items, and each item consists
> + of frequency and voltage like <freq-kHz vol-uV>.
> + freq: clock frequency in kHz
> + vol: voltage in microvolt
> +
> +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..d946864 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,49 @@ 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)
> +{
> + const struct property *prop;
> + const __be32 *val;
> + int nr;
> +
> + prop = of_find_property(dev->of_node, "operating-points", NULL);
> + if (!prop)
> + return -ENODEV;
> + if (!prop->value)
> + return -ENODATA;
> +
> + /*
> + * Each OPP is a set of tuples consisting of frequency and
> + * voltage like <freq-kHz vol-uV>.
> + */
> + nr = prop->length / sizeof(u32);
> + if (nr % 2) {
> + dev_err(dev, "%s: Invalid OPP list\n", __func__);
> + return -EINVAL;
> + }
> +
> + val = prop->value;
> + while (nr) {
> + unsigned long freq = be32_to_cpup(val++) * 1000;
> + unsigned long volt = be32_to_cpup(val++);
> +
> + if (opp_add(dev, freq, volt)) {
> + dev_warn(dev, "%s: Failed to add OPP %ld\n",
> + __func__, freq);
> + continue;
> + }
> + nr -= 2;
> + }
> +
> + return 0;
> +}
> +#endif
> diff --git a/include/linux/opp.h b/include/linux/opp.h
> index 2a4e5fa..214e0eb 100644
> --- a/include/linux/opp.h
> +++ b/include/linux/opp.h
> @@ -48,6 +48,14 @@ int opp_disable(struct device *dev, unsigned long freq);
>
> struct srcu_notifier_head *opp_get_notifier(struct device *dev);
>
> +#ifdef CONFIG_OF
> +int of_init_opp_table(struct device *dev);
> +#else
> +static inline int of_init_opp_table(struct device *dev)
> +{
> + return -EINVAL;
> +}
> +#endif /* CONFIG_OF */
> #else
> static inline unsigned long opp_get_voltage(struct opp *opp)
> {
>
WARNING: multiple messages have this Message-ID (diff)
From: rjw@sisk.pl (Rafael J. Wysocki)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 2/3] PM / OPP: Initialize OPP table from device tree
Date: Thu, 16 Aug 2012 23:05:54 +0200 [thread overview]
Message-ID: <201208162305.55114.rjw@sisk.pl> (raw)
In-Reply-To: <1344577046-14847-3-git-send-email-shawn.guo@linaro.org>
On Friday, August 10, 2012, 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@linaro.org>
I need an ACK from whoever maintains the DT bindings for that.
Thanks,
Rafael
> ---
> Documentation/devicetree/bindings/power/opp.txt | 25 ++++++++++++
> drivers/base/power/opp.c | 47 +++++++++++++++++++++++
> include/linux/opp.h | 8 ++++
> 3 files changed, 80 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..74499e5
> --- /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 2-tuples items, and each item consists
> + of frequency and voltage like <freq-kHz vol-uV>.
> + freq: clock frequency in kHz
> + vol: voltage in microvolt
> +
> +Examples:
> +
> +cpu at 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..d946864 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,49 @@ 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)
> +{
> + const struct property *prop;
> + const __be32 *val;
> + int nr;
> +
> + prop = of_find_property(dev->of_node, "operating-points", NULL);
> + if (!prop)
> + return -ENODEV;
> + if (!prop->value)
> + return -ENODATA;
> +
> + /*
> + * Each OPP is a set of tuples consisting of frequency and
> + * voltage like <freq-kHz vol-uV>.
> + */
> + nr = prop->length / sizeof(u32);
> + if (nr % 2) {
> + dev_err(dev, "%s: Invalid OPP list\n", __func__);
> + return -EINVAL;
> + }
> +
> + val = prop->value;
> + while (nr) {
> + unsigned long freq = be32_to_cpup(val++) * 1000;
> + unsigned long volt = be32_to_cpup(val++);
> +
> + if (opp_add(dev, freq, volt)) {
> + dev_warn(dev, "%s: Failed to add OPP %ld\n",
> + __func__, freq);
> + continue;
> + }
> + nr -= 2;
> + }
> +
> + return 0;
> +}
> +#endif
> diff --git a/include/linux/opp.h b/include/linux/opp.h
> index 2a4e5fa..214e0eb 100644
> --- a/include/linux/opp.h
> +++ b/include/linux/opp.h
> @@ -48,6 +48,14 @@ int opp_disable(struct device *dev, unsigned long freq);
>
> struct srcu_notifier_head *opp_get_notifier(struct device *dev);
>
> +#ifdef CONFIG_OF
> +int of_init_opp_table(struct device *dev);
> +#else
> +static inline int of_init_opp_table(struct device *dev)
> +{
> + return -EINVAL;
> +}
> +#endif /* CONFIG_OF */
> #else
> static inline unsigned long opp_get_voltage(struct opp *opp)
> {
>
next prev parent reply other threads:[~2012-08-16 21:05 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-10 5:37 [PATCH v3 0/3] Add a generic cpufreq-cpu0 driver Shawn Guo
2012-08-10 5:37 ` Shawn Guo
2012-08-10 5:37 ` [PATCH v3 1/3] ARM: add cpufreq transiton notifier to adjust loops_per_jiffy for smp Shawn Guo
2012-08-10 5:37 ` Shawn Guo
2012-09-04 23:27 ` Rafael J. Wysocki
2012-09-04 23:27 ` Rafael J. Wysocki
[not found] ` <1344577046-14847-2-git-send-email-shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2012-09-06 22:35 ` Stephen Warren
2012-09-06 22:35 ` Stephen Warren
[not found] ` <5049252D.9000802-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-09-07 2:58 ` Shawn Guo
2012-09-07 2:58 ` Shawn Guo
[not found] ` <20120907025847.GI26709-rvtDTF3kK1ictlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org>
2012-09-07 16:55 ` Stephen Warren
2012-09-07 16:55 ` Stephen Warren
2012-09-10 1:17 ` Shawn Guo
2012-09-10 1:17 ` Shawn Guo
[not found] ` <20120910011741.GP26709-rvtDTF3kK1ictlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org>
2012-09-10 17:17 ` Stephen Warren
2012-09-10 17:17 ` Stephen Warren
[not found] ` <504E20BE.8050107-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-09-11 11:59 ` Prashant Gaikwad
2012-09-11 11:59 ` Prashant Gaikwad
[not found] ` <504F2789.1070006-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-09-11 15:16 ` Stephen Warren
2012-09-11 15:16 ` Stephen Warren
2012-08-10 5:37 ` [PATCH v3 2/3] PM / OPP: Initialize OPP table from device tree Shawn Guo
2012-08-10 5:37 ` Shawn Guo
2012-08-16 21:05 ` Rafael J. Wysocki [this message]
2012-08-16 21:05 ` Rafael J. Wysocki
[not found] ` <201208162305.55114.rjw-KKrjLPT3xs0@public.gmane.org>
2012-08-17 0:52 ` Shawn Guo
2012-08-17 0:52 ` Shawn Guo
2012-08-17 1:53 ` Rob Herring
2012-08-17 1:53 ` Rob Herring
2012-09-04 23:27 ` Rafael J. Wysocki
2012-09-04 23:27 ` Rafael J. Wysocki
2012-08-10 5:37 ` [PATCH v3 3/3] cpufreq: Add a generic cpufreq-cpu0 driver Shawn Guo
2012-08-10 5:37 ` Shawn Guo
2012-09-04 23:18 ` Rafael J. Wysocki
2012-09-04 23:18 ` Rafael J. Wysocki
[not found] ` <201209050118.39045.rjw-KKrjLPT3xs0@public.gmane.org>
2012-09-05 1:12 ` Shawn Guo
2012-09-05 1:12 ` Shawn Guo
2012-09-05 4:53 ` AnilKumar, Chimata
2012-09-05 4:53 ` AnilKumar, Chimata
2012-09-05 5:02 ` Shilimkar, Santosh
2012-09-05 5:02 ` Shilimkar, Santosh
2012-09-05 13:38 ` Rafael J. Wysocki
2012-09-05 13:38 ` Rafael J. Wysocki
2012-09-05 13:59 ` Shawn Guo
2012-09-05 13:59 ` Shawn Guo
2012-09-05 20:18 ` Rafael J. Wysocki
2012-09-05 20:18 ` Rafael J. Wysocki
2012-09-06 7:29 ` Shawn Guo
2012-09-06 7:29 ` Shawn Guo
[not found] ` <20120906072935.GB2362-rvtDTF3kK1ictlrPMvKcciBecyulp+rMXqFh9Ls21Oc@public.gmane.org>
2012-09-06 19:59 ` Rafael J. Wysocki
2012-09-06 19:59 ` Rafael J. Wysocki
2012-08-31 6:42 ` [PATCH v3 0/3] " Shawn Guo
2012-08-31 6:42 ` Shawn Guo
2012-09-01 5:53 ` Rafael J. Wysocki
2012-09-01 5:53 ` Rafael J. Wysocki
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=201208162305.55114.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=arnd@arndb.de \
--cc=broonie@opensource.wolfsonmicro.com \
--cc=cpufreq@vger.kernel.org \
--cc=devicetree-discuss@lists.ozlabs.org \
--cc=khilman@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=mturquette@linaro.org \
--cc=nm@ti.com \
--cc=richard.zhao@freescale.com \
--cc=rob.herring@calxeda.com \
--cc=santosh.shilimkar@ti.com \
--cc=shawn.guo@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: link
Be 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.