linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
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

  reply	other threads:[~2015-07-17 22:51 UTC|newest]

Thread overview: 47+ 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 ` [PATCH 01/10] opp: Relocate few routines Viresh Kumar
2015-07-02  1:25   ` Stephen Boyd
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-07-02  1:25   ` Stephen Boyd
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-07-02  1:02   ` Stephen Boyd
2015-07-02  6:24     ` Viresh Kumar
2015-07-02 23:46       ` Stephen Boyd
2015-07-03  6:45         ` Viresh Kumar
2015-07-06 22:31           ` Stephen Boyd
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-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-07-02  1:13   ` Stephen Boyd
2015-07-02  6:38     ` Viresh Kumar
2015-07-02 16:07       ` Stephen Boyd
2015-07-03  6:08         ` Viresh Kumar
2015-07-08 13:41   ` Bartlomiej Zolnierkiewicz
2015-07-09  5:18     ` Viresh Kumar
2015-07-24 18:02       ` Bartlomiej Zolnierkiewicz
2015-07-27  3:14         ` Viresh Kumar
2015-07-27  3:02     ` Viresh Kumar
2015-07-28 23:03       ` Stephen Boyd
2015-07-29  6:53         ` 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-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-07-17 22:51   ` Stephen Boyd [this message]
2015-07-18  6:33     ` Viresh Kumar
2015-07-20 17:46       ` Stephen Boyd
2015-07-21  2:18         ` 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-07-17 19:22   ` Stephen Boyd
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 ` [PATCH 10/10] cpufreq-dt: Add support for operating-points-v2 bindings Viresh Kumar
2015-07-09 16:13   ` Bartlomiej Zolnierkiewicz
2015-07-09 16:44     ` Bartlomiej Zolnierkiewicz
2015-07-15  2:59     ` Viresh Kumar
2015-06-30 16:44 ` [PATCH 00/10] OPP: Add code to support " 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=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).