dm: core: add ofnode_get_path()

Add function for retrieving full node path of a given ofnode.
This uses np->full_name if OF is live, otherwise a call to
fdt_get_path() is made.

Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Tested-by: Patrice Chotard <patrice.chotard@foss.st.com>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
This commit is contained in:
Marek Behún 2021-05-26 14:08:18 +02:00 committed by Jagan Teki
parent 31a7b719d0
commit 0e116bea52
3 changed files with 56 additions and 0 deletions

View File

@ -286,6 +286,31 @@ const char *ofnode_get_name(ofnode node)
return fdt_get_name(gd->fdt_blob, ofnode_to_offset(node), NULL);
}
int ofnode_get_path(ofnode node, char *buf, int buflen)
{
assert(ofnode_valid(node));
if (ofnode_is_np(node)) {
if (strlen(node.np->full_name) >= buflen)
return -ENOSPC;
strcpy(buf, node.np->full_name);
return 0;
} else {
int res;
res = fdt_get_path(gd->fdt_blob, ofnode_to_offset(node), buf,
buflen);
if (!res)
return res;
else if (res == -FDT_ERR_NOSPACE)
return -ENOSPC;
else
return -EINVAL;
}
}
ofnode ofnode_get_by_phandle(uint phandle)
{
ofnode node;

View File

@ -458,6 +458,16 @@ ofnode ofnode_get_parent(ofnode node);
*/
const char *ofnode_get_name(ofnode node);
/**
* ofnode_get_path() - get the full path of a node
*
* @node: valid node to look up
* @buf: buffer to write the node path into
* @buflen: buffer size
* @return 0 if OK, -ve on error
*/
int ofnode_get_path(ofnode node, char *buf, int buflen);
/**
* ofnode_get_by_phandle() - get ofnode from phandle
*

View File

@ -297,3 +297,24 @@ static int dm_test_ofnode_get_reg(struct unit_test_state *uts)
return 0;
}
DM_TEST(dm_test_ofnode_get_reg, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
static int dm_test_ofnode_get_path(struct unit_test_state *uts)
{
const char *path = "/translation-test@8000/noxlatebus@3,300/dev@42";
char buf[64];
ofnode node;
int res;
node = ofnode_path(path);
ut_assert(ofnode_valid(node));
res = ofnode_get_path(node, buf, 64);
ut_asserteq(0, res);
ut_asserteq_str(path, buf);
res = ofnode_get_path(node, buf, 32);
ut_asserteq(-ENOSPC, res);
return 0;
}
DM_TEST(dm_test_ofnode_get_path, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);