of: add a function to remove an of_fixup
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 <u.kleine-koenig@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
827421e7d5
commit
e30ee4fa55
|
@ -159,6 +159,25 @@ int of_register_fixup(int (*fixup)(struct device_node *, void *), void *context)
|
||||||
return 0;
|
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
|
* Apply registered fixups for the given fdt. The fdt must have
|
||||||
* enough free space to apply the fixups.
|
* enough free space to apply the fixups.
|
||||||
|
|
|
@ -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 */
|
#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_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_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,
|
struct device_node *of_find_node_by_alias(struct device_node *root,
|
||||||
const char *alias);
|
const char *alias);
|
||||||
struct device_node *of_find_node_by_path_or_alias(struct device_node *root,
|
struct device_node *of_find_node_by_path_or_alias(struct device_node *root,
|
||||||
|
|
Loading…
Reference in New Issue