From e30ee4fa552e84be9d705c8d669971f65474af5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Sat, 16 May 2015 12:12:29 +0200 Subject: [PATCH] of: add a function to remove an of_fixup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This function is needed when a device that already registered a fixup in the probe routine fails later to probe completely. Without unregistering the fixup the function might later be called with invalid data. Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer --- common/oftree.c | 19 +++++++++++++++++++ include/of.h | 1 + 2 files changed, 20 insertions(+) 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 e73cd7a44..c02f5f49a 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,