fdt_support: Add a fdt_setup_simplefb_node helper function
Add a generic helper to fill and enable simplefb nodes. The first user of this will be the sunxi display code. lcd_dt_simplefb_configure_node is also a good candidate to be converted to use this, but that requires someone to run some tests first, as lcd_dt_simplefb_configure_node does not honor #address-cells and #size-cells, but simply assumes 1 and 1 for both. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Tested-by: Stephen Warren <swarren@wwwdotorg.org> Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
211717a463
commit
d4f495a881
@ -1524,3 +1524,65 @@ int fdt_read_range(void *fdt, int node, int n, uint64_t *child_addr,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* fdt_setup_simplefb_node - Fill and enable a simplefb node
|
||||
*
|
||||
* @fdt: ptr to device tree
|
||||
* @node: offset of the simplefb node
|
||||
* @base_address: framebuffer base address
|
||||
* @width: width in pixels
|
||||
* @height: height in pixels
|
||||
* @stride: bytes per line
|
||||
* @format: pixel format string
|
||||
*
|
||||
* Convenience function to fill and enable a simplefb node.
|
||||
*/
|
||||
int fdt_setup_simplefb_node(void *fdt, int node, u64 base_address, u32 width,
|
||||
u32 height, u32 stride, const char *format)
|
||||
{
|
||||
char name[32];
|
||||
fdt32_t cells[4];
|
||||
int i, addrc, sizec, ret;
|
||||
|
||||
of_bus_default_count_cells(fdt, fdt_parent_offset(fdt, node),
|
||||
&addrc, &sizec);
|
||||
i = 0;
|
||||
if (addrc == 2)
|
||||
cells[i++] = cpu_to_fdt32(base_address >> 32);
|
||||
cells[i++] = cpu_to_fdt32(base_address);
|
||||
if (sizec == 2)
|
||||
cells[i++] = 0;
|
||||
cells[i++] = cpu_to_fdt32(height * stride);
|
||||
|
||||
ret = fdt_setprop(fdt, node, "reg", cells, sizeof(cells[0]) * i);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
snprintf(name, sizeof(name), "framebuffer@%llx", base_address);
|
||||
ret = fdt_set_name(fdt, node, name);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = fdt_setprop_u32(fdt, node, "width", width);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = fdt_setprop_u32(fdt, node, "height", height);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = fdt_setprop_u32(fdt, node, "stride", stride);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = fdt_setprop_string(fdt, node, "format", format);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = fdt_setprop_string(fdt, node, "status", "okay");
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -147,6 +147,9 @@ void of_bus_default_count_cells(void *blob, int parentoffset,
|
||||
int ft_verify_fdt(void *fdt);
|
||||
int arch_fixup_memory_node(void *blob);
|
||||
|
||||
int fdt_setup_simplefb_node(void *fdt, int node, u64 base_address, u32 width,
|
||||
u32 height, u32 stride, const char *format);
|
||||
|
||||
#endif /* ifdef CONFIG_OF_LIBFDT */
|
||||
|
||||
#ifdef USE_HOSTCC
|
||||
|
Loading…
Reference in New Issue
Block a user