devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 0/2] of: Device Tree enhancements needed by MIPS/OCTEON
@ 2012-02-29 19:21 David Daney
  2012-02-29 19:21 ` [PATCH v6 1/2] of/lib: Allow scripts/dtc/libfdt to be used from kernel code David Daney
  2012-02-29 19:21 ` [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths David Daney
  0 siblings, 2 replies; 9+ messages in thread
From: David Daney @ 2012-02-29 19:21 UTC (permalink / raw)
  To: linux-mips, ralf, devicetree-discuss, Grant Likely, Rob Herring
  Cc: linux-kernel, David Daney

From: David Daney <david.daney@cavium.com>

These two patches have been around for quite a while now.  I am
currently making a big push to get all out-of-tree OCTEON patches
upstream, and these two are prerequisites for all the rest.  The last
changes requested by Grant Likely and David Gibson (last May) are
incorporated.

As always, more comments are welcome, but it would be nice to see them
get merged too.


v6: No changes other than to split these out of the MIPS/OCTEON patch
    set to allow them to be merged separately if desired.

v5: Build libfdt in the lib directory instead of devices/of, and
    include all libfdt files.

    Changes to of_find_node_by_path() requested by Grant Likely.

v4: No changes to these two patches.

v3: libfdt building moved to devices/of/libfdt.  Cleanup and style
    improvements as suggested by Grant Likley.

v2: No changes to these two patches.


Background: The Octeon family of SOCs has a variety of on-chip
controllers for Ethernet, MDIO, I2C, and several other I/O devices.
These chips are used on boards with a great variety of different
configurations.  To date, the configuration and bus topology
information has been hard coded in the drivers and support code.

To facilitate supporting new chips and boards, we make use use the
Device Tree to encode the configuration information.  Migration to use
of the device tree is as follows:

o A device tree template is statically linked into the kernel image.
  Based on SOC type and board type, legacy configuration probing code
  is used to prune and patch the device tree template.

o New SOCs and boards will directly use a device tree passed by the
  bootloader.


These two patches are prerequisites for the bulk of the OCTEON changes.

1/2 - Infrastructure to allow scripts/dtc/libfdt to be used in the
      kernel.  As mentioned above, when using legacy bootloaders, we
      prune an in-kernel FDT image based on legacy probing code.
      libfdt is used to do the pruning.

2/2 - Enhancements to of_find_node_by_path() to allow it to traverse
      /aliases.  This is used by the OCTEON Ethernet drivers.


David Daney (2):
  of/lib: Allow scripts/dtc/libfdt to be used from kernel code
  of: Make of_find_node_by_path() traverse /aliases for relative paths.

 drivers/of/base.c          |   65 +++++++++++++++++++++++++++++++++++++++++--
 include/linux/libfdt.h     |    8 +++++
 include/linux/libfdt_env.h |   13 +++++++++
 lib/Kconfig                |    6 ++++
 lib/Makefile               |    5 +++
 lib/fdt.c                  |    2 +
 lib/fdt_ro.c               |    2 +
 lib/fdt_rw.c               |    2 +
 lib/fdt_strerror.c         |    2 +
 lib/fdt_sw.c               |    2 +
 lib/fdt_wip.c              |    2 +
 11 files changed, 106 insertions(+), 3 deletions(-)
 create mode 100644 include/linux/libfdt.h
 create mode 100644 include/linux/libfdt_env.h
 create mode 100644 lib/fdt.c
 create mode 100644 lib/fdt_ro.c
 create mode 100644 lib/fdt_rw.c
 create mode 100644 lib/fdt_strerror.c
 create mode 100644 lib/fdt_sw.c
 create mode 100644 lib/fdt_wip.c

-- 
1.7.2.3

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v6 1/2] of/lib: Allow scripts/dtc/libfdt to be used from kernel code
  2012-02-29 19:21 [PATCH v6 0/2] of: Device Tree enhancements needed by MIPS/OCTEON David Daney
