of: configfs: Use of_overlay_fdt_apply API call
authorPhil Elwell <phil@raspberrypi.org>
Thu, 14 Jun 2018 14:07:26 +0000 (15:07 +0100)
committerpopcornmix <popcornmix@gmail.com>
Mon, 13 May 2019 23:08:02 +0000 (00:08 +0100)
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>
drivers/of/configfs.c

index 178f062..ac04301 100644 (file)
@@ -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;