Re: [PATCHv5 RFC 12/15] hwspinlock/core: add OF helper to parse reserved locks

2014-05-09 Thread Suman Anna
Hi Josh,

On 05/05/2014 04:54 PM, Josh Cartwright wrote:
> On Mon, May 05, 2014 at 04:44:25PM -0500, Suman Anna wrote:
>> Hi Rob,
>>
>> On 04/30/2014 07:34 PM, Suman Anna wrote:
>>> The property 'hwlock-reserved-locks' will be used to represent
>>> the number of locks to be reserved for clients that would need
>>> to request/operate on specific locks. A new OF helper function,
>>> of_hwspin_lock_get_num_reserved_locks(), is added to minimize
>>> duplication in different platform implementations.
>>>
>>> The function will return a value of 0 if the property is not
>>> defined, so as to support a default behavior of marking all
>>> locks as unused and open for anonymous allocations.
>>>
>>> Signed-off-by: Suman Anna 
>>> ---
>>>  .../devicetree/bindings/hwlock/hwlock.txt  |  3 +++
>>>  drivers/hwspinlock/hwspinlock_core.c   | 25 
>>> ++
>>>  include/linux/hwspinlock.h |  1 +
>>>  3 files changed, 29 insertions(+)
>>>
>>> diff --git a/Documentation/devicetree/bindings/hwlock/hwlock.txt 
>>> b/Documentation/devicetree/bindings/hwlock/hwlock.txt
>>> index d538a9b..88d16d2 100644
>>> --- a/Documentation/devicetree/bindings/hwlock/hwlock.txt
>>> +++ b/Documentation/devicetree/bindings/hwlock/hwlock.txt
>>> @@ -18,6 +18,9 @@ Common properties:
>>> property is needed on hwlock devices, where the number
>>> of supported locks within a hwlock device cannot be
>>> read from a register.
>>> +- hwlock-reserved-locks: Number of locks to reserve for clients requiring
>>> +   specific locks. This value cannot exceed the value of
>>> +   hwlock-num-locks.
>>
>> Any suggestions here on the approach? This property falls into a gray
>> area as well, as the current approach is somewhat limiting (it doesn't
>> support sparse reserved locks, and expects them at the beginning of the
>> lock range).
> 
> Is it possible to implement a pinctrl-like hogging approach, whereby the
> specific locks that need to be reserved are consumed by the controller
> itself?
> 

Thanks for the suggestion. I did take a look at pinctrl and while it is
possible to implement something similar, I feel it is a bit heavy for
hwspinlock framework with no added advantages. It requires that the
controller and clients always need to be updated together. Ohad had
already brought this up [1]. Here's an alternate approach that does not
require any additional property to the controller itself, while the
client node usage is as before. The logic is based on parsing through
the DT blob and marking only those that are used by any clients. The RFC
patch below is a replacement for Patches 11 to 15, and do not require
any changes to platform implementations or additional DT properties.

It currently marks locks as reserved even for disabled client nodes
(very easy to change that behavior). It will also impose a standard
property name "hwlocks" on the client nodes. What do you think of this
approach?

regards
Suman

[1] http://marc.info/?l=linux-omap=139514977622964=2


>From 4f4cbe91e56c1be8faa6a3ee863add4df6e6714b Mon Sep 17 00:00:00 2001
From: Suman Anna 
Date: Fri, 9 May 2014 14:26:54 -0500
Subject: [RFC PATCH] hwspinlock/core: add support for reserved locks

The HwSpinlock core allows requesting either a specific lock or an
available normal lock. The specific locks are usually reserved during
board init time, while the normal available locks are intended to be
assigned at runtime.

The HwSpinlock core has been enhanced to mark certain locks as 'reserved'
by parsing through the DT blob. Thes

The HwSpinlock core has been enhanced to:
  1. mark certain locks as 'reserved' by parsing the DT blob for any
 locks used by client nodes.
  2. restrict the anonymous hwspin_lock_request() API to allocate only
 from non-reserved locks for DT boots.
  3. limit these reserved locks to be allocated only using the
 _request_specific() API variants for DT boots.

