xref: /rk3399_rockchip-uboot/drivers/core/read.c (revision 18a0c4a65bddc8c9a9000fa06442a88bbb1d0ae3)
147a0fd3bSSimon Glass /*
247a0fd3bSSimon Glass  * Copyright (c) 2017 Google, Inc
347a0fd3bSSimon Glass  * Written by Simon Glass <sjg@chromium.org>
447a0fd3bSSimon Glass  *
547a0fd3bSSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
647a0fd3bSSimon Glass  */
747a0fd3bSSimon Glass 
847a0fd3bSSimon Glass #include <common.h>
947a0fd3bSSimon Glass #include <dm.h>
1047a0fd3bSSimon Glass #include <dm/of_access.h>
1147a0fd3bSSimon Glass 
1247a0fd3bSSimon Glass int dev_read_u32_default(struct udevice *dev, const char *propname, int def)
1347a0fd3bSSimon Glass {
1447a0fd3bSSimon Glass 	return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
1547a0fd3bSSimon Glass }
1647a0fd3bSSimon Glass 
1747a0fd3bSSimon Glass const char *dev_read_string(struct udevice *dev, const char *propname)
1847a0fd3bSSimon Glass {
1947a0fd3bSSimon Glass 	return ofnode_read_string(dev_ofnode(dev), propname);
2047a0fd3bSSimon Glass }
2147a0fd3bSSimon Glass 
2247a0fd3bSSimon Glass bool dev_read_bool(struct udevice *dev, const char *propname)
2347a0fd3bSSimon Glass {
2447a0fd3bSSimon Glass 	return ofnode_read_bool(dev_ofnode(dev), propname);
2547a0fd3bSSimon Glass }
2647a0fd3bSSimon Glass 
2747a0fd3bSSimon Glass ofnode dev_read_subnode(struct udevice *dev, const char *subnode_name)
2847a0fd3bSSimon Glass {
2947a0fd3bSSimon Glass 	return ofnode_find_subnode(dev_ofnode(dev), subnode_name);
3047a0fd3bSSimon Glass }
3147a0fd3bSSimon Glass 
3247a0fd3bSSimon Glass ofnode dev_read_first_subnode(struct udevice *dev)
3347a0fd3bSSimon Glass {
3447a0fd3bSSimon Glass 	return ofnode_first_subnode(dev_ofnode(dev));
3547a0fd3bSSimon Glass }
3647a0fd3bSSimon Glass 
3747a0fd3bSSimon Glass ofnode dev_read_next_subnode(ofnode node)
3847a0fd3bSSimon Glass {
3947a0fd3bSSimon Glass 	return ofnode_next_subnode(node);
4047a0fd3bSSimon Glass }
4147a0fd3bSSimon Glass 
4247a0fd3bSSimon Glass int dev_read_size(struct udevice *dev, const char *propname)
4347a0fd3bSSimon Glass {
4447a0fd3bSSimon Glass 	return ofnode_read_size(dev_ofnode(dev), propname);
4547a0fd3bSSimon Glass }
4647a0fd3bSSimon Glass 
4747a0fd3bSSimon Glass fdt_addr_t dev_read_addr_index(struct udevice *dev, int index)
4847a0fd3bSSimon Glass {
4947a0fd3bSSimon Glass 	if (ofnode_is_np(dev_ofnode(dev)))
5047a0fd3bSSimon Glass 		return ofnode_get_addr_index(dev_ofnode(dev), index);
5147a0fd3bSSimon Glass 	else
5247a0fd3bSSimon Glass 		return devfdt_get_addr_index(dev, index);
5347a0fd3bSSimon Glass }
5447a0fd3bSSimon Glass 
5547a0fd3bSSimon Glass fdt_addr_t dev_read_addr(struct udevice *dev)
5647a0fd3bSSimon Glass {
5747a0fd3bSSimon Glass 	return dev_read_addr_index(dev, 0);
5847a0fd3bSSimon Glass }
5947a0fd3bSSimon Glass 
60*18a0c4a6SPhilipp Tomsich void *dev_read_addr_ptr(struct udevice *dev)
61*18a0c4a6SPhilipp Tomsich {
62*18a0c4a6SPhilipp Tomsich 	fdt_addr_t addr = dev_read_addr(dev);
63*18a0c4a6SPhilipp Tomsich 
64*18a0c4a6SPhilipp Tomsich 	return (addr == FDT_ADDR_T_NONE) ? NULL : (void *)addr;
65*18a0c4a6SPhilipp Tomsich }
66*18a0c4a6SPhilipp Tomsich 
6747a0fd3bSSimon Glass fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *property,
6847a0fd3bSSimon Glass 				fdt_size_t *sizep)
6947a0fd3bSSimon Glass {
7047a0fd3bSSimon Glass 	return ofnode_get_addr_size(dev_ofnode(dev), property, sizep);
7147a0fd3bSSimon Glass }
7247a0fd3bSSimon Glass 
7347a0fd3bSSimon Glass const char *dev_read_name(struct udevice *dev)
7447a0fd3bSSimon Glass {
7547a0fd3bSSimon Glass 	return ofnode_get_name(dev_ofnode(dev));
7647a0fd3bSSimon Glass }
7747a0fd3bSSimon Glass 
7847a0fd3bSSimon Glass int dev_read_stringlist_search(struct udevice *dev, const char *property,
7947a0fd3bSSimon Glass 			  const char *string)
8047a0fd3bSSimon Glass {
8147a0fd3bSSimon Glass 	return ofnode_stringlist_search(dev_ofnode(dev), property, string);
8247a0fd3bSSimon Glass }
8347a0fd3bSSimon Glass 
8447a0fd3bSSimon Glass int dev_read_phandle_with_args(struct udevice *dev, const char *list_name,
8547a0fd3bSSimon Glass 				const char *cells_name, int cell_count,
8647a0fd3bSSimon Glass 				int index,
8747a0fd3bSSimon Glass 				struct ofnode_phandle_args *out_args)
8847a0fd3bSSimon Glass {
8947a0fd3bSSimon Glass 	return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
9047a0fd3bSSimon Glass 					      cells_name, cell_count, index,
9147a0fd3bSSimon Glass 					      out_args);
9247a0fd3bSSimon Glass }
9347a0fd3bSSimon Glass 
9447a0fd3bSSimon Glass int dev_read_addr_cells(struct udevice *dev)
9547a0fd3bSSimon Glass {
9647a0fd3bSSimon Glass 	return ofnode_read_addr_cells(dev_ofnode(dev));
9747a0fd3bSSimon Glass }
9847a0fd3bSSimon Glass 
9947a0fd3bSSimon Glass int dev_read_size_cells(struct udevice *dev)
10047a0fd3bSSimon Glass {
10147a0fd3bSSimon Glass 	return ofnode_read_size_cells(dev_ofnode(dev));
10247a0fd3bSSimon Glass }
10347a0fd3bSSimon Glass 
104878d68c0SSimon Glass int dev_read_simple_addr_cells(struct udevice *dev)
105878d68c0SSimon Glass {
106878d68c0SSimon Glass 	return ofnode_read_simple_addr_cells(dev_ofnode(dev));
107878d68c0SSimon Glass }
108878d68c0SSimon Glass 
109878d68c0SSimon Glass int dev_read_simple_size_cells(struct udevice *dev)
110878d68c0SSimon Glass {
111878d68c0SSimon Glass 	return ofnode_read_simple_size_cells(dev_ofnode(dev));
112878d68c0SSimon Glass }
113878d68c0SSimon Glass 
11447a0fd3bSSimon Glass int dev_read_phandle(struct udevice *dev)
11547a0fd3bSSimon Glass {
11647a0fd3bSSimon Glass 	ofnode node = dev_ofnode(dev);
11747a0fd3bSSimon Glass 
11847a0fd3bSSimon Glass 	if (ofnode_is_np(node))
11947a0fd3bSSimon Glass 		return ofnode_to_np(node)->phandle;
12047a0fd3bSSimon Glass 	else
12147a0fd3bSSimon Glass 		return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node));
12247a0fd3bSSimon Glass }
12347a0fd3bSSimon Glass 
124fd73621cSMasahiro Yamada const void *dev_read_prop(struct udevice *dev, const char *propname, int *lenp)
12547a0fd3bSSimon Glass {
12661e51babSMasahiro Yamada 	return ofnode_get_property(dev_ofnode(dev), propname, lenp);
12747a0fd3bSSimon Glass }
12847a0fd3bSSimon Glass 
12947a0fd3bSSimon Glass int dev_read_alias_seq(struct udevice *dev, int *devnump)
13047a0fd3bSSimon Glass {
13147a0fd3bSSimon Glass 	ofnode node = dev_ofnode(dev);
13247a0fd3bSSimon Glass 	const char *uc_name = dev->uclass->uc_drv->name;
13347a0fd3bSSimon Glass 	int ret;
13447a0fd3bSSimon Glass 
13547a0fd3bSSimon Glass 	if (ofnode_is_np(node)) {
13647a0fd3bSSimon Glass 		ret = of_alias_get_id(ofnode_to_np(node), uc_name);
13747a0fd3bSSimon Glass 		if (ret >= 0)
13847a0fd3bSSimon Glass 			*devnump = ret;
13947a0fd3bSSimon Glass 	} else {
14047a0fd3bSSimon Glass 		ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
14147a0fd3bSSimon Glass 					   ofnode_to_offset(node), devnump);
14247a0fd3bSSimon Glass 	}
14347a0fd3bSSimon Glass 
14447a0fd3bSSimon Glass 	return ret;
14547a0fd3bSSimon Glass }
14647a0fd3bSSimon Glass 
14747a0fd3bSSimon Glass int dev_read_u32_array(struct udevice *dev, const char *propname,
14847a0fd3bSSimon Glass 		       u32 *out_values, size_t sz)
14947a0fd3bSSimon Glass {
15047a0fd3bSSimon Glass 	return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz);
15147a0fd3bSSimon Glass }
15247a0fd3bSSimon Glass 
15347a0fd3bSSimon Glass const uint8_t *dev_read_u8_array_ptr(struct udevice *dev, const char *propname,
15447a0fd3bSSimon Glass 				     size_t sz)
15547a0fd3bSSimon Glass {
15647a0fd3bSSimon Glass 	return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz);
15747a0fd3bSSimon Glass }
158f7d6fcf7SSimon Glass 
159f7d6fcf7SSimon Glass int dev_read_enabled(struct udevice *dev)
160f7d6fcf7SSimon Glass {
161f7d6fcf7SSimon Glass 	ofnode node = dev_ofnode(dev);
162f7d6fcf7SSimon Glass 
163f7d6fcf7SSimon Glass 	if (ofnode_is_np(node))
164f7d6fcf7SSimon Glass 		return of_device_is_available(ofnode_to_np(node));
165f7d6fcf7SSimon Glass 	else
166f7d6fcf7SSimon Glass 		return fdtdec_get_is_enabled(gd->fdt_blob,
167f7d6fcf7SSimon Glass 					     ofnode_to_offset(node));
168f7d6fcf7SSimon Glass }
169dcf98852SSimon Glass 
170dcf98852SSimon Glass int dev_read_resource(struct udevice *dev, uint index, struct resource *res)
171dcf98852SSimon Glass {
172dcf98852SSimon Glass 	return ofnode_read_resource(dev_ofnode(dev), index, res);
173dcf98852SSimon Glass }
1747b8b47bdSMasahiro Yamada 
1757b8b47bdSMasahiro Yamada int dev_read_resource_byname(struct udevice *dev, const char *name,
1767b8b47bdSMasahiro Yamada 			     struct resource *res)
1777b8b47bdSMasahiro Yamada {
1787b8b47bdSMasahiro Yamada 	return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
1797b8b47bdSMasahiro Yamada }
180