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

dm: core: Add dev_read_resource() to read device resources


Add a function which reads resources from a device, such as the device
hardware address. This uses the "reg" property in the device.

Unlike other functions there is little sense in inlining this when
livetree is not being used because it has some logic in it and this would
just bloat the code size.

Signed-off-by: Simon Glass's avatarSimon Glass <sjg@chromium.org>
Tested-by: default avatarMarcel Ziswiler <marcel.ziswiler@toradex.com>
Tested-on: Beaver, Jetson-TK1
parent 8c293d6a
No related branches found
No related tags found
No related merge requests found
...@@ -15,4 +15,4 @@ obj-$(CONFIG_OF_LIVE) += of_access.o of_addr.o ...@@ -15,4 +15,4 @@ obj-$(CONFIG_OF_LIVE) += of_access.o of_addr.o
ifndef CONFIG_DM_DEV_READ_INLINE ifndef CONFIG_DM_DEV_READ_INLINE
obj-$(CONFIG_OF_CONTROL) += read.o obj-$(CONFIG_OF_CONTROL) += read.o
endif endif
obj-$(CONFIG_OF_CONTROL) += of_extra.o ofnode.o obj-$(CONFIG_OF_CONTROL) += of_extra.o ofnode.o read_extra.o
/*
* Copyright (c) 2017 Google, Inc
* Written by Simon Glass <sjg@chromium.org>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <dm.h>
#include <dm/of_addr.h>
#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;
}
}
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include <dm/ofnode.h> #include <dm/ofnode.h>
#include <dm/uclass.h> #include <dm/uclass.h>
struct resource;
#if CONFIG_IS_ENABLED(OF_LIVE) #if CONFIG_IS_ENABLED(OF_LIVE)
static inline const struct device_node *dev_np(struct udevice *dev) static inline const struct device_node *dev_np(struct udevice *dev)
{ {
...@@ -42,6 +44,16 @@ static inline bool dev_of_valid(struct udevice *dev) ...@@ -42,6 +44,16 @@ 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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment