brcm2708: add linux 4.19 support
[oweals/openwrt.git] / target / linux / brcm2708 / patches-4.19 / 950-0133-of-configfs-Use-of_overlay_fdt_apply-API-call.patch
1 From 8d90ea3c51ab934802afe45eba16800f6c620cee Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Thu, 14 Jun 2018 15:07:26 +0100
4 Subject: [PATCH 133/703] of: configfs: Use of_overlay_fdt_apply API call
5
6 The published API to the dynamic overlay application mechanism now
7 takes a Flattened Device Tree blob as input so that it can manage the
8 lifetime of the unflattened tree. Conveniently, the new API call -
9 of_overlay_fdt_apply - is virtually a drop-in replacement for
10 create_overlay, which can now be deleted.
11
12 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
13 ---
14  drivers/of/configfs.c | 47 +++++++------------------------------------
15  1 file changed, 7 insertions(+), 40 deletions(-)
16
17 --- a/drivers/of/configfs.c
18 +++ b/drivers/of/configfs.c
19 @@ -40,41 +40,6 @@ struct cfs_overlay_item {
20         int                     dtbo_size;
21  };
22  
23 -static int create_overlay(struct cfs_overlay_item *overlay, void *blob)
24 -{
25 -       int err;
26 -
27 -       /* unflatten the tree */
28 -       of_fdt_unflatten_tree(blob, NULL, &overlay->overlay);
29 -       if (overlay->overlay == NULL) {
30 -               pr_err("%s: failed to unflatten tree\n", __func__);
31 -               err = -EINVAL;
32 -               goto out_err;
33 -       }
34 -       pr_debug("%s: unflattened OK\n", __func__);
35 -
36 -       /* mark it as detached */
37 -       of_node_set_flag(overlay->overlay, OF_DETACHED);
38 -
39 -       /* perform resolution */
40 -       err = of_resolve_phandles(overlay->overlay);
41 -       if (err != 0) {
42 -               pr_err("%s: Failed to resolve tree\n", __func__);
43 -               goto out_err;
44 -       }
45 -       pr_debug("%s: resolved OK\n", __func__);
46 -
47 -       err = of_overlay_apply(overlay->overlay, &overlay->ov_id);
48 -       if (err < 0) {
49 -               pr_err("%s: Failed to create overlay (err=%d)\n",
50 -                               __func__, err);
51 -               goto out_err;
52 -       }
53 -
54 -out_err:
55 -       return err;
56 -}
57 -
58  static inline struct cfs_overlay_item *to_cfs_overlay_item(
59                 struct config_item *item)
60  {
61 @@ -115,7 +80,8 @@ static ssize_t cfs_overlay_item_path_sto
62         if (err != 0)
63                 goto out_err;
64  
65 -       err = create_overlay(overlay, (void *)overlay->fw->data);
66 +       err = of_overlay_fdt_apply((void *)overlay->fw->data,
67 +                                  (u32)overlay->fw->size, &overlay->ov_id);
68         if (err != 0)
69                 goto out_err;
70  
71 @@ -136,7 +102,7 @@ static ssize_t cfs_overlay_item_status_s
72         struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
73  
74         return sprintf(page, "%s\n",
75 -                       overlay->ov_id >= 0 ? "applied" : "unapplied");
76 +                       overlay->ov_id > 0 ? "applied" : "unapplied");
77  }
78  
79  CONFIGFS_ATTR(cfs_overlay_item_, path);
80 @@ -188,7 +154,8 @@ ssize_t cfs_overlay_item_dtbo_write(stru
81  
82         overlay->dtbo_size = count;
83  
84 -       err = create_overlay(overlay, overlay->dtbo);
85 +       err = of_overlay_fdt_apply(overlay->dtbo, overlay->dtbo_size,
86 +                                  &overlay->ov_id);
87         if (err != 0)
88                 goto out_err;
89  
90 @@ -198,6 +165,7 @@ out_err:
91         kfree(overlay->dtbo);
92         overlay->dtbo = NULL;
93         overlay->dtbo_size = 0;
94 +       overlay->ov_id = 0;
95  
96         return err;
97  }
98 @@ -213,7 +181,7 @@ static void cfs_overlay_release(struct c
99  {
100         struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
101  
102 -       if (overlay->ov_id >= 0)
103 +       if (overlay->ov_id > 0)
104                 of_overlay_remove(&overlay->ov_id);
105         if (overlay->fw)
106                 release_firmware(overlay->fw);
107 @@ -241,7 +209,6 @@ static struct config_item *cfs_overlay_g
108         overlay = kzalloc(sizeof(*overlay), GFP_KERNEL);
109         if (!overlay)
110                 return ERR_PTR(-ENOMEM);
111 -       overlay->ov_id = -1;
112  
113         config_item_init_type_name(&overlay->item, name, &cfs_overlay_type);
114         return &overlay->item;