From: Stephen Boyd <sboyd@codeaurora.org>
To: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Rafael Wysocki <rjw@rjwysocki.net>,
rob.herring@linaro.org, nm@ti.com,
thomas.petazzoni@free-electrons.com, kesavan.abhilash@gmail.com,
linaro-kernel@lists.linaro.org, ta.omasab@gmail.com,
khilman@linaro.org, linux-pm@vger.kernel.org,
viswanath.puttagunta@linaro.org, santosh.shilimkar@oracle.com,
broonie@kernel.org, mike.turquette@linaro.org,
Sudeep.Holla@arm.com, arnd.bergmann@linaro.org,
linux-arm-kernel@lists.infradead.org, l.stach@pengutronix.de
Subject: Re: [PATCH 07/10] opp: Add OPP sharing information to OPP library
Date: Fri, 17 Jul 2015 15:51:09 -0700 [thread overview]
Message-ID: <55A986DD.3010104@codeaurora.org> (raw)
In-Reply-To: <2e1c7fcc1fb62f73c82bd57d196d054ba2607a55.1434369079.git.viresh.kumar@linaro.org>
On 06/15/2015 04:57 AM, Viresh Kumar wrote:
> @@ -112,12 +129,14 @@ struct dev_pm_opp {
> struct device_opp {
> struct list_head node;
>
> - struct device *dev;
> struct srcu_notifier_head srcu_head;
> struct rcu_head rcu_head;
> + struct list_head dev_list;
> struct list_head opp_list;
>
> + struct device_node *np;
> unsigned long clock_latency_ns_max;
> + bool shared_opp;
> };
>
> /*
> @@ -137,6 +156,40 @@ do { \
> "dev_opp_list_lock protection"); \
> } while (0)
>
> +static struct device_list_opp *_find_list_dev(struct device *dev,
const device?
> + struct device_opp *dev_opp)
> +{
> + struct device_list_opp *list_dev;
> +
> + list_for_each_entry(list_dev, &dev_opp->dev_list, node)
> + if (list_dev->dev == dev)
> + return list_dev;
> +
> + return NULL;
> +}
> +
> +static struct device_opp *_managed_opp(struct device_node *np)
const device_node?
> +{
> + struct device_opp *dev_opp;
> +
> + list_for_each_entry_rcu(dev_opp, &dev_opp_list, node)
> + if (dev_opp->np == np) {
> + /*
> + * Multiple devices can point to the same OPP table and
> + * so will have same node-pointer, np.
> + *
> + * But the OPPs will be considered as shared only if the
> + * OPP table contains a "opp-shared" property.
> + */
> + if (dev_opp->shared_opp)
> + return dev_opp;
> + else
> + return NULL;
> + }
> +
> + return NULL;
> +}
> +
> /**
> * _find_device_opp() - find device_opp struct using device pointer
> * @dev: device pointer used to lookup device OPPs
> @@ -454,6 +504,39 @@ struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
> }
> EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);
>
> +/* List-dev Helpers */
> +static void _kfree_list_dev_rcu(struct rcu_head *head)
> +{
> + struct device_list_opp *list_dev;
> +
> + list_dev = container_of(head, struct device_list_opp, rcu_head);
> + kfree_rcu(list_dev, rcu_head);
> +}
> +
> +static void _remove_list_dev(struct device_list_opp *list_dev,
> + struct device_opp *dev_opp)
> +{
> + list_del(&list_dev->node);
> + call_srcu(&dev_opp->srcu_head.srcu, &list_dev->rcu_head,
> + _kfree_list_dev_rcu);
> +}
> +
> +static struct device_list_opp *_add_list_dev(struct device *dev,
Can dev be const here too?
> + struct device_opp *dev_opp)
> +{
> + struct device_list_opp *list_dev;
> +
> + list_dev = kzalloc(sizeof(*list_dev), GFP_KERNEL);
> + if (!list_dev)
> + return NULL;
> +
> + /* Initialize list-dev */
> + list_add_rcu(&list_dev->node, &dev_opp->dev_list);
> + list_dev->dev = dev;
> +
> + return list_dev;
> +}
> +
> /**
> * _add_device_opp() - Returns device OPP table
> * @dev: device for which we do this operation
> @@ -466,6 +549,7 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);
> static struct device_opp *_add_device_opp(struct device *dev)
> {
> struct device_opp *dev_opp;
> + struct device_list_opp *list_dev;
>
> /* Check for existing list for 'dev' first */
> dev_opp = _find_device_opp(dev);
> @@ -621,7 +722,8 @@ static struct dev_pm_opp *_allocate_opp(struct device *dev,
> return opp;
> }
>
> -static int _opp_add(struct dev_pm_opp *new_opp, struct device_opp *dev_opp)
> +static int _opp_add(struct device *dev, struct dev_pm_opp *new_opp,
> + struct device_opp *dev_opp)
> {
> struct dev_pm_opp *opp = NULL;
> struct list_head *head = &dev_opp->opp_list;
>
>
>
> @@ -1100,8 +1217,19 @@ static int _of_init_opp_table_v2(struct device *dev,
> if (WARN_ON(!count))
> goto put_opp_np;
>
> - if (ret)
> + if (!ret) {
> + if (!dev_opp) {
> + dev_opp = _find_device_opp(dev);
> + if (WARN_ON(!dev_opp))
> + goto put_opp_np;
> + }
> +
> + dev_opp->np = opp_np;
> + if (of_get_property(opp_np, "opp-shared", NULL))
dev_opp->shared_opp = of_property_read_bool(opp_np, "opp-shared")?
> + dev_opp->shared_opp = true;
> + } else {
> of_free_opp_table(dev);
> + }
>
> put_opp_np:
> of_node_put(opp_np);
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
WARNING: multiple messages have this Message-ID (diff)
From: sboyd@codeaurora.org (Stephen Boyd)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 07/10] opp: Add OPP sharing information to OPP library
Date: Fri, 17 Jul 2015 15:51:09 -0700 [thread overview]
Message-ID: <55A986DD.3010104@codeaurora.org> (raw)
In-Reply-To: <2e1c7fcc1fb62f73c82bd57d196d054ba2607a55.1434369079.git.viresh.kumar@linaro.org>
On 06/15/2015 04:57 AM, Viresh Kumar wrote:
> @@ -112,12 +129,14 @@ struct dev_pm_opp {
> struct device_opp {
> struct list_head node;
>
> - struct device *dev;
> struct srcu_notifier_head srcu_head;
> struct rcu_head rcu_head;
> + struct list_head dev_list;
> struct list_head opp_list;
>
> + struct device_node *np;
> unsigned long clock_latency_ns_max;
> + bool shared_opp;
> };
>
> /*
> @@ -137,6 +156,40 @@ do { \
> "dev_opp_list_lock protection"); \
> } while (0)
>
> +static struct device_list_opp *_find_list_dev(struct device *dev,
const device?
> + struct device_opp *dev_opp)
> +{
> + struct device_list_opp *list_dev;
> +
> + list_for_each_entry(list_dev, &dev_opp->dev_list, node)
> + if (list_dev->dev == dev)
> + return list_dev;
> +
> + return NULL;
> +}
> +
> +static struct device_opp *_managed_opp(struct device_node *np)
const device_node?
> +{
> + struct device_opp *dev_opp;
> +
> + list_for_each_entry_rcu(dev_opp, &dev_opp_list, node)
> + if (dev_opp->np == np) {
> + /*
> + * Multiple devices can point to the same OPP table and
> + * so will have same node-pointer, np.
> + *
> + * But the OPPs will be considered as shared only if the
> + * OPP table contains a "opp-shared" property.
> + */
> + if (dev_opp->shared_opp)
> + return dev_opp;
> + else
> + return NULL;
> + }
> +
> + return NULL;
> +}
> +
> /**
> * _find_device_opp() - find device_opp struct using device pointer
> * @dev: device pointer used to lookup device OPPs
> @@ -454,6 +504,39 @@ struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
> }
> EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);
>
> +/* List-dev Helpers */
> +static void _kfree_list_dev_rcu(struct rcu_head *head)
> +{
> + struct device_list_opp *list_dev;
> +
> + list_dev = container_of(head, struct device_list_opp, rcu_head);
> + kfree_rcu(list_dev, rcu_head);
> +}
> +
> +static void _remove_list_dev(struct device_list_opp *list_dev,
> + struct device_opp *dev_opp)
> +{
> + list_del(&list_dev->node);
> + call_srcu(&dev_opp->srcu_head.srcu, &list_dev->rcu_head,
> + _kfree_list_dev_rcu);
> +}
> +
> +static struct device_list_opp *_add_list_dev(struct device *dev,
Can dev be const here too?
> + struct device_opp *dev_opp)
> +{
> + struct device_list_opp *list_dev;
> +
> + list_dev = kzalloc(sizeof(*list_dev), GFP_KERNEL);
> + if (!list_dev)
> + return NULL;
> +
> + /* Initialize list-dev */
> + list_add_rcu(&list_dev->node, &dev_opp->dev_list);
> + list_dev->dev = dev;
> +
> + return list_dev;
> +}
> +
> /**
> * _add_device_opp() - Returns device OPP table
> * @dev: device for which we do this operation
> @@ -466,6 +549,7 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);
> static struct device_opp *_add_device_opp(struct device *dev)
> {
> struct device_opp *dev_opp;
> + struct device_list_opp *list_dev;
>
> /* Check for existing list for 'dev' first */
> dev_opp = _find_device_opp(dev);
> @@ -621,7 +722,8 @@ static struct dev_pm_opp *_allocate_opp(struct device *dev,
> return opp;
> }
>
> -static int _opp_add(struct dev_pm_opp *new_opp, struct device_opp *dev_opp)
> +static int _opp_add(struct device *dev, struct dev_pm_opp *new_opp,
> + struct device_opp *dev_opp)
> {
> struct dev_pm_opp *opp = NULL;
> struct list_head *head = &dev_opp->opp_list;
>
>
>
> @@ -1100,8 +1217,19 @@ static int _of_init_opp_table_v2(struct device *dev,
> if (WARN_ON(!count))
> goto put_opp_np;
>
> - if (ret)
> + if (!ret) {
> + if (!dev_opp) {
> + dev_opp = _find_device_opp(dev);
> + if (WARN_ON(!dev_opp))
> + goto put_opp_np;
> + }
> +
> + dev_opp->np = opp_np;
> + if (of_get_property(opp_np, "opp-shared", NULL))
dev_opp->shared_opp = of_property_read_bool(opp_np, "opp-shared")?
> + dev_opp->shared_opp = true;
> + } else {
> of_free_opp_table(dev);
> + }
>
> put_opp_np:
> of_node_put(opp_np);
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
next prev parent reply other threads:[~2015-07-17 22:51 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 ` [PATCH 06/10] OPP: Add clock-latency-ns support Viresh Kumar
2015-06-15 11:57 ` 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 [this message]
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=55A986DD.3010104@codeaurora.org \
--to=sboyd@codeaurora.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=ta.omasab@gmail.com \
--cc=thomas.petazzoni@free-electrons.com \
--cc=viresh.kumar@linaro.org \
--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: 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.