Re: [PATCH v3 2/2] OMAP: omap_device: Add a method to build an omap_device from a DT node

2011-09-29 Thread Grant Likely
On Wed, Sep 28, 2011 at 10:47:32AM -0700, Kevin Hilman wrote:
 Cousson, Benoit b-cous...@ti.com writes:
 
  Hi Grant, Kevin,
 
  Should I go ahead with this version and repost the series with that
  third patch?
 
 Fine with me.
 
 Grant let me know if you prefer if I merge it (with your ack) with the
 rest of the series or if you want to take it to avoid conflicts.

I'm happy with the way things have gone.  Go ahead and add my Ack and
merge it through your tree.  I'd like to avoid the conflicts.

g.

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


Re: [PATCH v3 2/2] OMAP: omap_device: Add a method to build an omap_device from a DT node

2011-09-29 Thread Kevin Hilman
Grant Likely grant.lik...@secretlab.ca writes:

 On Wed, Sep 28, 2011 at 10:47:32AM -0700, Kevin Hilman wrote:
 Cousson, Benoit b-cous...@ti.com writes:
 
  Hi Grant, Kevin,
 
  Should I go ahead with this version and repost the series with that
  third patch?
 
 Fine with me.
 
 Grant let me know if you prefer if I merge it (with your ack) with the
 rest of the series or if you want to take it to avoid conflicts.

 I'm happy with the way things have gone.  Go ahead and add my Ack and
 merge it through your tree.  I'd like to avoid the conflicts.

Thanks, I think keeping this series together will be smoothest.

Adding your ack, and queuing for v3.2 (branch: for_3.2/omap_device-2)

Kevin

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


Re: [PATCH v3 2/2] OMAP: omap_device: Add a method to build an omap_device from a DT node

2011-09-28 Thread Cousson, Benoit

Hi Grant, Kevin,

Should I go ahead with this version and repost the series with that 
third patch?


Thanks,
Benoit


On 9/27/2011 6:04 PM, Cousson, Benoit wrote:

[...]


From 4403f8a00090e5ea1814a5242947b81c348947a1 Mon Sep 17 00:00:00 2001
From: Benoit Coussonb-cous...@ti.com
Date: Tue, 27 Sep 2011 17:45:43 +0200
Subject: [PATCH] of: Add helpers to get one string in multiple strings property

Add of_property_read_string_index and of_property_count_strings
to retrieve one string inside a property that will contains
severals strings.

Signed-off-by: Benoit Coussonb-cous...@ti.com
---
  drivers/of/base.c  |   85 
  include/linux/of.h |   18 +++
  2 files changed, 103 insertions(+), 0 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 3ff22e3..d97d53e 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -662,6 +662,91 @@ int of_property_read_string(struct device_node *np, const 
char *propname,
  EXPORT_SYMBOL_GPL(of_property_read_string);

  /**
+ * of_property_read_string_index - Find and read a string from a multiple
+ * strings property.
+ * @np:device node from which the property value is to be read.
+ * @propname:  name of the property to be searched.
+ * @index: index of the string in the list of strings
+ * @out_string:pointer to null terminated return string, modified only 
if
+ * return value is 0.
+ *
+ * Search for a property in a device tree node and retrieve a null
+ * terminated string value (pointer to data, not a copy) in the list of strings
+ * contained in that property.
+ * Returns 0 on
+ * success, -EINVAL if the property does not exist, -ENODATA if property
+ * does not have a value, and -EILSEQ if the string is not null-terminated
+ * within the length of the property data.
+ *
+ * The out_string pointer is modified only if a valid string can be decoded.
+ */
+int of_property_read_string_index(struct device_node *np, const char *propname,
+ int index, const char **output)
+{
+   struct property *prop = of_find_property(np, propname, NULL);
+   int i = 0;
+   size_t l = 0, total = 0;
+   const char *p;
+
+   if (!prop)
+   return -EINVAL;
+   if (!prop-value)
+   return -ENODATA;
+   if (strnlen(prop-value, prop-length)= prop-length)
+   return -EILSEQ;
+
+   p = prop-value;
+
+   for (i = 0; total  prop-length; total += l, p += l) {
+   l = strlen(p) + 1;
+   if ((*p != 0)  (i++ == index)) {
+   *output = p;
+   return 0;
+   }
+   }
+   return -ENODATA;
+}
+EXPORT_SYMBOL_GPL(of_property_read_string_index);
+
+
+/**
+ * of_property_count_strings - Find and return the number of strings from a
+ * multiple strings property.
+ * @np:device node from which the property value is to be read.
+ * @propname:  name of the property to be searched.
+ *
+ * Search for a property in a device tree node and retrieve the number of null
+ * terminated string contain in it. Returns the number of strings on
+ * success, -EINVAL if the property does not exist, -ENODATA if property
+ * does not have a value, and -EILSEQ if the string is not null-terminated
+ * within the length of the property data.
+ */
+int of_property_count_strings(struct device_node *np, const char *propname)
+{
+   struct property *prop = of_find_property(np, propname, NULL);
+   int i = 0;
+   size_t l = 0, total = 0;
+   const char *p;
+
+   if (!prop)
+   return -EINVAL;
+   if (!prop-value)
+   return -ENODATA;
+   if (strnlen(prop-value, prop-length)= prop-length)
+   return -EILSEQ;
+
+   p = prop-value;
+
+   for (i = 0; total  prop-length; total += l, p += l) {
+   l = strlen(p) + 1;
+   if (*p != 0)
+   i++;
+   }
+   return i;
+}
+EXPORT_SYMBOL_GPL(of_property_count_strings);
+
+/**
   * of_parse_phandle - Resolve a phandle property to a device_node pointer
   * @np: Pointer to device node holding phandle property
   * @phandle_name: Name of property holding a phandle value
diff --git a/include/linux/of.h b/include/linux/of.h
index 9180dc5..9eadc4e 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -203,6 +203,11 @@ extern int of_property_read_u32_array(const struct 
device_node *np,
  extern int of_property_read_string(struct device_node *np,
   const char *propname,
   const char **out_string);
+extern int of_property_read_string_index(struct device_node *np,
+const char *propname,
+int index, const char **output);
+extern int of_property_count_strings(struct device_node *np,
+const char 

Re: [PATCH v3 2/2] OMAP: omap_device: Add a method to build an omap_device from a DT node

2011-09-28 Thread Kevin Hilman
Cousson, Benoit b-cous...@ti.com writes:

 Hi Grant, Kevin,

 Should I go ahead with this version and repost the series with that
 third patch?

Fine with me.

Grant let me know if you prefer if I merge it (with your ack) with the
rest of the series or if you want to take it to avoid conflicts.

Kevin
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/2] OMAP: omap_device: Add a method to build an omap_device from a DT node

2011-09-27 Thread Cousson, Benoit
On 9/27/2011 3:46 AM, Grant Likely wrote:
 On Thu, Sep 22, 2011 at 10:52:25PM +0200, Benoit Cousson wrote:

[...]

 +Required properties:
 +- compatible: Every devices present in OMAP SoC should be in the
 +  form: ti,XXX
 +- ti,hwmods: list of hwmods attached to a device. Must contain at least
 +  one hwmod.
 
 Nit: This should specify that ti,hwmods is a list of hwmod names
 (ascii strings), and that the hwmod names come from the OMAP
 documentation.  Don't respin the patch over this though, just do a
 follow-up patch.

OK, but since you asked later to remove the DT helpers, I will have to resend 
it anyway:-)

[...]

 +/*
 + * XXX: DT helper functions that should be replaced by more generic
 + * API introduced by Stephen Warren once they'll be in mainline.
 + */
 +static int _dt_count_property_string(const char *prop, int len)
 +{
 +int i = 0;
 +size_t l = 0, total = 0;
 +
 +if (!prop || !len)
 +return -EINVAL;
 +
 +for (i = 0; len= total; total += l, prop += l) {
 +l = strlen(prop) + 1;
 +if (*prop != 0)
 +i++;
 +}
 +return i;
 +}
 +
 +static int _dt_get_property(const char *prop, int len, int index, char 
 *output,
 +int size)
 +{
 +int i = 0;
 +size_t l = 0, total = 0;
 +
 +if (!prop || !len)
 +return -EINVAL;
 +
 +for (i = 0; len= total; total += l, prop += l) {
 +l = strlcpy(output, prop, size) + 1;
 +if (*prop != 0) {
 +if (i++ == index)
 +return 0;
 +}
 +}
 +return -ENODEV;
 +}
 
 Don't merge this.  Kevin or I could put Stephen's patch into a separate
 branch that both Kevin and I pull.  There's no need to merge temporary
 code.
 
 That said, I just looked at Stephen's iterator, and even without it
 this particular hunk shouldn't be merged here.  A
 of_property_count_strings() function is useful in and of itself, and
 of_property_read_string() could be extended with an
 of_property_read_string_index() version.  Both changes should be in
 the common drivers/of code, and you can easily do them.

I'm fine with that, but in that case, and in order to be consistent with the 
existing of_property_read_string, I should include the find_property in these 
functions. Whereas in my case, it was supposed to be done before.

Please find below a first version of this patch.

Regards,
Benoit

---
From 4403f8a00090e5ea1814a5242947b81c348947a1 Mon Sep 17 00:00:00 2001
From: Benoit Cousson b-cous...@ti.com
Date: Tue, 27 Sep 2011 17:45:43 +0200
Subject: [PATCH] of: Add helpers to get one string in multiple strings property

Add of_property_read_string_index and of_property_count_strings
to retrieve one string inside a property that will contains
severals strings.

Signed-off-by: Benoit Cousson b-cous...@ti.com
---
 drivers/of/base.c  |   85 
 include/linux/of.h |   18 +++
 2 files changed, 103 insertions(+), 0 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 3ff22e3..d97d53e 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -662,6 +662,91 @@ int of_property_read_string(struct device_node *np, const 
char *propname,
 EXPORT_SYMBOL_GPL(of_property_read_string);
 
 /**
+ * of_property_read_string_index - Find and read a string from a multiple
+ * strings property.
+ * @np:device node from which the property value is to be read.
+ * @propname:  name of the property to be searched.
+ * @index: index of the string in the list of strings
+ * @out_string:pointer to null terminated return string, modified only 
if
+ * return value is 0.
+ *
+ * Search for a property in a device tree node and retrieve a null
+ * terminated string value (pointer to data, not a copy) in the list of strings
+ * contained in that property.
+ * Returns 0 on
+ * success, -EINVAL if the property does not exist, -ENODATA if property
+ * does not have a value, and -EILSEQ if the string is not null-terminated
+ * within the length of the property data.
+ *
+ * The out_string pointer is modified only if a valid string can be decoded.
+ */
+int of_property_read_string_index(struct device_node *np, const char *propname,
+ int index, const char **output)
+{
+   struct property *prop = of_find_property(np, propname, NULL);
+   int i = 0;
+   size_t l = 0, total = 0;
+   const char *p;
+
+   if (!prop)
+   return -EINVAL;
+   if (!prop-value)
+   return -ENODATA;
+   if (strnlen(prop-value, prop-length) = prop-length)
+   return -EILSEQ;
+
+   p = prop-value;
+
+   for (i = 0; total  prop-length; total += l, p += l) {
+   l = strlen(p) + 1;
+   if ((*p != 0)  (i++ == index)) {
+   *output = p;
+   return 0;
+   }
+   }
+   

Re: [PATCH v3 2/2] OMAP: omap_device: Add a method to build an omap_device from a DT node

2011-09-26 Thread Grant Likely
On Thu, Sep 22, 2011 at 10:52:25PM +0200, Benoit Cousson wrote:
 Add a notifier called during device_add phase. If an of_node is present,
 retrieve the hwmod entry in order to populate properly the omap_device
 structure.
 For the moment the resource from the device-tree are overloaded.
 DT does not support named resource yet, and thus, most driver
 will not work without that information.
 
 Add two helpers function to parse a property that contains multiple
 strings. Please note that these helpers will be replaced by a more generic
 iterator currently proposed on devicetree mailing list as soon as it
 will be merged.
 
 Add a documentation to capture the specifics OMAP bindings
 needed for device-tree support.
 
 Signed-off-by: Benoit Cousson b-cous...@ti.com
 Cc: Kevin Hilman khil...@ti.com
 ---
  .../devicetree/bindings/arm/omap/omap.txt  |   42 ++
  arch/arm/plat-omap/omap_device.c   |  145 
 
  2 files changed, 187 insertions(+), 0 deletions(-)
  create mode 100644 Documentation/devicetree/bindings/arm/omap/omap.txt
 
 diff --git a/Documentation/devicetree/bindings/arm/omap/omap.txt 
 b/Documentation/devicetree/bindings/arm/omap/omap.txt
 new file mode 100644
 index 000..6513d05
 --- /dev/null
 +++ b/Documentation/devicetree/bindings/arm/omap/omap.txt
 @@ -0,0 +1,42 @@
 +* Texas Instruments OMAP
 +
 +OMAP is currently using a static file per SoC family to describe the
 +IPs present in the SoC.
 +On top of that an omap_device is created to extend the platform_device
 +capabilities and to allow binding with one or several hwmods.
 +The hwmods will contain all the information to build the device:
 +adresse range, irq lines, dma lines, interconnect, PRCM register,
 +clock domain, input clocks.
 +For the moment just point to the existing hwmod, the next step will be
 +to move data from hwmod to device-tree representation.
 +
 +
 +Required properties:
 +- compatible: Every devices present in OMAP SoC should be in the
 +  form: ti,XXX
 +- ti,hwmods: list of hwmods attached to a device. Must contain at least
 +  one hwmod.

Nit: This should specify that ti,hwmods is a list of hwmod names
(ascii strings), and that the hwmod names come from the OMAP
documentation.  Don't respin the patch over this though, just do a
follow-up patch.

 +
 +Optional properties:
 +- ti,no_idle_on_suspend: When present, it prevents the PM to idle the module
 +  during suspend.
 +
 +
 +Example:
 +
 +spinlock@1 {
 +compatible = ti,omap-spinlock;
 +ti,hwmods = spinlock;
 +};
 +
 +
 +Boards:
 +
 +- OMAP3 BeagleBoard : Low cost community board
 +  compatible = ti,omap3-beagle, ti,omap3
 +
 +- OMAP4 SDP : Software Developement Board
 +  compatible = ti,omap4-sdp, ti,omap4430
 +
 +- OMAP4 PandaBoard : Low cost community board
 +  compatible = ti,omap4-panda, ti,omap4430
 diff --git a/arch/arm/plat-omap/omap_device.c 
 b/arch/arm/plat-omap/omap_device.c
 index cac7b9a..5b63989 100644
 --- a/arch/arm/plat-omap/omap_device.c
 +++ b/arch/arm/plat-omap/omap_device.c
 @@ -85,6 +85,8 @@
  #include linux/clk.h
  #include linux/clkdev.h
  #include linux/pm_runtime.h
 +#include linux/of.h
 +#include linux/notifier.h
  
  #include plat/omap_device.h
  #include plat/omap_hwmod.h
 @@ -94,12 +96,15 @@
  #define USE_WAKEUP_LAT   0
  #define IGNORE_WAKEUP_LAT1
  
 +#define MAX_HWMOD_NAME_SIZE  32
 +
  static int omap_device_register(struct platform_device *pdev);
  static int omap_early_device_register(struct platform_device *pdev);
  static struct omap_device *omap_device_alloc(struct platform_device *pdev,
 struct omap_hwmod **ohs, int oh_cnt,
 struct omap_device_pm_latency *pm_lats,
 int pm_lats_cnt);
 +static void omap_device_delete(struct omap_device *od);
  
  
  static struct omap_device_pm_latency omap_default_latency[] = {
 @@ -315,6 +320,138 @@ static void _add_hwmod_clocks_clkdev(struct omap_device 
 *od,
   _add_clkdev(od, oh-opt_clks[i].role, oh-opt_clks[i].clk);
  }
  
 +/*
 + * XXX: DT helper functions that should be replaced by more generic
 + * API introduced by Stephen Warren once they'll be in mainline.
 + */
 +static int _dt_count_property_string(const char *prop, int len)
 +{
 + int i = 0;
 + size_t l = 0, total = 0;
 +
 + if (!prop || !len)
 + return -EINVAL;
 +
 + for (i = 0; len = total; total += l, prop += l) {
 + l = strlen(prop) + 1;
 + if (*prop != 0)
 + i++;
 + }
 + return i;
 +}
 +
 +static int _dt_get_property(const char *prop, int len, int index, char 
 *output,
 + int size)
 +{
 + int i = 0;
 + size_t l = 0, total = 0;
 +
 + if (!prop || !len)
 + return -EINVAL;
 +
 + for (i = 0; len = total; total += l, prop += l) {
 + l = strlcpy(output, prop, size) + 1;
 +   

[PATCH v3 2/2] OMAP: omap_device: Add a method to build an omap_device from a DT node

2011-09-22 Thread Benoit Cousson
Add a notifier called during device_add phase. If an of_node is present,
retrieve the hwmod entry in order to populate properly the omap_device
structure.
For the moment the resource from the device-tree are overloaded.
DT does not support named resource yet, and thus, most driver
will not work without that information.

Add two helpers function to parse a property that contains multiple
strings. Please note that these helpers will be replaced by a more generic
iterator currently proposed on devicetree mailing list as soon as it
will be merged.

Add a documentation to capture the specifics OMAP bindings
needed for device-tree support.

Signed-off-by: Benoit Cousson b-cous...@ti.com
Cc: Kevin Hilman khil...@ti.com
---
 .../devicetree/bindings/arm/omap/omap.txt  |   42 ++
 arch/arm/plat-omap/omap_device.c   |  145 
 2 files changed, 187 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/arm/omap/omap.txt

diff --git a/Documentation/devicetree/bindings/arm/omap/omap.txt 
b/Documentation/devicetree/bindings/arm/omap/omap.txt
new file mode 100644
index 000..6513d05
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/omap/omap.txt
@@ -0,0 +1,42 @@
+* Texas Instruments OMAP
+
+OMAP is currently using a static file per SoC family to describe the
+IPs present in the SoC.
+On top of that an omap_device is created to extend the platform_device
+capabilities and to allow binding with one or several hwmods.
+The hwmods will contain all the information to build the device:
+adresse range, irq lines, dma lines, interconnect, PRCM register,
+clock domain, input clocks.
+For the moment just point to the existing hwmod, the next step will be
+to move data from hwmod to device-tree representation.
+
+
+Required properties:
+- compatible: Every devices present in OMAP SoC should be in the
+  form: ti,XXX
+- ti,hwmods: list of hwmods attached to a device. Must contain at least
+  one hwmod.
+
+Optional properties:
+- ti,no_idle_on_suspend: When present, it prevents the PM to idle the module
+  during suspend.
+
+
+Example:
+
+spinlock@1 {
+compatible = ti,omap-spinlock;
+ti,hwmods = spinlock;
+};
+
+
+Boards:
+
+- OMAP3 BeagleBoard : Low cost community board
+  compatible = ti,omap3-beagle, ti,omap3
+
+- OMAP4 SDP : Software Developement Board
+  compatible = ti,omap4-sdp, ti,omap4430
+
+- OMAP4 PandaBoard : Low cost community board
+  compatible = ti,omap4-panda, ti,omap4430
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
index cac7b9a..5b63989 100644
--- a/arch/arm/plat-omap/omap_device.c
+++ b/arch/arm/plat-omap/omap_device.c
@@ -85,6 +85,8 @@
 #include linux/clk.h
 #include linux/clkdev.h
 #include linux/pm_runtime.h
+#include linux/of.h
+#include linux/notifier.h
 
 #include plat/omap_device.h
 #include plat/omap_hwmod.h
@@ -94,12 +96,15 @@
 #define USE_WAKEUP_LAT 0
 #define IGNORE_WAKEUP_LAT  1
 
+#define MAX_HWMOD_NAME_SIZE32
+
 static int omap_device_register(struct platform_device *pdev);
 static int omap_early_device_register(struct platform_device *pdev);
 static struct omap_device *omap_device_alloc(struct platform_device *pdev,
  struct omap_hwmod **ohs, int oh_cnt,
  struct omap_device_pm_latency *pm_lats,
  int pm_lats_cnt);
+static void omap_device_delete(struct omap_device *od);
 
 
 static struct omap_device_pm_latency omap_default_latency[] = {
@@ -315,6 +320,138 @@ static void _add_hwmod_clocks_clkdev(struct omap_device 
*od,
_add_clkdev(od, oh-opt_clks[i].role, oh-opt_clks[i].clk);
 }
 
+/*
+ * XXX: DT helper functions that should be replaced by more generic
+ * API introduced by Stephen Warren once they'll be in mainline.
+ */
+static int _dt_count_property_string(const char *prop, int len)
+{
+   int i = 0;
+   size_t l = 0, total = 0;
+
+   if (!prop || !len)
+   return -EINVAL;
+
+   for (i = 0; len = total; total += l, prop += l) {
+   l = strlen(prop) + 1;
+   if (*prop != 0)
+   i++;
+   }
+   return i;
+}
+
+static int _dt_get_property(const char *prop, int len, int index, char *output,
+   int size)
+{
+   int i = 0;
+   size_t l = 0, total = 0;
+
+   if (!prop || !len)
+   return -EINVAL;
+
+   for (i = 0; len = total; total += l, prop += l) {
+   l = strlcpy(output, prop, size) + 1;
+   if (*prop != 0) {
+   if (i++ == index)
+   return 0;
+   }
+   }
+   return -ENODEV;
+}
+
+static struct dev_pm_domain omap_device_pm_domain;
+
+/**
+ * omap_device_build_from_dt - build an omap_device with multiple hwmods
+ * @pdev_name: name of the platform_device driver to use
+ * @pdev_id: this