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/of_addr.h>
|
||||||
#include <dm/ofnode.h>
|
#include <dm/ofnode.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
#include <linux/ioport.h>
|
||||||
|
|
||||||
int ofnode_read_u32(ofnode node, const char *propname, u32 *outp)
|
int ofnode_read_u32(ofnode node, const char *propname, u32 *outp)
|
||||||
{
|
{
|
||||||
@ -593,3 +594,23 @@ bool ofnode_pre_reloc(ofnode node)
|
|||||||
|
|
||||||
return false;
|
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,
|
return fdtdec_get_is_enabled(gd->fdt_blob,
|
||||||
ofnode_to_offset(node));
|
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 <dm/read.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
|
||||||
int dev_read_resource(struct udevice *dev, uint index, struct resource *res)
|
/* This file can hold non-inlined dev_read_...() functions */
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
/* Enable checks to protect against invalid calls */
|
/* Enable checks to protect against invalid calls */
|
||||||
#undef OF_CHECKS
|
#undef OF_CHECKS
|
||||||
|
|
||||||
|
struct resource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ofnode - reference to a device tree node
|
* 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);
|
bool ofnode_pre_reloc(ofnode node);
|
||||||
|
|
||||||
|
int ofnode_read_resource(ofnode node, uint index, struct resource *res);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -44,16 +44,6 @@ static inline bool dev_of_valid(struct udevice *dev)
|
|||||||
return ofnode_valid(dev_ofnode(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
|
#ifndef CONFIG_DM_DEV_READ_INLINE
|
||||||
/**
|
/**
|
||||||
* dev_read_u32_default() - read a 32-bit integer from a device's DT property
|
* 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);
|
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 */
|
#else /* CONFIG_DM_DEV_READ_INLINE is enabled */
|
||||||
|
|
||||||
static inline int dev_read_u32_default(struct udevice *dev,
|
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));
|
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 */
|
#endif /* CONFIG_DM_DEV_READ_INLINE */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user