diff options
author | Phil Elwell <phil@raspberrypi.org> | 2018-06-14 15:07:26 +0100 |
---|---|---|
committer | popcornmix <popcornmix@gmail.com> | 2019-05-14 00:08:02 +0100 |
commit | d52d91b920d4b6ae17adc42375649f1ae190006b (patch) | |
tree | ba9e806fd5a4b996c03c35ea6ec363902112cc33 /drivers/of | |
parent | d88d1b587aefbaee2415d5f8d25652a6c07e6a9d (diff) | |
download | linux-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.c | 47 |
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; |