Signed-off-by: Suman Anna 
---
 drivers/hwspinlock/hwspinlock_core.c | 50
++--
 1 file changed, 48 insertions(+), 2 deletions(-)

diff --git a/drivers/hwspinlock/hwspinlock_core.c
b/drivers/hwspinlock/hwspinlock_core.c
index c2063bc..0c924c9 100644
--- a/drivers/hwspinlock/hwspinlock_core.c
+++ b/drivers/hwspinlock/hwspinlock_core.c
@@ -425,6 +425,42 @@ static int hwspinlock_device_add(struct
hwspinlock_device *bank)
return ret;
 }

+static void hwspin_mark_reserved_locks(struct hwspinlock_device *bank)
+{
+   struct device_node *np = bank->dev->of_node;
+   const char *prop_name = "hwlocks";
+   const char *cells_name = "#hwlock-cells";
+   struct device_node *node = NULL;
+   struct of_phandle_args args;
+   struct hwspinlock *hwlock;
+   int i, id, count, ret;
+
+   for_each_node_with_property(node, prop_name) {
+   count = of_count_phandle_with_args(node, prop_name,

Re: [PATCHv5 RFC 12/15] hwspinlock/core: add OF helper to parse reserved locks

2014-05-09 Thread Suman Anna
Hi Josh,

On 05/05/2014 04:54 PM, Josh Cartwright wrote:
 On Mon, May 05, 2014 at 04:44:25PM -0500, Suman Anna wrote:
 Hi Rob,

 On 04/30/2014 07:34 PM, Suman Anna wrote:
 The property 'hwlock-reserved-locks' will be used to represent
 the number of locks to be reserved for clients that would need
 to request/operate on specific locks. A new OF helper function,
 of_hwspin_lock_get_num_reserved_locks(), is added to minimize
 duplication in different platform implementations.

 The function will return a value of 0 if the property is not
 defined, so as to support a default behavior of marking all
 locks as unused and open for anonymous allocations.

 Signed-off-by: Suman Anna s-a...@ti.com
 ---
  .../devicetree/bindings/hwlock/hwlock.txt  |  3 +++
  drivers/hwspinlock/hwspinlock_core.c   | 25 
 ++
  include/linux/hwspinlock.h |  1 +
  3 files changed, 29 insertions(+)

 diff --git a/Documentation/devicetree/bindings/hwlock/hwlock.txt 
 b/Documentation/devicetree/bindings/hwlock/hwlock.txt
 index d538a9b..88d16d2 100644
 --- a/Documentation/devicetree/bindings/hwlock/hwlock.txt
 +++ b/Documentation/devicetree/bindings/hwlock/hwlock.txt
 @@ -18,6 +18,9 @@ Common properties:
 property is needed on hwlock devices, where the number
 of supported locks within a hwlock device cannot be
 read from a register.
 +- hwlock-reserved-locks: Number of locks to reserve for clients requiring
 +   specific locks. This value cannot exceed the value of
 +   hwlock-num-locks.

 Any suggestions here on the approach? This property falls into a gray
 area as well, as the current approach is somewhat limiting (it doesn't
 support sparse reserved locks, and expects them at the beginning of the
 lock range).
 
 Is it possible to implement a pinctrl-like hogging approach, whereby the
 specific locks that need to be reserved are consumed by the controller
 itself?
 

Thanks for the suggestion. I did take a look at pinctrl and while it is
possible to implement something similar, I feel it is a bit heavy for
hwspinlock framework with no added advantages. It requires that the
controller and clients always need to be updated together. Ohad had
already brought this up [1]. Here's an alternate approach that does not
require any additional property to the controller itself, while the
client node usage is as before. The logic is based on parsing through
the DT blob and marking only those that are used by any clients. The RFC
patch below is a replacement for Patches 11 to 15, and do not require
any changes to platform implementations or additional DT properties.

It currently marks locks as reserved even for disabled client nodes
(very easy to change that behavior). It will also impose a standard
property name hwlocks on the client nodes. What do you think of this
approach?

regards
Suman

[1] http://marc.info/?l=linux-omapm=139514977622964w=2


From 4f4cbe91e56c1be8faa6a3ee863add4df6e6714b Mon Sep 17 00:00:00 2001
From: Suman Anna s-a...@ti.com
Date: Fri, 9 May 2014 14:26:54 -0500
Subject: [RFC PATCH] hwspinlock/core: add support for reserved locks

The HwSpinlock core allows requesting either a specific lock or an
available normal lock. The specific locks are usually reserved during
board init time, while the normal available locks are intended to be
assigned at runtime.

The HwSpinlock core has been enhanced to mark certain locks as 'reserved'
by parsing through the DT blob. Thes

The HwSpinlock core has been enhanced to:
  1. mark certain locks as 'reserved' by parsing the DT blob for any
 locks used by client nodes.
  2. restrict the anonymous hwspin_lock_request() API to allocate only
 from non-reserved locks for DT boots.
  3. limit these reserved locks to be allocated only using the
 _request_specific() API variants for DT boots.

Signed-off-by: Suman Anna s-a...@ti.com
---
 drivers/hwspinlock/hwspinlock_core.c | 50
++--
 1 file changed, 48 insertions(+), 2 deletions(-)

diff --git a/drivers/hwspinlock/hwspinlock_core.c
b/drivers/hwspinlock/hwspinlock_core.c
index c2063bc..0c924c9 100644
--- a/drivers/hwspinlock/hwspinlock_core.c
+++ b/drivers/hwspinlock/hwspinlock_core.c
@@ -425,6 +425,42 @@ static int hwspinlock_device_add(struct
hwspinlock_device *bank)
return ret;
 }

+static void hwspin_mark_reserved_locks(struct hwspinlock_device *bank)
+{
+   struct device_node *np = bank-dev-of_node;
+   const char *prop_name = hwlocks;
+   const char *cells_name = #hwlock-cells;
+   struct device_node *node = NULL;
+   struct of_phandle_args args;
+   struct hwspinlock *hwlock;
+   int i, id, count, ret;
+
+   for_each_node_with_property(node, prop_name) {
+   count = of_count_phandle_with_args(node, prop_name,
cells_name);
+   if (count = 0)
+   continue;
+
+ 

Re: [PATCHv5 RFC 12/15] hwspinlock/core: add OF helper to parse reserved locks

2014-05-05 Thread Josh Cartwright
On Mon, May 05, 2014 at 04:44:25PM -0500, Suman Anna wrote:
> Hi Rob,
> 
> On 04/30/2014 07:34 PM, Suman Anna wrote:
> > The property 'hwlock-reserved-locks' will be used to represent
> > the number of locks to be reserved for clients that would need
> > to request/operate on specific locks. A new OF helper function,
> > of_hwspin_lock_get_num_reserved_locks(), is added to minimize
> > duplication in different platform implementations.
> > 
> > The function will return a value of 0 if the property is not
> > defined, so as to support a default behavior of marking all
> > locks as unused and open for anonymous allocations.
> > 
> > Signed-off-by: Suman Anna 
> > ---
> >  .../devicetree/bindings/hwlock/hwlock.txt  |  3 +++
> >  drivers/hwspinlock/hwspinlock_core.c   | 25 
> > ++
> >  include/linux/hwspinlock.h |  1 +
> >  3 files changed, 29 insertions(+)
> > 
> > diff --git a/Documentation/devicetree/bindings/hwlock/hwlock.txt 
> > b/Documentation/devicetree/bindings/hwlock/hwlock.txt
> > index d538a9b..88d16d2 100644
> > --- a/Documentation/devicetree/bindings/hwlock/hwlock.txt
> > +++ b/Documentation/devicetree/bindings/hwlock/hwlock.txt
> > @@ -18,6 +18,9 @@ Common properties:
> > property is needed on hwlock devices, where the number
> > of supported locks within a hwlock device cannot be
> > read from a register.
> > +- hwlock-reserved-locks: Number of locks to reserve for clients requiring
> > +   specific locks. This value cannot exceed the value of
> > +   hwlock-num-locks.
> 
> Any suggestions here on the approach? This property falls into a gray
> area as well, as the current approach is somewhat limiting (it doesn't
> support sparse reserved locks, and expects them at the beginning of the
> lock range).

Is it possible to implement a pinctrl-like hogging approach, whereby the
specific locks that need to be reserved are consumed by the controller
itself?

  Josh

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv5 RFC 12/15] hwspinlock/core: add OF helper to parse reserved locks

2014-05-05 Thread Suman Anna
Hi Rob,

On 04/30/2014 07:34 PM, Suman Anna wrote:
> The property 'hwlock-reserved-locks' will be used to represent
> the number of locks to be reserved for clients that would need
> to request/operate on specific locks. A new OF helper function,
> of_hwspin_lock_get_num_reserved_locks(), is added to minimize
> duplication in different platform implementations.
> 
> The function will return a value of 0 if the property is not
> defined, so as to support a default behavior of marking all
> locks as unused and open for anonymous allocations.
> 
> Signed-off-by: Suman Anna 
> ---
>  .../devicetree/bindings/hwlock/hwlock.txt  |  3 +++
>  drivers/hwspinlock/hwspinlock_core.c   | 25 
> ++
>  include/linux/hwspinlock.h |  1 +
>  3 files changed, 29 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/hwlock/hwlock.txt 
> b/Documentation/devicetree/bindings/hwlock/hwlock.txt
> index d538a9b..88d16d2 100644
> --- a/Documentation/devicetree/bindings/hwlock/hwlock.txt
> +++ b/Documentation/devicetree/bindings/hwlock/hwlock.txt
> @@ -18,6 +18,9 @@ Common properties:
>   property is needed on hwlock devices, where the number
>   of supported locks within a hwlock device cannot be
>   read from a register.
> +- hwlock-reserved-locks: Number of locks to reserve for clients requiring
> + specific locks. This value cannot exceed the value of
> + hwlock-num-locks.

Any suggestions here on the approach? This property falls into a gray
area as well, as the current approach is somewhat limiting (it doesn't
support sparse reserved locks, and expects them at the beginning of the
lock range).

regards
Suman

>  - hwlock-base-id:An unique base Id for the locks for a particular hwlock
>   device. This property is mandatory ONLY if a SoC has
>   several hwlock devices.
> diff --git a/drivers/hwspinlock/hwspinlock_core.c 
> b/drivers/hwspinlock/hwspinlock_core.c
> index e05cea8..e74b55b 100644
> --- a/drivers/hwspinlock/hwspinlock_core.c
> +++ b/drivers/hwspinlock/hwspinlock_core.c
> @@ -286,6 +286,31 @@ int of_hwspin_lock_get_base_id(struct device_node *dn)
>  EXPORT_SYMBOL_GPL(of_hwspin_lock_get_base_id);
>  
>  /**
> + * of_hwspin_lock_get_num_reserved_locks() - retrieve number of reserved 
> locks
> + * @dn: device node pointer
> + *
> + * This is an OF helper function that can be called by the underlying 
> platform
> + * specific implementations, to retrieve the number of locks to reserve from
> + * the hwspinlock device instance's base id. The hwlock-reserved-locks DT
> + * property needs to be defined for requesting any DT-based locks.
> + *
> + * Returns a positive number of locks on success, a default value of 0 if the
> + * property is missing or an appropriate error code as returned by the OF 
> layer
> + */
> +int of_hwspin_lock_get_num_reserved_locks(struct device_node *dn)
> +{
> + unsigned int val = 0;
> + int ret;
> +
> + ret = of_property_read_u32(dn, "hwlock-reserved-locks", );
> + if (!ret || ret == -EINVAL)
> + ret = val;
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(of_hwspin_lock_get_num_reserved_locks);
> +
> +/**
>   * of_hwspin_lock_get_num_locks() - OF helper to retrieve number of locks
>   * @dn: device node pointer
>   *
> diff --git a/include/linux/hwspinlock.h b/include/linux/hwspinlock.h
> index d120035..d18431f 100644
> --- a/include/linux/hwspinlock.h
> +++ b/include/linux/hwspinlock.h
> @@ -69,6 +69,7 @@ int of_hwspin_lock_simple_xlate(struct hwspinlock_device 
> *bank,
>   const struct of_phandle_args *hwlock_spec);
>  int of_hwspin_lock_get_base_id(struct device_node *dn);
>  int of_hwspin_lock_get_num_locks(struct device_node *dn);
> +int of_hwspin_lock_get_num_reserved_locks(struct device_node *dn);
>  int hwspin_lock_register(struct hwspinlock_device *bank, struct device *dev,
>   const struct hwspinlock_ops *ops, int base_id, int num_locks,
>   int num_reserved_locks);
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv5 RFC 12/15] hwspinlock/core: add OF helper to parse reserved locks

2014-05-05 Thread Suman Anna
Hi Rob,

On 04/30/2014 07:34 PM, Suman Anna wrote:
 The property 'hwlock-reserved-locks' will be used to represent
 the number of locks to be reserved for clients that would need
 to request/operate on specific locks. A new OF helper function,
 of_hwspin_lock_get_num_reserved_locks(), is added to minimize
 duplication in different platform implementations.
 
 The function will return a value of 0 if the property is not
 defined, so as to support a default behavior of marking all
 locks as unused and open for anonymous allocations.
 
 Signed-off-by: Suman Anna s-a...@ti.com
 ---
  .../devicetree/bindings/hwlock/hwlock.txt  |  3 +++
  drivers/hwspinlock/hwspinlock_core.c   | 25 
 ++
  include/linux/hwspinlock.h |  1 +
  3 files changed, 29 insertions(+)
 
 diff --git a/Documentation/devicetree/bindings/hwlock/hwlock.txt 
 b/Documentation/devicetree/bindings/hwlock/hwlock.txt
 index d538a9b..88d16d2 100644
 --- a/Documentation/devicetree/bindings/hwlock/hwlock.txt
 +++ b/Documentation/devicetree/bindings/hwlock/hwlock.txt
 @@ -18,6 +18,9 @@ Common properties:
   property is needed on hwlock devices, where the number
   of supported locks within a hwlock device cannot be
   read from a register.
 +- hwlock-reserved-locks: Number of locks to reserve for clients requiring
 + specific locks. This value cannot exceed the value of
 + hwlock-num-locks.

Any suggestions here on the approach? This property falls into a gray
area as well, as the current approach is somewhat limiting (it doesn't
support sparse reserved locks, and expects them at the beginning of the
lock range).

regards
Suman

  - hwlock-base-id:An unique base Id for the locks for a particular hwlock
   device. This property is mandatory ONLY if a SoC has
   several hwlock devices.
 diff --git a/drivers/hwspinlock/hwspinlock_core.c 
 b/drivers/hwspinlock/hwspinlock_core.c
 index e05cea8..e74b55b 100644
 --- a/drivers/hwspinlock/hwspinlock_core.c
 +++ b/drivers/hwspinlock/hwspinlock_core.c
 @@ -286,6 +286,31 @@ int of_hwspin_lock_get_base_id(struct device_node *dn)
  EXPORT_SYMBOL_GPL(of_hwspin_lock_get_base_id);
  
  /**
 + * of_hwspin_lock_get_num_reserved_locks() - retrieve number of reserved 
 locks
 + * @dn: device node pointer
 + *
 + * This is an OF helper function that can be called by the underlying 
 platform
 + * specific implementations, to retrieve the number of locks to reserve from
 + * the hwspinlock device instance's base id. The hwlock-reserved-locks DT
 + * property needs to be defined for requesting any DT-based locks.
 + *
 + * Returns a positive number of locks on success, a default value of 0 if the
 + * property is missing or an appropriate error code as returned by the OF 
 layer
 + */
 +int of_hwspin_lock_get_num_reserved_locks(struct device_node *dn)
 +{
 + unsigned int val = 0;
 + int ret;
 +
 + ret = of_property_read_u32(dn, hwlock-reserved-locks, val);
 + if (!ret || ret == -EINVAL)
 + ret = val;
 +
 + return ret;
 +}
 +EXPORT_SYMBOL_GPL(of_hwspin_lock_get_num_reserved_locks);
 +
 +/**
   * of_hwspin_lock_get_num_locks() - OF helper to retrieve number of locks
   * @dn: device node pointer
   *
 diff --git a/include/linux/hwspinlock.h b/include/linux/hwspinlock.h
 index d120035..d18431f 100644
 --- a/include/linux/hwspinlock.h
 +++ b/include/linux/hwspinlock.h
 @@ -69,6 +69,7 @@ int of_hwspin_lock_simple_xlate(struct hwspinlock_device 
 *bank,
   const struct of_phandle_args *hwlock_spec);
  int of_hwspin_lock_get_base_id(struct device_node *dn);
  int of_hwspin_lock_get_num_locks(struct device_node *dn);
 +int of_hwspin_lock_get_num_reserved_locks(struct device_node *dn);
  int hwspin_lock_register(struct hwspinlock_device *bank, struct device *dev,
   const struct hwspinlock_ops *ops, int base_id, int num_locks,
   int num_reserved_locks);
 

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv5 RFC 12/15] hwspinlock/core: add OF helper to parse reserved locks

2014-05-05 Thread Josh Cartwright
On Mon, May 05, 2014 at 04:44:25PM -0500, Suman Anna wrote:
 Hi Rob,
 
 On 04/30/2014 07:34 PM, Suman Anna wrote:
  The property 'hwlock-reserved-locks' will be used to represent
  the number of locks to be reserved for clients that would need
  to request/operate on specific locks. A new OF helper function,
  of_hwspin_lock_get_num_reserved_locks(), is added to minimize
  duplication in different platform implementations.
  
  The function will return a value of 0 if the property is not
  defined, so as to support a default behavior of marking all
  locks as unused and open for anonymous allocations.
  
  Signed-off-by: Suman Anna s-a...@ti.com
  ---
   .../devicetree/bindings/hwlock/hwlock.txt  |  3 +++
   drivers/hwspinlock/hwspinlock_core.c   | 25 
  ++
   include/linux/hwspinlock.h |  1 +
   3 files changed, 29 insertions(+)
  
  diff --git a/Documentation/devicetree/bindings/hwlock/hwlock.txt 
  b/Documentation/devicetree/bindings/hwlock/hwlock.txt
  index d538a9b..88d16d2 100644
  --- a/Documentation/devicetree/bindings/hwlock/hwlock.txt
  +++ b/Documentation/devicetree/bindings/hwlock/hwlock.txt
  @@ -18,6 +18,9 @@ Common properties:
  property is needed on hwlock devices, where the number
  of supported locks within a hwlock device cannot be
  read from a register.
  +- hwlock-reserved-locks: Number of locks to reserve for clients requiring
  +   specific locks. This value cannot exceed the value of
  +   hwlock-num-locks.
 
 Any suggestions here on the approach? This property falls into a gray
 area as well, as the current approach is somewhat limiting (it doesn't
 support sparse reserved locks, and expects them at the beginning of the
 lock range).

Is it possible to implement a pinctrl-like hogging approach, whereby the
specific locks that need to be reserved are consumed by the controller
itself?

  Josh

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 RFC 12/15] hwspinlock/core: add OF helper to parse reserved locks

2014-04-30 Thread Suman Anna
The property 'hwlock-reserved-locks' will be used to represent
the number of locks to be reserved for clients that would need
to request/operate on specific locks. A new OF helper function,
of_hwspin_lock_get_num_reserved_locks(), is added to minimize
duplication in different platform implementations.

The function will return a value of 0 if the property is not
defined, so as to support a default behavior of marking all
locks as unused and open for anonymous allocations.

Signed-off-by: Suman Anna 
---
 .../devicetree/bindings/hwlock/hwlock.txt  |  3 +++
 drivers/hwspinlock/hwspinlock_core.c   | 25 ++
 include/linux/hwspinlock.h |  1 +
 3 files changed, 29 insertions(+)

diff --git a/Documentation/devicetree/bindings/hwlock/hwlock.txt 
b/Documentation/devicetree/bindings/hwlock/hwlock.txt
index d538a9b..88d16d2 100644
--- a/Documentation/devicetree/bindings/hwlock/hwlock.txt
+++ b/Documentation/devicetree/bindings/hwlock/hwlock.txt
@@ -18,6 +18,9 @@ Common properties:
property is needed on hwlock devices, where the number
of supported locks within a hwlock device cannot be
read from a register.
+- hwlock-reserved-locks: Number of locks to reserve for clients requiring
+   specific locks. This value cannot exceed the value of
+   hwlock-num-locks.
 - hwlock-base-id:  An unique base Id for the locks for a particular hwlock
device. This property is mandatory ONLY if a SoC has
several hwlock devices.
diff --git a/drivers/hwspinlock/hwspinlock_core.c 
b/drivers/hwspinlock/hwspinlock_core.c
index e05cea8..e74b55b 100644
--- a/drivers/hwspinlock/hwspinlock_core.c
+++ b/drivers/hwspinlock/hwspinlock_core.c
@@ -286,6 +286,31 @@ int of_hwspin_lock_get_base_id(struct device_node *dn)
 EXPORT_SYMBOL_GPL(of_hwspin_lock_get_base_id);
 
 /**
+ * of_hwspin_lock_get_num_reserved_locks() - retrieve number of reserved locks
+ * @dn: device node pointer
+ *
+ * This is an OF helper function that can be called by the underlying platform
+ * specific implementations, to retrieve the number of locks to reserve from
+ * the hwspinlock device instance's base id. The hwlock-reserved-locks DT
+ * property needs to be defined for requesting any DT-based locks.
+ *
+ * Returns a positive number of locks on success, a default value of 0 if the
+ * property is missing or an appropriate error code as returned by the OF layer
+ */
+int of_hwspin_lock_get_num_reserved_locks(struct device_node *dn)
+{
+   unsigned int val = 0;
+   int ret;
+
+   ret = of_property_read_u32(dn, "hwlock-reserved-locks", );
+   if (!ret || ret == -EINVAL)
+   ret = val;
+
+   return ret;
+}
+EXPORT_SYMBOL_GPL(of_hwspin_lock_get_num_reserved_locks);
+
+/**
  * of_hwspin_lock_get_num_locks() - OF helper to retrieve number of locks
  * @dn: device node pointer
  *
diff --git a/include/linux/hwspinlock.h b/include/linux/hwspinlock.h
index d120035..d18431f 100644
--- a/include/linux/hwspinlock.h
+++ b/include/linux/hwspinlock.h
@@ -69,6 +69,7 @@ int of_hwspin_lock_simple_xlate(struct hwspinlock_device 
*bank,
const struct of_phandle_args *hwlock_spec);
 int of_hwspin_lock_get_base_id(struct device_node *dn);
 int of_hwspin_lock_get_num_locks(struct device_node *dn);
+int of_hwspin_lock_get_num_reserved_locks(struct device_node *dn);
 int hwspin_lock_register(struct hwspinlock_device *bank, struct device *dev,
const struct hwspinlock_ops *ops, int base_id, int num_locks,
int num_reserved_locks);
-- 
1.9.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 RFC 12/15] hwspinlock/core: add OF helper to parse reserved locks

2014-04-30 Thread Suman Anna
The property 'hwlock-reserved-locks' will be used to represent
the number of locks to be reserved for clients that would need
to request/operate on specific locks. A new OF helper function,
of_hwspin_lock_get_num_reserved_locks(), is added to minimize
duplication in different platform implementations.

The function will return a value of 0 if the property is not
defined, so as to support a default behavior of marking all
locks as unused and open for anonymous allocations.

Signed-off-by: Suman Anna s-a...@ti.com
---
 .../devicetree/bindings/hwlock/hwlock.txt  |  3 +++
 drivers/hwspinlock/hwspinlock_core.c   | 25 ++
 include/linux/hwspinlock.h |  1 +
 3 files changed, 29 insertions(+)

diff --git a/Documentation/devicetree/bindings/hwlock/hwlock.txt 
b/Documentation/devicetree/bindings/hwlock/hwlock.txt
index d538a9b..88d16d2 100644
--- a/Documentation/devicetree/bindings/hwlock/hwlock.txt
+++ b/Documentation/devicetree/bindings/hwlock/hwlock.txt
@@ -18,6 +18,9 @@ Common properties:
property is needed on hwlock devices, where the number
of supported locks within a hwlock device cannot be
read from a register.
+- hwlock-reserved-locks: Number of locks to reserve for clients requiring
+   specific locks. This value cannot exceed the value of
+   hwlock-num-locks.
 - hwlock-base-id:  An unique base Id for the locks for a particular hwlock
device. This property is mandatory ONLY if a SoC has
several hwlock devices.
diff --git a/drivers/hwspinlock/hwspinlock_core.c 
b/drivers/hwspinlock/hwspinlock_core.c
index e05cea8..e74b55b 100644
--- a/drivers/hwspinlock/hwspinlock_core.c
+++ b/drivers/hwspinlock/hwspinlock_core.c
@@ -286,6 +286,31 @@ int of_hwspin_lock_get_base_id(struct device_node *dn)
 EXPORT_SYMBOL_GPL(of_hwspin_lock_get_base_id);
 
 /**
+ * of_hwspin_lock_get_num_reserved_locks() - retrieve number of reserved locks
+ * @dn: device node pointer
+ *
+ * This is an OF helper function that can be called by the underlying platform
+ * specific implementations, to retrieve the number of locks to reserve from
+ * the hwspinlock device instance's base id. The hwlock-reserved-locks DT
+ * property needs to be defined for requesting any DT-based locks.
+ *
+ * Returns a positive number of locks on success, a default value of 0 if the
+ * property is missing or an appropriate error code as returned by the OF layer
+ */
+int of_hwspin_lock_get_num_reserved_locks(struct device_node *dn)
+{
+   unsigned int val = 0;
+   int ret;
+
+   ret = of_property_read_u32(dn, hwlock-reserved-locks, val);
+   if (!ret || ret == -EINVAL)
+   ret = val;
+
+   return ret;
+}
+EXPORT_SYMBOL_GPL(of_hwspin_lock_get_num_reserved_locks);
+
+/**
  * of_hwspin_lock_get_num_locks() - OF helper to retrieve number of locks
  * @dn: device node pointer
  *
diff --git a/include/linux/hwspinlock.h b/include/linux/hwspinlock.h
index d120035..d18431f 100644
--- a/include/linux/hwspinlock.h
+++ b/include/linux/hwspinlock.h
@@ -69,6 +69,7 @@ int of_hwspin_lock_simple_xlate(struct hwspinlock_device 
*bank,
const struct of_phandle_args *hwlock_spec);
 int of_hwspin_lock_get_base_id(struct device_node *dn);
 int of_hwspin_lock_get_num_locks(struct device_node *dn);
+int of_hwspin_lock_get_num_reserved_locks(struct device_node *dn);
 int hwspin_lock_register(struct hwspinlock_device *bank, struct device *dev,
const struct hwspinlock_ops *ops, int base_id, int num_locks,
int num_reserved_locks);
-- 
1.9.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/