mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-24 14:25:56 +00:00
fdt_support: add fdt_copy_fixed_partitions function
Add a new function fdt_copy_fixed_partitions to copy the fixed partition nodes from U-Boot device tree to Linux kernel device tree and to dynamically configure the MTD partitions. This function fdt_copy_fixed_partitions is only based on device tree with livetree compatible function and replace the function fdt_fixup_mtdparts based on mtdparts variable. Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
This commit is contained in:
parent
0e7cc08320
commit
163c5f60eb
2 changed files with 81 additions and 0 deletions
|
@ -1051,6 +1051,79 @@ void fdt_fixup_mtdparts(void *blob, const struct node_info *node_info,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int fdt_copy_fixed_partitions(void *blob)
|
||||||
|
{
|
||||||
|
ofnode node, subnode;
|
||||||
|
int off, suboff, res;
|
||||||
|
char path[256];
|
||||||
|
int address_cells, size_cells;
|
||||||
|
u8 i, j, child_count;
|
||||||
|
|
||||||
|
node = ofnode_by_compatible(ofnode_null(), "fixed-partitions");
|
||||||
|
while (ofnode_valid(node)) {
|
||||||
|
/* copy the U-Boot fixed partition */
|
||||||
|
address_cells = ofnode_read_simple_addr_cells(node);
|
||||||
|
size_cells = ofnode_read_simple_size_cells(node);
|
||||||
|
|
||||||
|
res = ofnode_get_path(ofnode_get_parent(node), path, sizeof(path));
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
off = fdt_path_offset(blob, path);
|
||||||
|
if (off < 0)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
off = fdt_find_or_add_subnode(blob, off, "partitions");
|
||||||
|
res = fdt_setprop_string(blob, off, "compatible", "fixed-partitions");
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
res = fdt_setprop_u32(blob, off, "#address-cells", address_cells);
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
res = fdt_setprop_u32(blob, off, "#size-cells", size_cells);
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* parse partition in reverse order as fdt_find_or_add_subnode() only
|
||||||
|
* insert the new node after the parent's properties
|
||||||
|
*/
|
||||||
|
child_count = ofnode_get_child_count(node);
|
||||||
|
for (i = child_count; i > 0 ; i--) {
|
||||||
|
subnode = ofnode_first_subnode(node);
|
||||||
|
if (!ofnode_valid(subnode))
|
||||||
|
break;
|
||||||
|
|
||||||
|
for (j = 0; (j < i - 1); j++)
|
||||||
|
subnode = ofnode_next_subnode(subnode);
|
||||||
|
|
||||||
|
if (!ofnode_valid(subnode))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const u32 *reg;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
suboff = fdt_find_or_add_subnode(blob, off, ofnode_get_name(subnode));
|
||||||
|
res = fdt_setprop_string(blob, suboff, "label",
|
||||||
|
ofnode_read_string(subnode, "label"));
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
reg = ofnode_get_property(subnode, "reg", &len);
|
||||||
|
res = fdt_setprop(blob, suboff, "reg", reg, len);
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* go to next fixed-partitions node */
|
||||||
|
node = ofnode_by_compatible(node, "fixed-partitions");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void fdt_del_node_and_alias(void *blob, const char *alias)
|
void fdt_del_node_and_alias(void *blob, const char *alias)
|
||||||
{
|
{
|
||||||
int off = fdt_path_offset(blob, alias);
|
int off = fdt_path_offset(blob, alias);
|
||||||
|
|
|
@ -256,6 +256,14 @@ static inline void fdt_fixup_mtdparts(void *fdt,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* copy the fixed-partition nodes from U-Boot device tree to external blob
|
||||||
|
*
|
||||||
|
* @param blob FDT blob to update
|
||||||
|
* Return: 0 if ok, or non-zero on error
|
||||||
|
*/
|
||||||
|
int fdt_copy_fixed_partitions(void *blob);
|
||||||
|
|
||||||
void fdt_del_node_and_alias(void *blob, const char *alias);
|
void fdt_del_node_and_alias(void *blob, const char *alias);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue