summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/oftree.c19
-rw-r--r--include/of.h1
2 files changed, 20 insertions, 0 deletions
diff --git a/common/oftree.c b/common/oftree.c
index 50fc95b588..f75d7b4bfe 100644
--- a/common/oftree.c
+++ b/common/oftree.c
@@ -160,6 +160,25 @@ int of_register_fixup(int (*fixup)(struct device_node *, void *), void *context)
}
/*
+ * Remove a previously registered fixup. Only the first (if any) is removed.
+ * Returns 0 if a match was found (and removed), -ENOENT otherwise.
+ */
+int of_unregister_fixup(int (*fixup)(struct device_node *, void *),
+ void *context)
+{
+ struct of_fixup *of_fixup;
+
+ list_for_each_entry(of_fixup, &of_fixup_list, list) {
+ if (of_fixup->fixup == fixup && of_fixup->context == context) {
+ list_del(&of_fixup->list);
+ return 0;
+ }
+ }
+
+ return -ENOENT;
+}
+
+/*
* Apply registered fixups for the given fdt. The fdt must have
* enough free space to apply the fixups.
*/
diff --git a/include/of.h b/include/of.h
index e73cd7a446..c02f5f49ab 100644
--- a/include/of.h
+++ b/include/of.h
@@ -243,6 +243,7 @@ struct device_d *of_find_device_by_node_path(const char *path);
#define OF_FIND_PATH_FLAGS_BB 1 /* return .bb device if available */
int of_find_path(struct device_node *node, const char *propname, char **outpath, unsigned flags);
int of_register_fixup(int (*fixup)(struct device_node *, void *), void *context);
+int of_unregister_fixup(int (*fixup)(struct device_node *, void *), void *context);
struct device_node *of_find_node_by_alias(struct device_node *root,
const char *alias);
struct device_node *of_find_node_by_path_or_alias(struct device_node *root,