diff --git a/common/oftree.c b/common/oftree.c index 50fc95b58..f75d7b4bf 100644 --- a/common/oftree.c +++ b/common/oftree.c @@ -159,6 +159,25 @@ int of_register_fixup(int (*fixup)(struct device_node *, void *), void *context) return 0; } +/* + * 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 7235138f3..13770996e 100644 --- a/include/of.h +++ b/include/of.h @@ -242,6 +242,7 @@ void of_add_memory_bank(struct device_node *node, bool dump, int r, struct device_d *of_find_device_by_node_path(const char *path); int of_find_path(struct device_node *node, const char *propname, char **outpath); 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,