Skip to content

Commit

Permalink
Merge branch 'for-next/state'
Browse files Browse the repository at this point in the history
  • Loading branch information
saschahauer committed May 5, 2017
2 parents 5485383 + 70ea799 commit 587afe8
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
8 changes: 7 additions & 1 deletion Documentation/devicetree/bindings/barebox/barebox,state.rst
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ Required properties:
* ``backend``: contains a phandle to the device/partition which holds the
actual state data.
* ``backend-type``: should be ``raw`` or ``dtb``.
* additionally a state node must have an alias in the /aliases/ node pointing
to it.

Optional properties:

Expand Down Expand Up @@ -74,7 +76,11 @@ Optional properties:

Example::

state: state@0 {
/aliases {
state = &state;
};

state: state {
magic = <0x27031977>;
compatible = "barebox,state";
backend-type = "raw";
Expand Down
28 changes: 25 additions & 3 deletions common/state/state.c
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ static int of_state_fixup(struct device_node *root, void *ctx)
{
struct state *state = ctx;
const char *compatible = "barebox,state";
struct device_node *new_node, *node, *parent, *backend_node;
struct device_node *new_node, *node, *parent, *backend_node, *aliases;
struct property *p;
int ret;
phandle phandle;
Expand All @@ -416,6 +416,15 @@ static int of_state_fixup(struct device_node *root, void *ctx)
if (node) {
/* replace existing node - it will be deleted later */
parent = node->parent;

/*
* barebox replaces the state node in the device tree it starts the
* kernel with, so a state node that already exists in the device tree
* will be overwritten. Warn about this so people do not wonder why
* changes in the kernels state node do not have any effect.
*/
if (root != of_get_root_node())
dev_warn(&state->dev, "Warning: Kernel devicetree contains state node, replacing it\n");
} else {
char *of_path, *c;

Expand Down Expand Up @@ -511,6 +520,17 @@ static int of_state_fixup(struct device_node *root, void *ctx)
if (ret)
goto out;

aliases = of_create_node(root, "/aliases");
if (!aliases) {
ret = -ENOMEM;
goto out;
}

ret = of_set_property(aliases, state->name, new_node->full_name,
strlen(new_node->full_name) + 1, 1);
if (ret)
goto out;

/* delete existing node */
if (node)
of_delete_node(node);
Expand Down Expand Up @@ -558,8 +578,10 @@ struct state *state_new_from_node(struct device_node *node, char *path,
uint32_t stridesize;

alias = of_alias_get(node);
if (!alias)
alias = node->name;
if (!alias) {
pr_err("State node %s does not have an alias in the /aliases/ node\n", node->full_name);
return ERR_PTR(-EINVAL);
}

state = state_new(alias);
if (IS_ERR(state))
Expand Down

0 comments on commit 587afe8

Please sign in to comment.