diff --git a/Documentation/devicetree/bindings/barebox/barebox,state.rst b/Documentation/devicetree/bindings/barebox/barebox,state.rst index e39245f..438cc43 100644 --- a/Documentation/devicetree/bindings/barebox/barebox,state.rst +++ b/Documentation/devicetree/bindings/barebox/barebox,state.rst @@ -51,8 +51,8 @@ stripped from the variable name. State variables have a type. Currenty supported types are: ``uint8``, -``uint32``, ``enum32``, ``mac`` address or ``string``. Variable length -strings are not planned. +``uint32``, ``enum32``, ``mac`` address or ``string`` (fixed length string). +Variable length strings are not planned. Required properties: diff --git a/common/state/backend_bucket_circular.c b/common/state/backend_bucket_circular.c index 72e165e..d8504e0 100644 --- a/common/state/backend_bucket_circular.c +++ b/common/state/backend_bucket_circular.c @@ -47,7 +47,7 @@ struct device_d *dev; }; -struct state_backend_storage_bucket_circular_meta { +struct __attribute__((__packed__)) state_backend_storage_bucket_circular_meta { uint32_t magic; uint32_t written_length; }; diff --git a/common/state/backend_bucket_direct.c b/common/state/backend_bucket_direct.c index 08892f0..5225433 100644 --- a/common/state/backend_bucket_direct.c +++ b/common/state/backend_bucket_direct.c @@ -32,7 +32,7 @@ struct device_d *dev; }; -struct state_backend_storage_bucket_direct_meta { +struct __attribute__((__packed__)) state_backend_storage_bucket_direct_meta { uint32_t magic; uint32_t written_length; }; diff --git a/common/state/backend_format_raw.c b/common/state/backend_format_raw.c index 4209424..e028ea6 100644 --- a/common/state/backend_format_raw.c +++ b/common/state/backend_format_raw.c @@ -37,7 +37,7 @@ struct device_d *dev; }; -struct backend_raw_header { +struct __attribute__((__packed__)) backend_raw_header { uint32_t magic; uint16_t reserved; uint16_t data_len; diff --git a/common/state/state.c b/common/state/state.c index 075618e..4020d5e 100644 --- a/common/state/state.c +++ b/common/state/state.c @@ -466,9 +466,10 @@ of_path = partition_node->full_name; ret = of_find_path_by_node(partition_node, &path, 0); } - if (!path) { - pr_err("state failed to parse path to backend\n"); - ret = -EINVAL; + if (ret) { + if (ret != -EPROBE_DEFER) + dev_err(&state->dev, "state failed to parse path to backend: %s\n", + strerror(-ret)); goto out_release_state; } } @@ -487,7 +488,7 @@ &storage_type); if (ret) { storage_type = NULL; - pr_info("No backend-storage-type found, using default.\n"); + dev_info(&state->dev, "No backend-storage-type found, using default.\n"); } ret = state_backend_init(&state->backend, &state->dev, node, @@ -511,10 +512,10 @@ ret = state_load(state); if (ret) { - pr_warn("Failed to load persistent state, continuing with defaults, %d\n", ret); + dev_warn(&state->dev, "Failed to load persistent state, continuing with defaults, %d\n", ret); } - pr_info("New state registered '%s'\n", alias); + dev_info(&state->dev, "New state registered '%s'\n", alias); return state; diff --git a/common/state/state_variables.c b/common/state/state_variables.c index 45ec962..fd072a0 100644 --- a/common/state/state_variables.c +++ b/common/state/state_variables.c @@ -441,9 +441,9 @@ { .type = STATE_TYPE_U8, .type_name = "uint8", - .export = state_uint32_export, - .import = state_uint32_import, - .create = state_uint8_create, + .export = state_uint32_export, + .import = state_uint32_import, + .create = state_uint8_create, }, { .type = STATE_TYPE_U32, .type_name = "uint32", diff --git a/drivers/misc/state.c b/drivers/misc/state.c index b9eb1b7..b43aee6 100644 --- a/drivers/misc/state.c +++ b/drivers/misc/state.c @@ -28,8 +28,12 @@ bool readonly = false; state = state_new_from_node(np, NULL, 0, 0, readonly); - if (IS_ERR(state)) - return PTR_ERR(state); + if (IS_ERR(state)) { + int ret = PTR_ERR(state); + if (ret == -ENODEV) + ret = -EPROBE_DEFER; + return ret; + } return 0; } diff --git a/drivers/of/of_path.c b/drivers/of/of_path.c index 1f5106d..946b9c7 100644 --- a/drivers/of/of_path.c +++ b/drivers/of/of_path.c @@ -66,6 +66,9 @@ return -ENODEV; } + if (!dev->driver) + return -ENODEV; + device_detect(dev); if (part)