of: Transactional DT support.
Introducing DT transactional support. A DT transaction is a method which allows one to apply changes in the live tree, in such a way that either the full set of changes take effect, or the state of the tree can be rolled-back to the state it was before it was attempted. An applied transaction can be rolled-back at any time. Documentation is in Documentation/devicetree/changesets.txt Signed-off-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com> [glikely: Removed device notifiers and reworked to be more consistent] Signed-off-by: Grant Likely <grant.likely@linaro.org>
This commit is contained in:

committed by
Grant Likely

parent
259092a35c
commit
201c910bd6
@@ -786,4 +786,80 @@ typedef void (*of_init_fn_1)(struct device_node *);
|
||||
#define OF_DECLARE_2(table, name, compat, fn) \
|
||||
_OF_DECLARE(table, name, compat, fn, of_init_fn_2)
|
||||
|
||||
/**
|
||||
* struct of_changeset_entry - Holds a changeset entry
|
||||
*
|
||||
* @node: list_head for the log list
|
||||
* @action: notifier action
|
||||
* @np: pointer to the device node affected
|
||||
* @prop: pointer to the property affected
|
||||
* @old_prop: hold a pointer to the original property
|
||||
*
|
||||
* Every modification of the device tree during a changeset
|
||||
* is held in a list of of_changeset_entry structures.
|
||||
* That way we can recover from a partial application, or we can
|
||||
* revert the changeset
|
||||
*/
|
||||
struct of_changeset_entry {
|
||||
struct list_head node;
|
||||
unsigned long action;
|
||||
struct device_node *np;
|
||||
struct property *prop;
|
||||
struct property *old_prop;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct of_changeset - changeset tracker structure
|
||||
*
|
||||
* @entries: list_head for the changeset entries
|
||||
*
|
||||
* changesets are a convenient way to apply bulk changes to the
|
||||
* live tree. In case of an error, changes are rolled-back.
|
||||
* changesets live on after initial application, and if not
|
||||
* destroyed after use, they can be reverted in one single call.
|
||||
*/
|
||||
struct of_changeset {
|
||||
struct list_head entries;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_OF_DYNAMIC
|
||||
extern void of_changeset_init(struct of_changeset *ocs);
|
||||
extern void of_changeset_destroy(struct of_changeset *ocs);
|
||||
extern int of_changeset_apply(struct of_changeset *ocs);
|
||||
extern int of_changeset_revert(struct of_changeset *ocs);
|
||||
extern int of_changeset_action(struct of_changeset *ocs,
|
||||
unsigned long action, struct device_node *np,
|
||||
struct property *prop);
|
||||
|
||||
static inline int of_changeset_attach_node(struct of_changeset *ocs,
|
||||
struct device_node *np)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_ATTACH_NODE, np, NULL);
|
||||
}
|
||||
|
||||
static inline int of_changeset_detach_node(struct of_changeset *ocs,
|
||||
struct device_node *np)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_DETACH_NODE, np, NULL);
|
||||
}
|
||||
|
||||
static inline int of_changeset_add_property(struct of_changeset *ocs,
|
||||
struct device_node *np, struct property *prop)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_ADD_PROPERTY, np, prop);
|
||||
}
|
||||
|
||||
static inline int of_changeset_remove_property(struct of_changeset *ocs,
|
||||
struct device_node *np, struct property *prop)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_REMOVE_PROPERTY, np, prop);
|
||||
}
|
||||
|
||||
static inline int of_changeset_update_property(struct of_changeset *ocs,
|
||||
struct device_node *np, struct property *prop)
|
||||
{
|
||||
return of_changeset_action(ocs, OF_RECONFIG_UPDATE_PROPERTY, np, prop);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_OF_H */
|
||||
|
Reference in New Issue
Block a user