summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Burton <paul.burton@imgtec.com>2017-06-02 15:29:54 -0400
committerRalf Baechle <ralf@linux-mips.org>2017-06-28 06:22:41 -0400
commite889dfca12ce95cdeaa50f66d1f33ad8fed4ca58 (patch)
tree6ec1327b675ad657ca051cd327e0be4a30bff5f7
parentc3d62fc6a058d1024f3ad0525a251e9d6c5203ed (diff)
MIPS: generic: Abstract FDT fixup application
Introduce an apply_mips_fdt_fixups() function which can apply fixups to an FDT based upon an array of fixup descriptions. This abstracts that functionality such that legacy board code can apply FDT fixups without requiring lots of duplication. Signed-off-by: Paul Burton <paul.burton@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/16184/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r--arch/mips/generic/board-sead3.c33
-rw-r--r--arch/mips/generic/init.c27
-rw-r--r--arch/mips/include/asm/machine.h31
3 files changed, 69 insertions, 22 deletions
diff --git a/arch/mips/generic/board-sead3.c b/arch/mips/generic/board-sead3.c
index 97186a3a5d21..39e11bd249cf 100644
--- a/arch/mips/generic/board-sead3.c
+++ b/arch/mips/generic/board-sead3.c
@@ -138,6 +138,14 @@ static __init int remove_gic(void *fdt)
138 return 0; 138 return 0;
139} 139}
140 140
141static const struct mips_fdt_fixup sead3_fdt_fixups[] __initconst = {
142 { yamon_dt_append_cmdline, "append command line" },
143 { append_memory, "append memory" },
144 { remove_gic, "remove GIC when not present" },
145 { yamon_dt_serial_config, "append serial configuration" },
146 { },
147};
148
141static __init const void *sead3_fixup_fdt(const void *fdt, 149static __init const void *sead3_fixup_fdt(const void *fdt,
142 const void *match_data) 150 const void *match_data)
143{ 151{
@@ -152,29 +160,10 @@ static __init const void *sead3_fixup_fdt(const void *fdt,
152 160
153 fw_init_cmdline(); 161 fw_init_cmdline();
154 162
155 err = fdt_open_into(fdt, fdt_buf, sizeof(fdt_buf)); 163 err = apply_mips_fdt_fixups(fdt_buf, sizeof(fdt_buf),
156 if (err) 164 fdt, sead3_fdt_fixups);
157 panic("Unable to open FDT: %d", err);
158
159 err = yamon_dt_append_cmdline(fdt_buf);
160 if (err)
161 panic("Unable to patch FDT: %d", err);
162
163 err = append_memory(fdt_buf);
164 if (err)
165 panic("Unable to patch FDT: %d", err);
166
167 err = remove_gic(fdt_buf);
168 if (err)
169 panic("Unable to patch FDT: %d", err);
170
171 err = yamon_dt_serial_config(fdt_buf);
172 if (err)
173 panic("Unable to patch FDT: %d", err);
174
175 err = fdt_pack(fdt_buf);
176 if (err) 165 if (err)
177 panic("Unable to pack FDT: %d\n", err); 166 panic("Unable to fixup FDT: %d", err);
178 167
179 return fdt_buf; 168 return fdt_buf;
180} 169}
diff --git a/arch/mips/generic/init.c b/arch/mips/generic/init.c
index 4af619215410..4a9a1edbfb29 100644
--- a/arch/mips/generic/init.c
+++ b/arch/mips/generic/init.c
@@ -122,6 +122,33 @@ void __init device_tree_init(void)
122 err = register_up_smp_ops(); 122 err = register_up_smp_ops();
123} 123}
124 124
125int __init apply_mips_fdt_fixups(void *fdt_out, size_t fdt_out_size,
126 const void *fdt_in,
127 const struct mips_fdt_fixup *fixups)
128{
129 int err;
130
131 err = fdt_open_into(fdt_in, fdt_out, fdt_out_size);
132 if (err) {
133 pr_err("Failed to open FDT\n");
134 return err;
135 }
136
137 for (; fixups->apply; fixups++) {
138 err = fixups->apply(fdt_out);
139 if (err) {
140 pr_err("Failed to apply FDT fixup \"%s\"\n",
141 fixups->description);
142 return err;
143 }
144 }
145
146 err = fdt_pack(fdt_out);
147 if (err)
148 pr_err("Failed to pack FDT\n");
149 return err;
150}
151
125void __init plat_time_init(void) 152void __init plat_time_init(void)
126{ 153{
127 struct device_node *np; 154 struct device_node *np;
diff --git a/arch/mips/include/asm/machine.h b/arch/mips/include/asm/machine.h
index 6b444cd9526f..ecb6c7335484 100644
--- a/arch/mips/include/asm/machine.h
+++ b/arch/mips/include/asm/machine.h
@@ -60,4 +60,35 @@ mips_machine_is_compatible(const struct mips_machine *mach, const void *fdt)
60 return NULL; 60 return NULL;
61} 61}
62 62
63/**
64 * struct mips_fdt_fixup - Describe a fixup to apply to an FDT
65 * @apply: applies the fixup to @fdt, returns zero on success else -errno
66 * @description: a short description of the fixup
67 *
68 * Describes a fixup applied to an FDT blob by the @apply function. The
69 * @description field provides a short description of the fixup intended for
70 * use in error messages if the @apply function returns non-zero.
71 */
72struct mips_fdt_fixup {
73 int (*apply)(void *fdt);
74 const char *description;
75};
76
77/**
78 * apply_mips_fdt_fixups() - apply fixups to an FDT blob
79 * @fdt_out: buffer in which to place the fixed-up FDT
80 * @fdt_out_size: the size of the @fdt_out buffer
81 * @fdt_in: the FDT blob
82 * @fixups: pointer to an array of fixups to be applied
83 *
84 * Loop through the array of fixups pointed to by @fixups, calling the apply
85 * function on each until either one returns an error or we reach the end of
86 * the list as indicated by an entry with a NULL apply field.
87 *
88 * Return: zero on success, else -errno
89 */
90extern int __init apply_mips_fdt_fixups(void *fdt_out, size_t fdt_out_size,
91 const void *fdt_in,
92 const struct mips_fdt_fixup *fixups);
93
63#endif /* __MIPS_ASM_MACHINE_H__ */ 94#endif /* __MIPS_ASM_MACHINE_H__ */