Skip to content

Commit

Permalink
drivers/of: Export OF changeset functions
Browse files Browse the repository at this point in the history
The PowerNV PCI hotplug driver is going to use the OF changeset
to manage the changed device sub-tree. This exports those OF
changeset functions for that.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Acked-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Rob Herring <robh@kernel.org>
  • Loading branch information
Gavin Shan authored and Rob Herring committed Jan 13, 2016
1 parent dc17340 commit 1832237
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 27 deletions.
65 changes: 46 additions & 19 deletions drivers/of/dynamic.c
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,7 @@ void of_changeset_init(struct of_changeset *ocs)
memset(ocs, 0, sizeof(*ocs));
INIT_LIST_HEAD(&ocs->entries);
}
EXPORT_SYMBOL_GPL(of_changeset_init);

/**
* of_changeset_destroy - Destroy a changeset
Expand All @@ -662,20 +663,9 @@ void of_changeset_destroy(struct of_changeset *ocs)
list_for_each_entry_safe_reverse(ce, cen, &ocs->entries, node)
__of_changeset_entry_destroy(ce);
}
EXPORT_SYMBOL_GPL(of_changeset_destroy);

/**
* of_changeset_apply - Applies a changeset
*
* @ocs: changeset pointer
*
* Applies a changeset to the live tree.
* Any side-effects of live tree state changes are applied here on
* sucess, like creation/destruction of devices and side-effects
* like creation of sysfs properties and directories.
* Returns 0 on success, a negative error value in case of an error.
* On error the partially applied effects are reverted.
*/
int of_changeset_apply(struct of_changeset *ocs)
int __of_changeset_apply(struct of_changeset *ocs)
{
struct of_changeset_entry *ce;
int ret;
Expand Down Expand Up @@ -704,17 +694,30 @@ int of_changeset_apply(struct of_changeset *ocs)
}

/**
* of_changeset_revert - Reverts an applied changeset
* of_changeset_apply - Applies a changeset
*
* @ocs: changeset pointer
*
* Reverts a changeset returning the state of the tree to what it
* was before the application.
* Any side-effects like creation/destruction of devices and
* removal of sysfs properties and directories are applied.
* Applies a changeset to the live tree.
* Any side-effects of live tree state changes are applied here on
* success, like creation/destruction of devices and side-effects
* like creation of sysfs properties and directories.
* Returns 0 on success, a negative error value in case of an error.
* On error the partially applied effects are reverted.
*/
int of_changeset_revert(struct of_changeset *ocs)
int of_changeset_apply(struct of_changeset *ocs)
{
int ret;

mutex_lock(&of_mutex);
ret = __of_changeset_apply(ocs);
mutex_unlock(&of_mutex);

return ret;
}
EXPORT_SYMBOL_GPL(of_changeset_apply);

int __of_changeset_revert(struct of_changeset *ocs)
{
struct of_changeset_entry *ce;
int ret;
Expand All @@ -741,6 +744,29 @@ int of_changeset_revert(struct of_changeset *ocs)
return 0;
}

/**
* of_changeset_revert - Reverts an applied changeset
*
* @ocs: changeset pointer
*
* Reverts a changeset returning the state of the tree to what it
* was before the application.
* Any side-effects like creation/destruction of devices and
* removal of sysfs properties and directories are applied.
* Returns 0 on success, a negative error value in case of an error.
*/
int of_changeset_revert(struct of_changeset *ocs)
{
int ret;

mutex_lock(&of_mutex);
ret = __of_changeset_revert(ocs);
mutex_unlock(&of_mutex);

return ret;
}
EXPORT_SYMBOL_GPL(of_changeset_revert);

/**
* of_changeset_action - Perform a changeset action
*
Expand Down Expand Up @@ -779,3 +805,4 @@ int of_changeset_action(struct of_changeset *ocs, unsigned long action,
list_add_tail(&ce->node, &ocs->entries);
return 0;
}
EXPORT_SYMBOL_GPL(of_changeset_action);
2 changes: 2 additions & 0 deletions drivers/of/of_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ static inline struct device_node *kobj_to_device_node(struct kobject *kobj)
extern int of_property_notify(int action, struct device_node *np,
struct property *prop, struct property *old_prop);
extern void of_node_release(struct kobject *kobj);
extern int __of_changeset_apply(struct of_changeset *ocs);
extern int __of_changeset_revert(struct of_changeset *ocs);
#else /* CONFIG_OF_DYNAMIC */
static inline int of_property_notify(int action, struct device_node *np,
struct property *prop, struct property *old_prop)
Expand Down
8 changes: 4 additions & 4 deletions drivers/of/overlay.c
Original file line number Diff line number Diff line change
Expand Up @@ -379,9 +379,9 @@ int of_overlay_create(struct device_node *tree)
}

/* apply the changeset */
err = of_changeset_apply(&ov->cset);
err = __of_changeset_apply(&ov->cset);
if (err) {
pr_err("%s: of_changeset_apply() failed for tree@%s\n",
pr_err("%s: __of_changeset_apply() failed for tree@%s\n",
__func__, tree->full_name);
goto err_revert_overlay;
}
Expand Down Expand Up @@ -511,7 +511,7 @@ int of_overlay_destroy(int id)


list_del(&ov->node);
of_changeset_revert(&ov->cset);
__of_changeset_revert(&ov->cset);
of_free_overlay_info(ov);
idr_remove(&ov_idr, id);
of_changeset_destroy(&ov->cset);
Expand Down Expand Up @@ -542,7 +542,7 @@ int of_overlay_destroy_all(void)
/* the tail of list is guaranteed to be safe to remove */
list_for_each_entry_safe_reverse(ov, ovn, &ov_list, node) {
list_del(&ov->node);
of_changeset_revert(&ov->cset);
__of_changeset_revert(&ov->cset);
of_free_overlay_info(ov);
idr_remove(&ov_idr, ov->id);
kfree(ov);
Expand Down
4 changes: 0 additions & 4 deletions drivers/of/unittest.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,18 +530,14 @@ static void __init of_unittest_changeset(void)
unittest(!of_changeset_add_property(&chgset, parent, ppadd), "fail add prop\n");
unittest(!of_changeset_update_property(&chgset, parent, ppupdate), "fail update prop\n");
unittest(!of_changeset_remove_property(&chgset, parent, ppremove), "fail remove prop\n");
mutex_lock(&of_mutex);
unittest(!of_changeset_apply(&chgset), "apply failed\n");
mutex_unlock(&of_mutex);

/* Make sure node names are constructed correctly */
unittest((np = of_find_node_by_path("/testcase-data/changeset/n2/n21")),
"'%s' not added\n", n21->full_name);
of_node_put(np);

mutex_lock(&of_mutex);
unittest(!of_changeset_revert(&chgset), "revert failed\n");
mutex_unlock(&of_mutex);

of_changeset_destroy(&chgset);
#endif
Expand Down

0 comments on commit 1832237

Please sign in to comment.