Skip to content

Commit a134bb5

Browse files
committed
ODROID-COMMON: board: apply device tree overlay files in U-Boot
Signed-off-by: Dongjin Kim <[email protected]> Change-Id: I16661bdcdf13a0d05d1359d30e7e6084a753b94e
1 parent 78680ab commit a134bb5

File tree

1 file changed

+64
-35
lines changed
  • board/hardkernel/odroid-common

1 file changed

+64
-35
lines changed

board/hardkernel/odroid-common/board.c

Lines changed: 64 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -220,12 +220,29 @@ int rk_board_late_init(void)
220220
return 0;
221221
}
222222

223+
static int __dtoverlay_apply(void *fdt, ulong dtbo, struct blk_desc *dev_desc, char *buf)
224+
{
225+
int ret;
226+
227+
if (dev_desc)
228+
ret = load_from_mmc(dtbo, dev_desc->devnum, 1, buf);
229+
else
230+
ret = load_from_cramfs(dtbo, buf);
231+
232+
if (!ret) {
233+
fdt_increase_size(fdt, fdt_totalsize(dtbo));
234+
fdt_overlay_apply_verbose(fdt, (void *)dtbo);
235+
}
236+
237+
return ret;
238+
}
239+
223240
int dtoverlay_apply(void *fdt, const char *dtoverlay, struct blk_desc *dev_desc,
224-
const char *root)
241+
const char *root, char **path)
225242
{
226243
char *paths[] = {
227244
"overlays/"CONFIG_BOARDNAME"/",
228-
"rockchip/overlays/"CONFIG_BOARDNAME"/",
245+
""CONFIG_BOARDNAME"/",
229246
};
230247
char buf[1024];
231248
int ret;
@@ -236,17 +253,19 @@ int dtoverlay_apply(void *fdt, const char *dtoverlay, struct blk_desc *dev_desc,
236253

237254
ulong fdt_dtbo = env_get_ulong("loadaddr", 16, 0);
238255

256+
if (*path) {
257+
snprintf(buf, sizeof(buf), "%s%s%s.dtbo", root ? root : "", *path, dtoverlay);
258+
259+
return __dtoverlay_apply(fdt, fdt_dtbo, dev_desc, buf);
260+
}
261+
239262
for (i = 0; i < ARRAY_SIZE(paths); i++) {
240263
snprintf(buf, sizeof(buf), "%s%s%s.dtbo", root ? root : "", paths[i], dtoverlay);
241264

242-
if (dev_desc)
243-
ret = load_from_mmc(fdt_dtbo, dev_desc->devnum, 1, buf);
244-
else
245-
ret = load_from_cramfs(fdt_dtbo, buf);
246-
265+
ret = __dtoverlay_apply(fdt, fdt_dtbo, dev_desc, buf);
247266
if (!ret) {
248-
fdt_increase_size(fdt, fdt_totalsize(fdt_dtbo));
249-
fdt_overlay_apply_verbose(fdt, (void *)fdt_dtbo);
267+
if (path)
268+
*path = strdup(paths[i]);
250269

251270
return 0;
252271
}
@@ -274,34 +293,23 @@ static int load_boot_config(struct blk_desc *dev_desc, char *config)
274293
run_command(buf, 0);
275294
}
276295

277-
char *overlays = env_get("overlays");
278-
const char *token = strtok(overlays, " ");
279-
while (token != NULL) {
280-
if (!strncmp(token, "display_", 8)) {
281-
ret = set_panel_name(token);
282-
break;
283-
}
284-
token = strtok(NULL, " ");
285-
}
286-
287296
return ret;
288297
}
289298

290299
int board_read_dtb_file(void *fdt_addr)
291300
{
292-
char *paths[] = {
293-
"dtb",
294-
"rockchip/"CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH,
295-
};
301+
struct blk_desc *dev_desc = rockchip_get_bootdev();
302+
char root[1024];
303+
char *rootptr = NULL;
304+
char *dir = NULL;
296305
int ret;
297306

298307
ret = load_from_cramfs((unsigned long)fdt_addr, CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH);
299-
if (!ret) {
300-
if (panel)
301-
dtoverlay_apply(fdt_addr, panel, NULL, NULL);
302-
} else {
303-
struct blk_desc *dev_desc = rockchip_get_bootdev();
304-
char root[1024];
308+
if (ret) {
309+
char *paths[] = {
310+
"dtb",
311+
"rockchip/"CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH,
312+
};
305313
char buf[1024];
306314
int i;
307315

@@ -320,16 +328,37 @@ int board_read_dtb_file(void *fdt_addr)
320328
for (i = 0; i < ARRAY_SIZE(paths); i++) {
321329
ret = load_from_mmc((unsigned long)fdt_addr,
322330
dev_desc->devnum, 1, paths[i]);
323-
if (!ret) {
324-
if (panel) {
325-
dtoverlay_apply(fdt_addr,
326-
panel, dev_desc, root);
327-
}
331+
if (!ret)
328332
break;
329-
}
330333
}
334+
335+
if (ret)
336+
return -ENOENT;
337+
338+
rootptr = kvers ? root : NULL;
331339
}
332340

341+
char *overlays = env_get("overlays");
342+
if (overlays) {
343+
char *token = strtok(overlays, " ");
344+
int offset = 0;
345+
346+
while (token != NULL) {
347+
dtoverlay_apply(fdt_addr, token, dev_desc, rootptr, &dir);
348+
offset += strlen(token) + 1;
349+
token = strtok(overlays + offset, " ");
350+
351+
if (panel && !strcmp(token, panel))
352+
panel = NULL;
353+
}
354+
}
355+
356+
if (panel)
357+
dtoverlay_apply(fdt_addr, panel, dev_desc, rootptr, &dir);
358+
359+
if (dir)
360+
free(dir);
361+
333362
return fdt_check_header(fdt_addr);
334363
}
335364

0 commit comments

Comments
 (0)