[PATCH v4 1/5] drivers/of: introduce of_fdt_device_is_available()
From: Reza Arbab <hidden>
Date: 2016-10-06 18:36:59
Also in:
linux-devicetree, linux-mm, lkml
Subsystem:
open firmware and flattened device tree, the rest · Maintainers:
Rob Herring, Saravana Kannan, Linus Torvalds
In __fdt_scan_reserved_mem(), the availability of a node is determined by testing its "status" property. Move this check into its own function, borrowing logic from the unflattened version, of_device_is_available(). Another caller will be added in a subsequent patch. Signed-off-by: Reza Arbab <redacted> Acked-by: Rob Herring <robh@kernel.org> --- drivers/of/fdt.c | 26 +++++++++++++++++++++++--- include/linux/of_fdt.h | 2 ++ 2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 085c638..b138efb 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c@@ -151,6 +151,23 @@ int of_fdt_match(const void *blob, unsigned long node, return score; } +bool of_fdt_device_is_available(const void *blob, unsigned long node) +{ + const char *status; + int statlen; + + status = fdt_getprop(blob, node, "status", &statlen); + if (!status) + return true; + + if (statlen) { + if (!strcmp(status, "okay") || !strcmp(status, "ok")) + return true; + } + + return false; +} + static void *unflatten_dt_alloc(void **mem, unsigned long size, unsigned long align) {
@@ -647,7 +664,6 @@ static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname, int depth, void *data) { static int found; - const char *status; int err; if (!found && depth == 1 && strcmp(uname, "reserved-memory") == 0) {
@@ -667,8 +683,7 @@ static int __init __fdt_scan_reserved_mem(unsigned long node, const char *uname, return 1; } - status = of_get_flat_dt_prop(node, "status", NULL); - if (status && strcmp(status, "okay") != 0 && strcmp(status, "ok") != 0) + if (!of_flat_dt_device_is_available(node)) return 0; err = __reserved_mem_reserve_reg(node, uname);
@@ -809,6 +824,11 @@ int __init of_flat_dt_match(unsigned long node, const char *const *compat) return of_fdt_match(initial_boot_params, node, compat); } +bool __init of_flat_dt_device_is_available(unsigned long node) +{ + return of_fdt_device_is_available(initial_boot_params, node); +} + struct fdt_scan_status { const char *name; int namelen;
diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h
index 26c3302..4ff8c8e 100644
--- a/include/linux/of_fdt.h
+++ b/include/linux/of_fdt.h@@ -37,6 +37,7 @@ extern bool of_fdt_is_big_endian(const void *blob, unsigned long node); extern int of_fdt_match(const void *blob, unsigned long node, const char *const *compat); +extern bool of_fdt_device_is_available(const void *blob, unsigned long node); extern void *of_fdt_unflatten_tree(const unsigned long *blob, struct device_node *dad, struct device_node **mynodes);
@@ -59,6 +60,7 @@ extern const void *of_get_flat_dt_prop(unsigned long node, const char *name, int *size); extern int of_flat_dt_is_compatible(unsigned long node, const char *name); extern int of_flat_dt_match(unsigned long node, const char *const *matches); +extern bool of_flat_dt_device_is_available(unsigned long node); extern unsigned long of_get_flat_dt_root(void); extern int of_get_flat_dt_size(void);
--
1.8.3.1