fdt: add new fdt_fixup_display function to configure display

Add 'fdt_fixup_display' function to fixup device-tree native-mode property
of display-timings node to select timings for a specific display.
This is useful if a device-tree has configurations for multiple
display timings for undetectable displays.

see kernel Documentation/devicetree/bindings/video/display-timing.txt

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Tim Harvey 2015-04-08 11:45:39 -07:00 committed by Stefano Babic
parent 78c5a18087
commit 08daa258e6
2 changed files with 42 additions and 0 deletions

View file

@ -1560,3 +1560,32 @@ int fdt_setup_simplefb_node(void *fdt, int node, u64 base_address, u32 width,
return 0;
}
/*
* Update native-mode in display-timings from display environment variable.
* The node to update are specified by path.
*/
int fdt_fixup_display(void *blob, const char *path, const char *display)
{
int off, toff;
if (!display || !path)
return -FDT_ERR_NOTFOUND;
toff = fdt_path_offset(blob, path);
if (toff >= 0)
toff = fdt_subnode_offset(blob, toff, "display-timings");
if (toff < 0)
return toff;
for (off = fdt_first_subnode(blob, toff);
off >= 0;
off = fdt_next_subnode(blob, off)) {
uint32_t h = fdt_get_phandle(blob, off);
debug("%s:0x%x\n", fdt_get_name(blob, off, NULL),
fdt32_to_cpu(h));
if (strcasecmp(fdt_get_name(blob, off, NULL), display) == 0)
return fdt_setprop_u32(blob, toff, "native-mode", h);
}
return toff;
}

View file

@ -47,6 +47,19 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,
const void *val, int len, int create);
void fdt_fixup_qe_firmware(void *fdt);
/**
* Update native-mode property of display-timings node to the phandle
* of the timings matching a display by name (case insensitive).
*
* see kernel Documentation/devicetree/bindings/video/display-timing.txt
*
* @param blob FDT blob to update
* @param path path within dt
* @param display name of display timing to match
* @return 0 if ok, or -FDT_ERR_... on error
*/
int fdt_fixup_display(void *blob, const char *path, const char *display);
#if defined(CONFIG_HAS_FSL_DR_USB) || defined(CONFIG_HAS_FSL_MPH_USB)
void fdt_fixup_dr_usb(void *blob, bd_t *bd);
#else