diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2018-04-30 11:32:04 +1000 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2018-04-30 11:32:04 +1000 |
commit | cfb948e2d5ffccf9d46326fffa557c84072142ed (patch) | |
tree | cf55ea685ef9e8de02f30f7cb6dea1ba734abe4c /drivers | |
parent | 99d7eb08c57b9754585c878e2de6eb861f052a10 (diff) | |
parent | 08c418a6ed82d0e28df28de23a6def55f0369c3a (diff) |
Merge remote-tracking branch 'devicetree/for-next'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/of/of_numa.c | 1 | ||||
-rw-r--r-- | drivers/of/overlay.c | 30 | ||||
-rw-r--r-- | drivers/of/platform.c | 11 |
3 files changed, 32 insertions, 10 deletions
diff --git a/drivers/of/of_numa.c b/drivers/of/of_numa.c index f9d5480a4ae5..27d9b4bba535 100644 --- a/drivers/of/of_numa.c +++ b/drivers/of/of_numa.c @@ -177,7 +177,6 @@ int of_node_to_nid(struct device_node *device) return NUMA_NO_NODE; } -EXPORT_SYMBOL(of_node_to_nid); int __init of_numa_init(void) { diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c index b35fe88f1851..7baa53e5b1d7 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c @@ -102,12 +102,28 @@ static DEFINE_IDR(ovcs_idr); static BLOCKING_NOTIFIER_HEAD(overlay_notify_chain); +/** + * of_overlay_notifier_register() - Register notifier for overlay operations + * @nb: Notifier block to register + * + * Register for notification on overlay operations on device tree nodes. The + * reported actions definied by @of_reconfig_change. The notifier callback + * furthermore receives a pointer to the affected device tree node. + * + * Note that a notifier callback is not supposed to store pointers to a device + * tree node or its content beyond @OF_OVERLAY_POST_REMOVE corresponding to the + * respective node it received. + */ int of_overlay_notifier_register(struct notifier_block *nb) { return blocking_notifier_chain_register(&overlay_notify_chain, nb); } EXPORT_SYMBOL_GPL(of_overlay_notifier_register); +/** + * of_overlay_notifier_register() - Unregister notifier for overlay operations + * @nb: Notifier block to unregister + */ int of_overlay_notifier_unregister(struct notifier_block *nb) { return blocking_notifier_chain_unregister(&overlay_notify_chain, nb); @@ -671,17 +687,13 @@ static void free_overlay_changeset(struct overlay_changeset *ovcs) of_node_put(ovcs->fragments[i].overlay); } kfree(ovcs->fragments); - /* - * TODO - * - * would like to: kfree(ovcs->overlay_tree); - * but can not since drivers may have pointers into this data - * - * would like to: kfree(ovcs->fdt); - * but can not since drivers may have pointers into this data + * There should be no live pointers into ovcs->overlay_tree and + * ovcs->fdt due to the policy that overlay notifiers are not allowed + * to retain pointers into the overlay devicetree. */ - + kfree(ovcs->overlay_tree); + kfree(ovcs->fdt); kfree(ovcs); } diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 26fb43847f4b..37108952ddd3 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -32,6 +32,11 @@ const struct of_device_id of_default_bus_match_table[] = { {} /* Empty terminated list */ }; +static const struct of_device_id of_skipped_node_table[] = { + { .compatible = "operating-points-v2", }, + {} /* Empty terminated list */ +}; + static int of_dev_node_match(struct device *dev, void *data) { return dev->of_node == data; @@ -356,6 +361,12 @@ static int of_platform_bus_create(struct device_node *bus, return 0; } + /* Skip nodes for which we don't want to create devices */ + if (unlikely(of_match_node(of_skipped_node_table, bus))) { + pr_debug("%s() - skipping %pOF node\n", __func__, bus); + return 0; + } + if (of_node_check_flag(bus, OF_POPULATED_BUS)) { pr_debug("%s() - skipping %pOF, already populated\n", __func__, bus); |