mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-20 14:13:16 +00:00
a1383655cf
Tested on bcm2710 (Raspberry Pi 3B). Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
115 lines
3.3 KiB
Diff
115 lines
3.3 KiB
Diff
From acb49b81500dd9d65027587767db25ead0b457af Mon Sep 17 00:00:00 2001
|
|
From: Phil Elwell <phil@raspberrypi.org>
|
|
Date: Thu, 14 Jun 2018 15:07:26 +0100
|
|
Subject: [PATCH] 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>
|
|
---
|
|
drivers/of/configfs.c | 47 +++++++------------------------------------
|
|
1 file changed, 7 insertions(+), 40 deletions(-)
|
|
|
|
--- 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_sto
|
|
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_s
|
|
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(stru
|
|
|
|
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 c
|
|
{
|
|
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_g
|
|
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;
|