dm: core: Add ofnode_read_resource()
We sometimes need to read a resource from an arbitrary node. In any case for consistency we should not put the live-tree switching code in a dev_read_...() function. Update this to suit. Signed-off-by: Simon Glass <sjg@chromium.org> Tested-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> Tested-on: Beaver, Jetson-TK1 Tested-by: Stephen Warren <swarren@nvidia.com>
This commit is contained in:
parent
c61d0009fe
commit
dcf988525f
@ -14,6 +14,7 @@
|
||||
#include <dm/of_addr.h>
|
||||
#include <dm/ofnode.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/ioport.h>
|
||||
|
||||
int ofnode_read_u32(ofnode node, const char *propname, u32 *outp)
|
||||
{
|
||||
@ -593,3 +594,23 @@ bool ofnode_pre_reloc(ofnode node)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int ofnode_read_resource(ofnode node, uint index, struct resource *res)
|
||||
{
|
||||
if (ofnode_is_np(node)) {
|
||||
return of_address_to_resource(ofnode_to_np(node), index, res);
|
||||
} else {
|
||||
struct fdt_resource fres;
|
||||
int ret;
|
||||
|
||||
ret = fdt_get_resource(gd->fdt_blob, ofnode_to_offset(node),
|
||||
"reg", index, &fres);
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
memset(res, '\0', sizeof(*res));
|
||||
res->start = fres.start;
|
||||
res->end = fres.end;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -159,3 +159,8 @@ int dev_read_enabled(struct udevice *dev)
|
||||
return fdtdec_get_is_enabled(gd->fdt_blob,
|
||||
ofnode_to_offset(node));
|
||||
}
|
||||
|
||||
int dev_read_resource(struct udevice *dev, uint index, struct resource *res)
|
||||
{
|
||||
return ofnode_read_resource(dev_ofnode(dev), index, res);
|
||||
}
|
||||
|
@ -11,27 +11,4 @@
|
||||
#include <dm/read.h>
|
||||
#include <linux/ioport.h>
|
||||
|
||||
int dev_read_resource(struct udevice *dev, uint index, struct resource *res)
|
||||
{
|
||||
ofnode node = dev_ofnode(dev);
|
||||
|
||||
#ifdef CONFIG_OF_LIVE
|
||||
if (ofnode_is_np(node)) {
|
||||
return of_address_to_resource(ofnode_to_np(node), index, res);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
struct fdt_resource fres;
|
||||
int ret;
|
||||
|
||||
ret = fdt_get_resource(gd->fdt_blob, ofnode_to_offset(node),
|
||||
"reg", index, &fres);
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
memset(res, '\0', sizeof(*res));
|
||||
res->start = fres.start;
|
||||
res->end = fres.end;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/* This file can hold non-inlined dev_read_...() functions */
|
||||
|
@ -15,6 +15,8 @@
|
||||
/* Enable checks to protect against invalid calls */
|
||||
#undef OF_CHECKS
|
||||
|
||||
struct resource;
|
||||
|
||||
/**
|
||||
* ofnode - reference to a device tree node
|
||||
*
|
||||
@ -605,4 +607,6 @@ int ofnode_read_simple_size_cells(ofnode node);
|
||||
*/
|
||||
bool ofnode_pre_reloc(ofnode node);
|
||||
|
||||
int ofnode_read_resource(ofnode node, uint index, struct resource *res);
|
||||
|
||||
#endif
|
||||
|
@ -44,16 +44,6 @@ static inline bool dev_of_valid(struct udevice *dev)
|
||||
return ofnode_valid(dev_ofnode(dev));
|
||||
}
|
||||
|
||||
/**
|
||||
* dev_read_resource() - obtain an indexed resource from a device.
|
||||
*
|
||||
* @dev: devuce to examine
|
||||
* @index index of the resource to retrieve (0 = first)
|
||||
* @res returns the resource
|
||||
* @return 0 if ok, negative on error
|
||||
*/
|
||||
int dev_read_resource(struct udevice *dev, uint index, struct resource *res);
|
||||
|
||||
#ifndef CONFIG_DM_DEV_READ_INLINE
|
||||
/**
|
||||
* dev_read_u32_default() - read a 32-bit integer from a device's DT property
|
||||
@ -348,6 +338,16 @@ const uint8_t *dev_read_u8_array_ptr(struct udevice *dev, const char *propname,
|
||||
*/
|
||||
int dev_read_enabled(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* dev_read_resource() - obtain an indexed resource from a device.
|
||||
*
|
||||
* @dev: devuce to examine
|
||||
* @index index of the resource to retrieve (0 = first)
|
||||
* @res returns the resource
|
||||
* @return 0 if ok, negative on error
|
||||
*/
|
||||
int dev_read_resource(struct udevice *dev, uint index, struct resource *res);
|
||||
|
||||
#else /* CONFIG_DM_DEV_READ_INLINE is enabled */
|
||||
|
||||
static inline int dev_read_u32_default(struct udevice *dev,
|
||||
@ -482,6 +482,12 @@ static inline int dev_read_enabled(struct udevice *dev)
|
||||
return fdtdec_get_is_enabled(gd->fdt_blob, dev_of_offset(dev));
|
||||
}
|
||||
|
||||
static inline int dev_read_resource(struct udevice *dev, uint index,
|
||||
struct resource *res)
|
||||
{
|
||||
return ofnode_read_resource(dev_ofnode(dev), index, res);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_DM_DEV_READ_INLINE */
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user