Skip to content
Snippets Groups Projects
Commit 878d68c0 authored by Simon Glass's avatar Simon Glass
Browse files

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: default avatarSimon Glass <sjg@chromium.org>
Tested-by: default avatarMarcel Ziswiler <marcel.ziswiler@toradex.com>
Tested-on: Beaver, Jetson-TK1
parent f7d6fcf7
No related branches found
No related tags found
No related merge requests found
...@@ -96,6 +96,30 @@ int of_n_size_cells(const struct device_node *np) ...@@ -96,6 +96,30 @@ int of_n_size_cells(const struct device_node *np)
return OF_ROOT_NODE_SIZE_CELLS_DEFAULT; return OF_ROOT_NODE_SIZE_CELLS_DEFAULT;
} }
int of_simple_addr_cells(const struct device_node *np)
{
const __be32 *ip;
ip = of_get_property(np, "#address-cells", NULL);
if (ip)
return be32_to_cpup(ip);
/* Return a default of 2 to match fdt_address_cells()*/
return 2;
}
int of_simple_size_cells(const struct device_node *np)
{
const __be32 *ip;
ip = of_get_property(np, "#size-cells", NULL);
if (ip)
return be32_to_cpup(ip);
/* Return a default of 2 to match fdt_size_cells()*/
return 2;
}
struct property *of_find_property(const struct device_node *np, struct property *of_find_property(const struct device_node *np,
const char *name, int *lenp) const char *name, int *lenp)
{ {
......
...@@ -552,7 +552,7 @@ int ofnode_read_addr_cells(ofnode node) ...@@ -552,7 +552,7 @@ int ofnode_read_addr_cells(ofnode node)
{ {
if (ofnode_is_np(node)) if (ofnode_is_np(node))
return of_n_addr_cells(ofnode_to_np(node)); return of_n_addr_cells(ofnode_to_np(node));
else else /* NOTE: this call should walk up the parent stack */
return fdt_address_cells(gd->fdt_blob, ofnode_to_offset(node)); return fdt_address_cells(gd->fdt_blob, ofnode_to_offset(node));
} }
...@@ -560,6 +560,22 @@ int ofnode_read_size_cells(ofnode node) ...@@ -560,6 +560,22 @@ int ofnode_read_size_cells(ofnode node)
{ {
if (ofnode_is_np(node)) if (ofnode_is_np(node))
return of_n_size_cells(ofnode_to_np(node)); return of_n_size_cells(ofnode_to_np(node));
else /* NOTE: this call should walk up the parent stack */
return fdt_size_cells(gd->fdt_blob, ofnode_to_offset(node));
}
int ofnode_read_simple_addr_cells(ofnode node)
{
if (ofnode_is_np(node))
return of_simple_addr_cells(ofnode_to_np(node));
else
return fdt_address_cells(gd->fdt_blob, ofnode_to_offset(node));
}
int ofnode_read_simple_size_cells(ofnode node)
{
if (ofnode_is_np(node))
return of_simple_size_cells(ofnode_to_np(node));
else else
return fdt_size_cells(gd->fdt_blob, ofnode_to_offset(node)); return fdt_size_cells(gd->fdt_blob, ofnode_to_offset(node));
} }
......
...@@ -94,6 +94,16 @@ int dev_read_size_cells(struct udevice *dev) ...@@ -94,6 +94,16 @@ int dev_read_size_cells(struct udevice *dev)
return ofnode_read_size_cells(dev_ofnode(dev)); return ofnode_read_size_cells(dev_ofnode(dev));
} }
int dev_read_simple_addr_cells(struct udevice *dev)
{
return ofnode_read_simple_addr_cells(dev_ofnode(dev));
}
int dev_read_simple_size_cells(struct udevice *dev)
{
return ofnode_read_simple_size_cells(dev_ofnode(dev));
}
int dev_read_phandle(struct udevice *dev) int dev_read_phandle(struct udevice *dev)
{ {
ofnode node = dev_ofnode(dev); ofnode node = dev_ofnode(dev);
......
...@@ -72,8 +72,8 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp) ...@@ -72,8 +72,8 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp)
ofnode node = dev_ofnode(dev); ofnode node = dev_ofnode(dev);
struct resource r; struct resource r;
addr_len = dev_read_addr_cells(dev->parent); addr_len = dev_read_simple_addr_cells(dev->parent);
size_len = dev_read_size_cells(dev->parent); size_len = dev_read_simple_size_cells(dev->parent);
both_len = addr_len + size_len; both_len = addr_len + size_len;
len = dev_read_size(dev, "reg"); len = dev_read_size(dev, "reg");
......
...@@ -766,9 +766,9 @@ static int decode_regions(struct pci_controller *hose, ofnode parent_node, ...@@ -766,9 +766,9 @@ static int decode_regions(struct pci_controller *hose, ofnode parent_node,
prop = ofnode_read_prop(node, "ranges", &len); prop = ofnode_read_prop(node, "ranges", &len);
if (!prop) if (!prop)
return -EINVAL; return -EINVAL;
pci_addr_cells = ofnode_read_addr_cells(node); pci_addr_cells = ofnode_read_simple_addr_cells(node);
addr_cells = ofnode_read_addr_cells(parent_node); addr_cells = ofnode_read_simple_addr_cells(parent_node);
size_cells = ofnode_read_size_cells(node); size_cells = ofnode_read_simple_size_cells(node);
/* PCI addresses are always 3-cells */ /* PCI addresses are always 3-cells */
len /= sizeof(u32); len /= sizeof(u32);
......
...@@ -60,6 +60,26 @@ int of_n_addr_cells(const struct device_node *np); ...@@ -60,6 +60,26 @@ int of_n_addr_cells(const struct device_node *np);
*/ */
int of_n_size_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 * of_find_property() - find a property in a node
* *
......
...@@ -561,6 +561,26 @@ int ofnode_read_addr_cells(ofnode node); ...@@ -561,6 +561,26 @@ int ofnode_read_addr_cells(ofnode node);
*/ */
int ofnode_read_size_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 * ofnode_pre_reloc() - check if a node should be bound before relocation
* *
......
...@@ -230,6 +230,26 @@ int dev_read_addr_cells(struct udevice *dev); ...@@ -230,6 +230,26 @@ int dev_read_addr_cells(struct udevice *dev);
*/ */
int dev_read_size_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 * dev_read_phandle() - Get the phandle from a device
* *
...@@ -398,10 +418,22 @@ static inline int dev_read_phandle_with_args(struct udevice *dev, ...@@ -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) 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)); return fdt_address_cells(gd->fdt_blob, dev_of_offset(dev));
} }
static inline int dev_read_size_cells(struct udevice *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)); return fdt_size_cells(gd->fdt_blob, dev_of_offset(dev));
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment