mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-31 03:21:32 +00:00
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 <sjg@chromium.org> Tested-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> Tested-on: Beaver, Jetson-TK1
This commit is contained in:
parent
f7d6fcf7ae
commit
878d68c0c3
8 changed files with 128 additions and 6 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
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);
|
||||||
*/
|
*/
|
||||||
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);
|
||||||
*/
|
*/
|
||||||
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);
|
||||||
*/
|
*/
|
||||||
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,
|
||||||
|
|
||||||
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));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue