diff options
Diffstat (limited to 'drivers/core/ofnode.c')
| -rw-r--r-- | drivers/core/ofnode.c | 44 | 
1 files changed, 41 insertions, 3 deletions
| diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 6c771e364fb..eeeccfb4467 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -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; @@ -299,7 +324,8 @@ ofnode ofnode_get_by_phandle(uint phandle)  	return node;  } -fdt_addr_t ofnode_get_addr_size_index(ofnode node, int index, fdt_size_t *size) +static fdt_addr_t __ofnode_get_addr_size_index(ofnode node, int index, +					       fdt_size_t *size, bool translate)  {  	int na, ns; @@ -319,7 +345,7 @@ fdt_addr_t ofnode_get_addr_size_index(ofnode node, int index, fdt_size_t *size)  		ns = of_n_size_cells(ofnode_to_np(node)); -		if (IS_ENABLED(CONFIG_OF_TRANSLATE) && ns > 0) { +		if (translate && IS_ENABLED(CONFIG_OF_TRANSLATE) && ns > 0) {  			return of_translate_address(ofnode_to_np(node), prop_val);  		} else {  			na = of_n_addr_cells(ofnode_to_np(node)); @@ -330,12 +356,24 @@ fdt_addr_t ofnode_get_addr_size_index(ofnode node, int index, fdt_size_t *size)  		ns = ofnode_read_simple_size_cells(ofnode_get_parent(node));  		return fdtdec_get_addr_size_fixed(gd->fdt_blob,  						  ofnode_to_offset(node), "reg", -						  index, na, ns, size, true); +						  index, na, ns, size, +						  translate);  	}  	return FDT_ADDR_T_NONE;  } +fdt_addr_t ofnode_get_addr_size_index(ofnode node, int index, fdt_size_t *size) +{ +	return __ofnode_get_addr_size_index(node, index, size, true); +} + +fdt_addr_t ofnode_get_addr_size_index_notrans(ofnode node, int index, +					      fdt_size_t *size) +{ +	return __ofnode_get_addr_size_index(node, index, size, false); +} +  fdt_addr_t ofnode_get_addr_index(ofnode node, int index)  {  	fdt_size_t size; | 
