[PATCH v4 2/4] drivers: of: add function to scan fdt nodes given by path

Michal Nazarewicz mina86 at mina86.com
Mon Aug 5 10:30:56 EDT 2013


On Wed, Jul 31 2013, Marek Szyprowski wrote:
> Add a function to scan the flattened device-tree starting from the
> node given by the path. It is used to extract information (like reserved
> memory), which is required on ealy boot before we can unflatten the
                                ^^^^ early
> tree.
>
> Signed-off-by: Marek Szyprowski <m.szyprowski at samsung.com>
> Acked-by: Kyungmin Park <kyungmin.park at samsung.com>

Acked-by: Michal Nazarewicz <mina86 at mina86.com>

Some minor comments inline.

> +static int __init fdt_scan_node_by_path(unsigned long node, const char *uname,
> +					int depth, void *data)
> +{
> +	struct fdt_scan_status *st = data;
> +
> +	/*
> +	 * if scan at the requested fdt node has been completed,
> +	 * return -ENXIO to abort further scanning
> +	 */
> +	if (depth <= st->depth)
> +		return -ENXIO;
> +
> +	/* requested fdt node has been found, so call iterator function */
> +	if (st->found)
> +		return st->iterator(node, uname, depth, st->data);
> +
> +	/* check if scanning automata is entering next level of fdt nodes */
> +	if (depth == st->depth + 1 &&
> +	    strncmp(st->name, uname, st->namelen) == 0) {

+	    strncmp(st->name, uname, st->namelen) == 0 &&
+	    uname[st->namelen] == 0) {

> +		st->depth += 1;
> +		if (st->name[st->namelen] == 0) {
> +			st->found = 1;
> +		} else {
> +			const char *next = st->name + st->namelen + 1;
> +			const char *p = next;
> +			while (*p != '/' && *p != 0)
> +				p++;
> +			st->name = next;
> +			st->namelen = p - next;

+			st->namelen = strcspn(next, "/");

except this might be slightly slower since the second argument is looped
over, but something to consider I guess since it get rid of few of the
lines of code.

> +		}
> +		return 0;
> +	}
> +
> +	/* scan next fdt node */
> +	return 0;
> +}
> +
> +/**
> + * of_scan_flat_dt_by_path - scan flattened tree blob and call callback on each
> + *			     child of the given path.
> + * @path: path to start searching for children
> + * @it: callback function
> + * @data: context data pointer
> + *
> + * This function is used to scan the flattened device-tree starting from the
> + * node given by path. It is used to extract information (like reserved
> + * memory), which is required on ealy boot before we can unflatten the tree.
> + */
> +int __init of_scan_flat_dt_by_path(const char *path,
> +	int (*it)(unsigned long node, const char *name, int depth, void *data),
> +	void *data)
> +{
> +	struct fdt_scan_status st = {path, 0, -1, 0, it, data};
> +	int ret = 0;
> +
> +	if (initial_boot_params)
> +		ret = of_scan_flat_dt(fdt_scan_node_by_path, &st);
> +
> +	if (st.found && ret == -ENXIO)	/* scan has been completed */
> +		return 0;
> +	else
> +		return -ENOENT;

Perhaps propagate ret:

+	if (!st.found)
+		return -ENOENT;
+	else if (ret == -ENXIO)
+		return 0;
+	else
+		return ret;

> +}
> +
>  #ifdef CONFIG_BLK_DEV_INITRD
>  /**
>   * early_init_dt_check_for_initrd - Decode initrd location from flat tree

-- 
Best regards,                                         _     _
.o. | Liege of Serenely Enlightened Majesty of      o' \,=./ `o
..o | Computer Science,  Michał “mina86” Nazarewicz    (o o)
ooo +----<email/xmpp: mpn at google.com>--------------ooO--(_)--Ooo--
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 835 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130805/6cec4a65/attachment.sig>


More information about the linux-arm-kernel mailing list