From 878d68c0c357ff62120d5783d950f34ecd1065d9 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 12 Jun 2017 06:21:31 -0600 Subject: dm: core: Add functions to obtain node's address/size cells The of_n_addr_cells() and of_n_size_cells() functions are useful for getting the size of addresses in a node, but in a few places U-Boot needs to obtain the actual property value for a node without walking up the stack. Add functions for this and just the existing code to use it. Add a comment to the existing ofnode functions which do not do the right thing with a flat tree. This fixes a problem reading PCI addresses. Signed-off-by: Simon Glass Tested-by: Marcel Ziswiler Tested-on: Beaver, Jetson-TK1 --- include/dm/of_access.h | 20 ++++++++++++++++++++ include/dm/ofnode.h | 20 ++++++++++++++++++++ include/dm/read.h | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) (limited to 'include') diff --git a/include/dm/of_access.h b/include/dm/of_access.h index d2827001e2b..c5ea391aec1 100644 --- a/include/dm/of_access.h +++ b/include/dm/of_access.h @@ -60,6 +60,26 @@ int of_n_addr_cells(const struct device_node *np); */ int of_n_size_cells(const struct device_node *np); +/** + * of_simple_addr_cells() - Get the address cells property in a node + * + * This function matches fdt_address_cells(). + * + * @np: Node pointer to check + * @return value of #address-cells property in this node, or 2 if none + */ +int of_simple_addr_cells(const struct device_node *np); + +/** + * of_simple_size_cells() - Get the size cells property in a node + * + * This function matches fdt_size_cells(). + * + * @np: Node pointer to check + * @return value of #size-cells property in this node, or 2 if none + */ +int of_simple_size_cells(const struct device_node *np); + /** * of_find_property() - find a property in a node * diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h index d261a61e914..c3d8db5b16f 100644 --- a/include/dm/ofnode.h +++ b/include/dm/ofnode.h @@ -561,6 +561,26 @@ int ofnode_read_addr_cells(ofnode node); */ int ofnode_read_size_cells(ofnode node); +/** + * ofnode_read_simple_addr_cells() - Get the address cells property in a node + * + * This function matches fdt_address_cells(). + * + * @np: Node pointer to check + * @return value of #address-cells property in this node, or 2 if none + */ +int ofnode_read_simple_addr_cells(ofnode node); + +/** + * ofnode_read_simple_size_cells() - Get the size cells property in a node + * + * This function matches fdt_size_cells(). + * + * @np: Node pointer to check + * @return value of #size-cells property in this node, or 2 if none + */ +int ofnode_read_simple_size_cells(ofnode node); + /** * ofnode_pre_reloc() - check if a node should be bound before relocation * diff --git a/include/dm/read.h b/include/dm/read.h index cea1c16a006..6dd1634675b 100644 --- a/include/dm/read.h +++ b/include/dm/read.h @@ -230,6 +230,26 @@ int dev_read_addr_cells(struct udevice *dev); */ int dev_read_size_cells(struct udevice *dev); +/** + * dev_read_addr_cells() - Get the address cells property in a node + * + * This function matches fdt_address_cells(). + * + * @dev: devioe to check + * @return number of address cells this node uses + */ +int dev_read_simple_addr_cells(struct udevice *dev); + +/** + * dev_read_size_cells() - Get the size cells property in a node + * + * This function matches fdt_size_cells(). + * + * @dev: devioe to check + * @return number of size cells this node uses + */ +int dev_read_simple_size_cells(struct udevice *dev); + /** * dev_read_phandle() - Get the phandle from a device * @@ -398,10 +418,22 @@ static inline int dev_read_phandle_with_args(struct udevice *dev, static inline int dev_read_addr_cells(struct udevice *dev) { + /* NOTE: this call should walk up the parent stack */ return fdt_address_cells(gd->fdt_blob, dev_of_offset(dev)); } static inline int dev_read_size_cells(struct udevice *dev) +{ + /* NOTE: this call should walk up the parent stack */ + return fdt_size_cells(gd->fdt_blob, dev_of_offset(dev)); +} + +static inline int dev_read_simple_addr_cells(struct udevice *dev) +{ + return fdt_address_cells(gd->fdt_blob, dev_of_offset(dev)); +} + +static inline int dev_read_simple_size_cells(struct udevice *dev) { return fdt_size_cells(gd->fdt_blob, dev_of_offset(dev)); } -- cgit v1.2.3