summaryrefslogtreecommitdiff
path: root/drivers/of
diff options
context:
space:
mode:
authorPhil Elwell <phil@raspberrypi.org>2018-06-14 15:07:26 +0100
committerpopcornmix <popcornmix@gmail.com>2019-05-14 00:08:02 +0100
commitd52d91b920d4b6ae17adc42375649f1ae190006b (patch)
treeba9e806fd5a4b996c03c35ea6ec363902112cc33 /drivers/of
parentd88d1b587aefbaee2415d5f8d25652a6c07e6a9d (diff)
downloadlinux-rpi3-d52d91b920d4b6ae17adc42375649f1ae190006b.tar.gz
linux-rpi3-d52d91b920d4b6ae17adc42375649f1ae190006b.tar.bz2
linux-rpi3-d52d91b920d4b6ae17adc42375649f1ae190006b.zip
of: configfs: Use of_overlay_fdt_apply API call
The published API to the dynamic overlay application mechanism now takes a Flattened Device Tree blob as input so that it can manage the lifetime of the unflattened tree. Conveniently, the new API call - of_overlay_fdt_apply - is virtually a drop-in replacement for create_overlay, which can now be deleted. Signed-off-by: Phil Elwell <phil@raspberrypi.org>
Diffstat (limited to 'drivers/of')
-rw-r--r--drivers/of/configfs.c47
1 files changed, 7 insertions, 40 deletions
diff --git a/drivers/of/configfs.c b/drivers/of/configfs.c
index 178f0629b0f0..ac04301dabe1 100644
--- a/drivers/of/configfs.c
+++ b/drivers/of/configfs.c
@@ -40,41 +40,6 @@ struct cfs_overlay_item {
int dtbo_size;
};
-static int create_overlay(struct cfs_overlay_item *overlay, void *blob)
-{
- int err;
-
- /* unflatten the tree */
- of_fdt_unflatten_tree(blob, NULL, &overlay->overlay);
- if (overlay->overlay == NULL) {
- pr_err("%s: failed to unflatten tree\n", __func__);
- err = -EINVAL;
- goto out_err;
- }
- pr_debug("%s: unflattened OK\n", __func__);
-
- /* mark it as detached */
- of_node_set_flag(overlay->overlay, OF_DETACHED);
-
- /* perform resolution */
- err = of_resolve_phandles(overlay->overlay);
- if (err != 0) {
- pr_err("%s: Failed to resolve tree\n", __func__);
- goto out_err;
- }
- pr_debug("%s: resolved OK\n", __func__);
-
- err = of_overlay_apply(overlay->overlay, &overlay->ov_id);
- if (err < 0) {
- pr_err("%s: Failed to create overlay (err=%d)\n",
- __func__, err);
- goto out_err;
- }
-
-out_err:
- return err;
-}
-
static inline struct cfs_overlay_item *to_cfs_overlay_item(
struct config_item *item)
{
@@ -115,7 +80,8 @@ static ssize_t cfs_overlay_item_path_store(struct config_item *item,
if (err != 0)
goto out_err;
- err = create_overlay(overlay, (void *)overlay->fw->data);
+ err = of_overlay_fdt_apply((void *)overlay->fw->data,
+ (u32)overlay->fw->size, &overlay->ov_id);
if (err != 0)
goto out_err;
@@ -136,7 +102,7 @@ static ssize_t cfs_overlay_item_status_show(struct config_item *item,
struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
return sprintf(page, "%s\n",
- overlay->ov_id >= 0 ? "applied" : "unapplied");
+ overlay->ov_id > 0 ? "applied" : "unapplied");
}
CONFIGFS_ATTR(cfs_overlay_item_, path);
@@ -188,7 +154,8 @@ ssize_t cfs_overlay_item_dtbo_write(struct config_item *item,
overlay->dtbo_size = count;
- err = create_overlay(overlay, overlay->dtbo);
+ err = of_overlay_fdt_apply(overlay->dtbo, overlay->dtbo_size,
+ &overlay->ov_id);
if (err != 0)
goto out_err;
@@ -198,6 +165,7 @@ out_err:
kfree(overlay->dtbo);
overlay->dtbo = NULL;
overlay->dtbo_size = 0;
+ overlay->ov_id = 0;
return err;
}
@@ -213,7 +181,7 @@ static void cfs_overlay_release(struct config_item *item)
{
struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
- if (overlay->ov_id >= 0)
+ if (overlay->ov_id > 0)
of_overlay_remove(&overlay->ov_id);
if (overlay->fw)
release_firmware(overlay->fw);
@@ -241,7 +209,6 @@ static struct config_item *cfs_overlay_group_make_item(
overlay = kzalloc(sizeof(*overlay), GFP_KERNEL);
if (!overlay)
return ERR_PTR(-ENOMEM);
- overlay->ov_id = -1;
config_item_init_type_name(&overlay->item, name, &cfs_overlay_type);
return &overlay->item;