@ 2012-02-29 19:21 ` David Daney
  2012-02-29 19:21 ` [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths David Daney
  1 sibling, 0 replies; 9+ messages in thread
From: David Daney @ 2012-02-29 19:21 UTC (permalink / raw)
  To: linux-mips, ralf, devicetree-discuss, Grant Likely, Rob Herring
  Cc: linux-kernel, David Daney

From: David Daney <david.daney@cavium.com>

libfdt is part of the device tree support in scripts/dtc/libfdt.  For
some platforms that use the Device Tree, we want to be able to edit
the flattened device tree form.

We don't want to burden kernel builds that do not require it, so we
gate compilation of libfdt files with CONFIG_LIBFDT.  So if it is
needed, you need to do this in your Kconfig:

	select LIBFDT

And in the Makefile of the code using libfdt something like:

ccflags-y := -I$(src)/../../../scripts/dtc/libfdt

Signed-off-by: David Daney <david.daney@cavium.com>
---
 include/linux/libfdt.h     |    8 ++++++++
 include/linux/libfdt_env.h |   13 +++++++++++++
 lib/Kconfig                |    6 ++++++
 lib/Makefile               |    5 +++++
 lib/fdt.c                  |    2 ++
 lib/fdt_ro.c               |    2 ++
 lib/fdt_rw.c               |    2 ++
 lib/fdt_strerror.c         |    2 ++
 lib/fdt_sw.c               |    2 ++
 lib/fdt_wip.c              |    2 ++
 10 files changed, 44 insertions(+), 0 deletions(-)
 create mode 100644 include/linux/libfdt.h
 create mode 100644 include/linux/libfdt_env.h
 create mode 100644 lib/fdt.c
 create mode 100644 lib/fdt_ro.c
 create mode 100644 lib/fdt_rw.c
 create mode 100644 lib/fdt_strerror.c
 create mode 100644 lib/fdt_sw.c
 create mode 100644 lib/fdt_wip.c

diff --git a/include/linux/libfdt.h b/include/linux/libfdt.h
new file mode 100644
index 0000000..4c0306c
--- /dev/null
+++ b/include/linux/libfdt.h
@@ -0,0 +1,8 @@
+#ifndef _INCLUDE_LIBFDT_H_
+#define _INCLUDE_LIBFDT_H_
+
+#include <linux/libfdt_env.h>
+#include "../../scripts/dtc/libfdt/fdt.h"
+#include "../../scripts/dtc/libfdt/libfdt.h"
+
+#endif /* _INCLUDE_LIBFDT_H_ */
diff --git a/include/linux/libfdt_env.h b/include/linux/libfdt_env.h
new file mode 100644
index 0000000..01508c7
--- /dev/null
+++ b/include/linux/libfdt_env.h
@@ -0,0 +1,13 @@
+#ifndef _LIBFDT_ENV_H
+#define _LIBFDT_ENV_H
+
+#include <linux/string.h>
+
+#include <asm/byteorder.h>
+
+#define fdt32_to_cpu(x) be32_to_cpu(x)
+#define cpu_to_fdt32(x) cpu_to_be32(x)
+#define fdt64_to_cpu(x) be64_to_cpu(x)
+#define cpu_to_fdt64(x) cpu_to_be64(x)
+
+#endif /* _LIBFDT_ENV_H */
diff --git a/lib/Kconfig b/lib/Kconfig
index 43359bb..5b4444e 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -369,4 +369,10 @@ config SIGNATURE
 	  Digital signature verification. Currently only RSA is supported.
 	  Implementation is done using GnuPG MPI library
 
+#
+# libfdt files, only selected if needed.
+#
+config LIBFDT
+	bool
+
 endmenu
diff --git a/lib/Makefile b/lib/Makefile
index 18515f0..1c6c198 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -123,6 +123,11 @@ obj-$(CONFIG_SIGNATURE) += digsig.o
 
 obj-$(CONFIG_CLZ_TAB) += clz_tab.o
 
+libfdt_files = fdt.o fdt_ro.o fdt_wip.o fdt_rw.o fdt_sw.o fdt_strerror.o
+$(foreach file, $(libfdt_files), \
+	$(eval CFLAGS_$(file) = -I$(src)/../scripts/dtc/libfdt))
+lib-$(CONFIG_LIBFDT) += $(libfdt_files)
+
 hostprogs-y	:= gen_crc32table
 clean-files	:= crc32table.h
 
diff --git a/lib/fdt.c b/lib/fdt.c
new file mode 100644
index 0000000..97f2006
--- /dev/null
+++ b/lib/fdt.c
@@ -0,0 +1,2 @@
+#include <linux/libfdt_env.h>
+#include "../scripts/dtc/libfdt/fdt.c"
diff --git a/lib/fdt_ro.c b/lib/fdt_ro.c
new file mode 100644
index 0000000..f73c04e
--- /dev/null
+++ b/lib/fdt_ro.c
@@ -0,0 +1,2 @@
+#include <linux/libfdt_env.h>
+#include "../scripts/dtc/libfdt/fdt_ro.c"
diff --git a/lib/fdt_rw.c b/lib/fdt_rw.c
new file mode 100644
index 0000000..0c1f0f4
--- /dev/null
+++ b/lib/fdt_rw.c
@@ -0,0 +1,2 @@
+#include <linux/libfdt_env.h>
+#include "../scripts/dtc/libfdt/fdt_rw.c"
diff --git a/lib/fdt_strerror.c b/lib/fdt_strerror.c
new file mode 100644
index 0000000..8713e3f
--- /dev/null
+++ b/lib/fdt_strerror.c
@@ -0,0 +1,2 @@
+#include <linux/libfdt_env.h>
+#include "../scripts/dtc/libfdt/fdt_strerror.c"
diff --git a/lib/fdt_sw.c b/lib/fdt_sw.c
new file mode 100644
index 0000000..9ac7e50
--- /dev/null
+++ b/lib/fdt_sw.c
@@ -0,0 +1,2 @@
+#include <linux/libfdt_env.h>
+#include "../scripts/dtc/libfdt/fdt_sw.c"
diff --git a/lib/fdt_wip.c b/lib/fdt_wip.c
new file mode 100644
index 0000000..45b3fc3
--- /dev/null
+++ b/lib/fdt_wip.c
@@ -0,0 +1,2 @@
+#include <linux/libfdt_env.h>
+#include "../scripts/dtc/libfdt/fdt_wip.c"
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths.
  2012-02-29 19:21 [PATCH v6 0/2] of: Device Tree enhancements needed by MIPS/OCTEON David Daney
  2012-02-29 19:21 ` [PATCH v6 1/2] of/lib: Allow scripts/dtc/libfdt to be used from kernel code David Daney
@ 2012-02-29 19:21 ` David Daney
  2012-02-29 20:36   ` David Miller
  2012-03-09  1:33   ` Grant Likely
  1 sibling, 2 replies; 9+ messages in thread
From: David Daney @ 2012-02-29 19:21 UTC (permalink / raw)
  To: linux-mips, ralf, devicetree-discuss, Grant Likely, Rob Herring
  Cc: linux-kernel, David Daney

From: David Daney <david.daney@cavium.com>

Currently all paths passed to of_find_node_by_path() must begin with a
'/', indicating a full path to the desired node.

Augment the look-up code so that if a path does *not* begin with '/',
the path is used as the name of an /aliases property.  The value of
this alias is then used as the full node path to be found.

Signed-off-by: David Daney <david.daney@cavium.com>
---
 drivers/of/base.c |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 5806449..0bbe47c 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -365,22 +365,81 @@ EXPORT_SYMBOL(of_get_next_child);
 
 /**
  *	of_find_node_by_path - Find a node matching a full OF path
- *	@path:	The full path to match
+ *	@path: Either the full path to match, or if the path does not
+ *	       start with '/', the name of a property of the /aliases
+ *	       node (an alias).  In the case of an alias, the node
+ *	       matching the alias' value will be returned.
  *
  *	Returns a node pointer with refcount incremented, use
  *	of_node_put() on it when done.
  */
 struct device_node *of_find_node_by_path(const char *path)
 {
-	struct device_node *np = allnodes;
+	struct device_node *np = NULL;
+	struct device_node *aliases = NULL;
+	char *alias = NULL;
+	char *new_path = NULL;
+	char *ps;
 
 	read_lock(&devtree_lock);
-	for (; np; np = np->allnext) {
+
+	/*
+	 * The following code has three possibilities:
+	 * 1) '/' at start of string; path == ps; (based at root)
+	 * 2) '/' at offset in string; path < ps; (relative to alias)
+	 * 3) '/' not found; ps == NULL; (alias only)
+	 *
+	 * If ps != path, then it is either a pure alias (ps == NULL),
+	 * or an alias with a relative path (path < ps).  Either way,
+	 * look up the path pointed to by the alias.
+	 */
+	ps = strchr(path, '/');
+	if (path != ps) {
+		aliases = of_find_node_by_path("/aliases");
+		if (!aliases)
+			goto out;
+
+		/*
+		 * Duplicate the alias part of the string so it can be
+		 * NULL terminated.
+		 */
+		alias = kstrndup(path,
+				 ps ? (ps - path) : strlen(path), GFP_KERNEL);
+		if (!alias)
+			goto out;
+		path = of_get_property(aliases, alias, NULL);
+		if (!path || path[0] != '/')
+			goto out;
+
+		/* If ps is not NULL, then there is a relative path to append */
+		if (ps) {
+			new_path = kzalloc(strlen(path) + strlen(ps) + 1,
+					   GFP_KERNEL);
+			if (!new_path)
+				goto out;
+
+			sprintf(new_path, "%s%s", path, ps);
+			path = new_path;
+		}
+	}
+
+	/*
+	 * At this point, path now points to the full unaliased path
+	 * to a node, regardless of whether or not it started with an
+	 * alias.
+	 */
+
+	for (np = allnodes; np; np = np->allnext) {
 		if (np->full_name && (of_node_cmp(np->full_name, path) == 0)
 		    && of_node_get(np))
 			break;
 	}
+out:
+	if (aliases)
+		of_node_put(aliases);
 	read_unlock(&devtree_lock);
+	kfree(alias);
+	kfree(new_path);
 	return np;
 }
 EXPORT_SYMBOL(of_find_node_by_path);
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths.
  2012-02-29 19:21 ` [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths David Daney
@ 2012-02-29 20:36   ` David Miller
  2012-02-29 21:34     ` David Daney
  2012-03-09  1:33   ` Grant Likely
  1 sibling, 1 reply; 9+ messages in thread
From: David Miller @ 2012-02-29 20:36 UTC (permalink / raw)
  To: ddaney.cavm
  Cc: linux-mips, ralf, devicetree-discuss, grant.likely, rob.herring,
	linux-kernel, david.daney

From: David Daney <ddaney.cavm@gmail.com>
Date: Wed, 29 Feb 2012 11:21:04 -0800

> Currently all paths passed to of_find_node_by_path() must begin with a
> '/', indicating a full path to the desired node.
> 
> Augment the look-up code so that if a path does *not* begin with '/',
> the path is used as the name of an /aliases property.  The value of
> this alias is then used as the full node path to be found.
> 
> Signed-off-by: David Daney <david.daney@cavium.com>

But as the caller you sure as hell know whether you have a "/"
prefixed name or not.

Why complicate an incredibly well designed and simple function for
something you can create another interface for?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths.
  2012-02-29 20:36   ` David Miller
@ 2012-02-29 21:34     ` David Daney
  2012-02-29 22:18       ` David Daney
  0 siblings, 1 reply; 9+ messages in thread
From: David Daney @ 2012-02-29 21:34 UTC (permalink / raw)
  To: David Miller, grant.likely
  Cc: ddaney.cavm, linux-mips, ralf, devicetree-discuss, rob.herring,
	linux-kernel

On 02/29/2012 12:36 PM, David Miller wrote:
> From: David Daney<ddaney.cavm@gmail.com>
> Date: Wed, 29 Feb 2012 11:21:04 -0800
>
>> Currently all paths passed to of_find_node_by_path() must begin with a
>> '/', indicating a full path to the desired node.
>>
>> Augment the look-up code so that if a path does *not* begin with '/',
>> the path is used as the name of an /aliases property.  The value of
>> this alias is then used as the full node path to be found.
>>
>> Signed-off-by: David Daney<david.daney@cavium.com>
>
> But as the caller you sure as hell know whether you have a "/"
> prefixed name or not.

Yes, worst case we could just examine the first character of the string.

>
> Why complicate an incredibly well designed and simple function for
> something you can create another interface for?
>

Because in this message:

http://www.linux-mips.org/archives/linux-mips/2011-02/msg00147.html

Grant explicitly asked me to do it this way when he said:

    of_find_node_by_path() needs to be fixed to also accept alias
    values so that a string that starts with a '/' is a full path, but
    no leading '/' means start with an alias.  This code will lose a
    level of indentation if you can make that change to the common
    code.

And then in follow ups to that conversation, we eventually came up
with this patch.

If you find it particularly objectionable, convince Grant to NACK the 
patch (but please keep me CCed on the conversation), and I will open 
code the equivalent in my drivers.

Thanks,
David Daney

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths.
  2012-02-29 21:34     ` David Daney
@ 2012-02-29 22:18       ` David Daney
  0 siblings, 0 replies; 9+ messages in thread
From: David Daney @ 2012-02-29 22:18 UTC (permalink / raw)
  To: David Daney
  Cc: David Miller, grant.likely, linux-mips, ralf, devicetree-discuss,
	rob.herring, linux-kernel

Grant and others,

Really this patch 2/2 is not so critical for me.  I am using it, but can 
(and perhaps should) avoid using of_find_node_by_path() altogether, thus 
making the patch unneeded.

If you would like, we can drop this one, but I would still very much 
like '[PATCH v6 1/2] of/lib: Allow scripts/dtc/libfdt to be used from 
kernel code' to be merged.

Do you want me to send the first patch separately, or could you just 
'cherry-pick' it from this set?

Thanks,
David Daney


On 02/29/2012 01:34 PM, David Daney wrote:
> On 02/29/2012 12:36 PM, David Miller wrote:
>> From: David Daney<ddaney.cavm@gmail.com>
>> Date: Wed, 29 Feb 2012 11:21:04 -0800
>>
>>> Currently all paths passed to of_find_node_by_path() must begin with a
>>> '/', indicating a full path to the desired node.
>>>
>>> Augment the look-up code so that if a path does *not* begin with '/',
>>> the path is used as the name of an /aliases property. The value of
>>> this alias is then used as the full node path to be found.
>>>
>>> Signed-off-by: David Daney<david.daney@cavium.com>
>>
>> But as the caller you sure as hell know whether you have a "/"
>> prefixed name or not.
>
> Yes, worst case we could just examine the first character of the string.
>
>>
>> Why complicate an incredibly well designed and simple function for
>> something you can create another interface for?
>>
>
> Because in this message:
>
> http://www.linux-mips.org/archives/linux-mips/2011-02/msg00147.html
>
> Grant explicitly asked me to do it this way when he said:
>
> of_find_node_by_path() needs to be fixed to also accept alias
> values so that a string that starts with a '/' is a full path, but
> no leading '/' means start with an alias. This code will lose a
> level of indentation if you can make that change to the common
> code.
>
> And then in follow ups to that conversation, we eventually came up
> with this patch.
>
> If you find it particularly objectionable, convince Grant to NACK the
> patch (but please keep me CCed on the conversation), and I will open
> code the equivalent in my drivers.
>
> Thanks,
> David Daney
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths.
  2012-02-29 19:21 ` [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths David Daney
  2012-02-29 20:36   ` David Miller
@ 2012-03-09  1:33   ` Grant Likely
  2012-03-09 17:59     ` David Daney
  1 sibling, 1 reply; 9+ messages in thread
From: Grant Likely @ 2012-03-09  1:33 UTC (permalink / raw)
  To: David Daney, linux-mips, ralf, devicetree-discuss, Rob Herring
  Cc: linux-kernel, David Daney

On Wed, 29 Feb 2012 11:21:04 -0800, David Daney <ddaney.cavm@gmail.com> wrote:
> From: David Daney <david.daney@cavium.com>
> 
> Currently all paths passed to of_find_node_by_path() must begin with a
> '/', indicating a full path to the desired node.
> 
> Augment the look-up code so that if a path does *not* begin with '/',
> the path is used as the name of an /aliases property.  The value of
> this alias is then used as the full node path to be found.
> 
> Signed-off-by: David Daney <david.daney@cavium.com>
> ---
>  drivers/of/base.c |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 files changed, 62 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index 5806449..0bbe47c 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -365,22 +365,81 @@ EXPORT_SYMBOL(of_get_next_child);
>  
>  /**
>   *	of_find_node_by_path - Find a node matching a full OF path
> - *	@path:	The full path to match
> + *	@path: Either the full path to match, or if the path does not
> + *	       start with '/', the name of a property of the /aliases
> + *	       node (an alias).  In the case of an alias, the node
> + *	       matching the alias' value will be returned.
>   *
>   *	Returns a node pointer with refcount incremented, use
>   *	of_node_put() on it when done.
>   */
>  struct device_node *of_find_node_by_path(const char *path)
>  {
> -	struct device_node *np = allnodes;
> +	struct device_node *np = NULL;
> +	struct device_node *aliases = NULL;
> +	char *alias = NULL;
> +	char *new_path = NULL;
> +	char *ps;
>  
>  	read_lock(&devtree_lock);
> -	for (; np; np = np->allnext) {
> +
> +	/*
> +	 * The following code has three possibilities:
> +	 * 1) '/' at start of string; path == ps; (based at root)
> +	 * 2) '/' at offset in string; path < ps; (relative to alias)
> +	 * 3) '/' not found; ps == NULL; (alias only)
> +	 *
> +	 * If ps != path, then it is either a pure alias (ps == NULL),
> +	 * or an alias with a relative path (path < ps).  Either way,
> +	 * look up the path pointed to by the alias.
> +	 */
> +	ps = strchr(path, '/');
> +	if (path != ps) {
> +		aliases = of_find_node_by_path("/aliases");
> +		if (!aliases)
> +			goto out;
> +
> +		/*
> +		 * Duplicate the alias part of the string so it can be
> +		 * NULL terminated.
> +		 */
> +		alias = kstrndup(path,
> +				 ps ? (ps - path) : strlen(path), GFP_KERNEL);
> +		if (!alias)
> +			goto out;
> +		path = of_get_property(aliases, alias, NULL);
> +		if (!path || path[0] != '/')
> +			goto out;

All the aliases are already decoded at boot time now.  See
of_alias_scan().  Instead of open-coding this, you can add an
of_alias_lookup() function something like this (untested):

const char *of_alias_lookup(const char *alias)
{
	struct alias_prop *app;
	list_for_each_entry(app, &aliases_lookup, link) {
		if (strcmp(app->alias, alias))
			return app->np->full_name;
	}
	return NULL;
}

Then most of the above code disappears.  It can instead look like:

	ps = strchr(path, '/');
	if (path != ps) {
		char alias[ps - path + 1];
		strncpy(alias, path, ps - path);
		alias[ps - path] = '\0';
		path = of_alias_lookup(alias);
		if (path && ps)
			/* Don't forget to free this */
			path = kasprintf(GFP_KERNEL, "%s%s", path, ps);
		if (!path)
			return NULL;
	}

g.

> +
> +		/* If ps is not NULL, then there is a relative path to append */
> +		if (ps) {
> +			new_path = kzalloc(strlen(path) + strlen(ps) + 1,
> +					   GFP_KERNEL);
> +			if (!new_path)
> +				goto out;
> +
> +			sprintf(new_path, "%s%s", path, ps);
> +			path = new_path;
> +		}
> +	}
> +
> +	/*
> +	 * At this point, path now points to the full unaliased path
> +	 * to a node, regardless of whether or not it started with an
> +	 * alias.
> +	 */
> +
> +	for (np = allnodes; np; np = np->allnext) {
>  		if (np->full_name && (of_node_cmp(np->full_name, path) == 0)
>  		    && of_node_get(np))
>  			break;
>  	}
> +out:
> +	if (aliases)
> +		of_node_put(aliases);
>  	read_unlock(&devtree_lock);
> +	kfree(alias);
> +	kfree(new_path);
>  	return np;
>  }
>  EXPORT_SYMBOL(of_find_node_by_path);
> -- 
> 1.7.2.3
> 

-- 
email sent from notmuch.vim plugin

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths.
  2012-03-09  1:33   ` Grant Likely
@ 2012-03-09 17:59     ` David Daney
  2012-03-09 18:00       ` Grant Likely
  0 siblings, 1 reply; 9+ messages in thread
From: David Daney @ 2012-03-09 17:59 UTC (permalink / raw)
  To: Grant Likely
  Cc: David Daney, linux-mips@linux-mips.org, ralf@linux-mips.org,
	devicetree-discuss@lists.ozlabs.org, Rob Herring,
	linux-kernel@vger.kernel.org

On 03/08/2012 05:33 PM, Grant Likely wrote:
> On Wed, 29 Feb 2012 11:21:04 -0800, David Daney<ddaney.cavm@gmail.com>  wrote:
>> From: David Daney<david.daney@cavium.com>
>>
>> Currently all paths passed to of_find_node_by_path() must begin with a
>> '/', indicating a full path to the desired node.
>>
>> Augment the look-up code so that if a path does *not* begin with '/',
>> the path is used as the name of an /aliases property.  The value of
>> this alias is then used as the full node path to be found.
>>
>> Signed-off-by: David Daney<david.daney@cavium.com>
[...]
>
> All the aliases are already decoded at boot time now.  See
> of_alias_scan().  Instead of open-coding this, you can add an
> of_alias_lookup() function something like this (untested):
>

After objections from davem, and a bit of thought, I already indicated 
on a different branch of this thread that we should drop this patch.

I have improved my code so that it is no longer needed.

Thanks,
David Daney

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths.
  2012-03-09 17:59     ` David Daney
@ 2012-03-09 18:00       ` Grant Likely
  0 siblings, 0 replies; 9+ messages in thread
From: Grant Likely @ 2012-03-09 18:00 UTC (permalink / raw)
  To: David Daney
  Cc: David Daney, linux-mips@linux-mips.org, ralf@linux-mips.org,
	devicetree-discuss@lists.ozlabs.org, Rob Herring,
	linux-kernel@vger.kernel.org

On Fri, Mar 9, 2012 at 10:59 AM, David Daney <david.daney@cavium.com> wrote:
> On 03/08/2012 05:33 PM, Grant Likely wrote:
>>
>> On Wed, 29 Feb 2012 11:21:04 -0800, David Daney<ddaney.cavm@gmail.com>
>>  wrote:
>>>
>>> From: David Daney<david.daney@cavium.com>
>>>
>>> Currently all paths passed to of_find_node_by_path() must begin with a
>>> '/', indicating a full path to the desired node.
>>>
>>> Augment the look-up code so that if a path does *not* begin with '/',
>>> the path is used as the name of an /aliases property.  The value of
>>> this alias is then used as the full node path to be found.
>>>
>>> Signed-off-by: David Daney<david.daney@cavium.com>
>
> [...]
>
>>
>> All the aliases are already decoded at boot time now.  See
>> of_alias_scan().  Instead of open-coding this, you can add an
>> of_alias_lookup() function something like this (untested):
>>
>
> After objections from davem, and a bit of thought, I already indicated on a
> different branch of this thread that we should drop this patch.
>
> I have improved my code so that it is no longer needed.

Okay.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-03-09 18:00 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-29 19:21 [PATCH v6 0/2] of: Device Tree enhancements needed by MIPS/OCTEON David Daney
2012-02-29 19:21 ` [PATCH v6 1/2] of/lib: Allow scripts/dtc/libfdt to be used from kernel code David Daney
2012-02-29 19:21 ` [PATCH v6 2/2] of: Make of_find_node_by_path() traverse /aliases for relative paths David Daney
2012-02-29 20:36   ` David Miller
2012-02-29 21:34     ` David Daney
2012-02-29 22:18       ` David Daney
2012-03-09  1:33   ` Grant Likely
2012-03-09 17:59     ` David Daney
2012-03-09 18:00       ` Grant Likely

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).