At present, the blob containing a device tree is passed to the various
fdt_*() functions as a (struct fdt_header *) i.e. a pointer to the
header structure at the beginning of the blob.
This patch changes all the functions so that they instead take a (void
*) pointing to the blob. Under some circumstances can avoid the need
for the caller to cast a blob pointer into a (struct fdt_header *)
before passing it to the fdt_*() functions.
Using a (void *) also reduce the temptation for users of the library
to directly dereference toe (struct fdt_header *) to access header
fields. Instead they must use the fdt_get_header() or
fdt_set_header() macros, or the fdt_magic(), fdt_totalsize()
etc. wrappers around them which are safer, since they will always
handle endian conversion.
With this change, the whole-tree moving, or manipulating functions:
fdt_move(), fdt_open_into() and fdt_pack() no longer need to return a
pointer to the "new" tree. The given (void *) buffer pointer they
take can instead be used directly by the caller as the new tree.
Those functions are thus changed to instead return an error code
(which in turn reduces the number of functions using the ugly encoding
of error values into pointers).
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
int fdt_add_subnode_namelen(struct fdt_header *fdt, int parentoffset,
int fdt_add_subnode_namelen(void *fdt, int parentoffset,
const char *name, int namelen)
{
struct fdt_node_header *nh;
@ -249,12 +247,12 @@ int fdt_add_subnode_namelen(struct fdt_header *fdt, int parentoffset,
@@ -249,12 +247,12 @@ int fdt_add_subnode_namelen(struct fdt_header *fdt, int parentoffset,
return offset;
}
int fdt_add_subnode(struct fdt_header *fdt, int parentoffset, const char *name)
int fdt_add_subnode(void *fdt, int parentoffset, const char *name)
int fdt_del_node(struct fdt_header *fdt, int nodeoffset)
int fdt_del_node(void *fdt, int nodeoffset)
{
int endoffset;
int err;
@ -267,35 +265,36 @@ int fdt_del_node(struct fdt_header *fdt, int nodeoffset)
@@ -267,35 +265,36 @@ int fdt_del_node(struct fdt_header *fdt, int nodeoffset)
endoffset - nodeoffset, 0);
}
struct fdt_header *fdt_open_into(struct fdt_header *fdt, void *buf, int bufsize)
int fdt_open_into(void *fdt, void *buf, int bufsize)
int fdt_setprop_inplace(struct fdt_header *fdt, int nodeoffset, const char *name,
int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
const void *val, int len)
{
void *propval;
@ -49,7 +49,7 @@ static void nop_region(void *start, int len)
@@ -49,7 +49,7 @@ static void nop_region(void *start, int len)
*p = cpu_to_fdt32(FDT_NOP);
}
int fdt_nop_property(struct fdt_header *fdt, int nodeoffset, const char *name)
int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
{
struct fdt_property *prop;
int len;
@ -64,7 +64,7 @@ int fdt_nop_property(struct fdt_header *fdt, int nodeoffset, const char *name)
@@ -64,7 +64,7 @@ int fdt_nop_property(struct fdt_header *fdt, int nodeoffset, const char *name)
return 0;
}
int _fdt_node_end_offset(struct fdt_header *fdt, int nodeoffset)
int _fdt_node_end_offset(void *fdt, int nodeoffset)
{
int level = 0;
uint32_t tag;
@ -101,7 +101,7 @@ int _fdt_node_end_offset(struct fdt_header *fdt, int nodeoffset)
@@ -101,7 +101,7 @@ int _fdt_node_end_offset(struct fdt_header *fdt, int nodeoffset)
return nextoffset;
}
int fdt_nop_node(struct fdt_header *fdt, int nodeoffset)