xref: /openbmc/u-boot/drivers/core/read.c (revision f94fa0e94f36c740d3c7aa314c89a750c742185b)
183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
247a0fd3bSSimon Glass /*
347a0fd3bSSimon Glass  * Copyright (c) 2017 Google, Inc
447a0fd3bSSimon Glass  * Written by Simon Glass <sjg@chromium.org>
547a0fd3bSSimon Glass  */
647a0fd3bSSimon Glass 
730a90f56SÁlvaro Fernández Rojas #include <asm/types.h>
830a90f56SÁlvaro Fernández Rojas #include <asm/io.h>
947a0fd3bSSimon Glass #include <common.h>
1047a0fd3bSSimon Glass #include <dm.h>
118ccc2db6SSimon Glass #include <mapmem.h>
1247a0fd3bSSimon Glass #include <dm/of_access.h>
1347a0fd3bSSimon Glass 
dev_read_u32(struct udevice * dev,const char * propname,u32 * outp)143ab48f62SMasahiro Yamada int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp)
153ab48f62SMasahiro Yamada {
163ab48f62SMasahiro Yamada 	return ofnode_read_u32(dev_ofnode(dev), propname, outp);
173ab48f62SMasahiro Yamada }
183ab48f62SMasahiro Yamada 
dev_read_u32_default(struct udevice * dev,const char * propname,int def)1947a0fd3bSSimon Glass int dev_read_u32_default(struct udevice *dev, const char *propname, int def)
2047a0fd3bSSimon Glass {
2147a0fd3bSSimon Glass 	return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
2247a0fd3bSSimon Glass }
2347a0fd3bSSimon Glass 
dev_read_s32(struct udevice * dev,const char * propname,s32 * outp)24a1b17e4fSSimon Glass int dev_read_s32(struct udevice *dev, const char *propname, s32 *outp)
25a1b17e4fSSimon Glass {
26a1b17e4fSSimon Glass 	return ofnode_read_u32(dev_ofnode(dev), propname, (u32 *)outp);
27a1b17e4fSSimon Glass }
28a1b17e4fSSimon Glass 
dev_read_s32_default(struct udevice * dev,const char * propname,int def)29a1b17e4fSSimon Glass int dev_read_s32_default(struct udevice *dev, const char *propname, int def)
30a1b17e4fSSimon Glass {
31a1b17e4fSSimon Glass 	return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
32a1b17e4fSSimon Glass }
33a1b17e4fSSimon Glass 
dev_read_u32u(struct udevice * dev,const char * propname,uint * outp)34a1b17e4fSSimon Glass int dev_read_u32u(struct udevice *dev, const char *propname, uint *outp)
35a1b17e4fSSimon Glass {
36a1b17e4fSSimon Glass 	u32 val;
37a1b17e4fSSimon Glass 	int ret;
38a1b17e4fSSimon Glass 
39a1b17e4fSSimon Glass 	ret = ofnode_read_u32(dev_ofnode(dev), propname, &val);
40a1b17e4fSSimon Glass 	if (ret)
41a1b17e4fSSimon Glass 		return ret;
42a1b17e4fSSimon Glass 	*outp = val;
43a1b17e4fSSimon Glass 
44a1b17e4fSSimon Glass 	return 0;
45a1b17e4fSSimon Glass }
46a1b17e4fSSimon Glass 
dev_read_string(struct udevice * dev,const char * propname)4747a0fd3bSSimon Glass const char *dev_read_string(struct udevice *dev, const char *propname)
4847a0fd3bSSimon Glass {
4947a0fd3bSSimon Glass 	return ofnode_read_string(dev_ofnode(dev), propname);
5047a0fd3bSSimon Glass }
5147a0fd3bSSimon Glass 
dev_read_bool(struct udevice * dev,const char * propname)5247a0fd3bSSimon Glass bool dev_read_bool(struct udevice *dev, const char *propname)
5347a0fd3bSSimon Glass {
5447a0fd3bSSimon Glass 	return ofnode_read_bool(dev_ofnode(dev), propname);
5547a0fd3bSSimon Glass }
5647a0fd3bSSimon Glass 
dev_read_subnode(struct udevice * dev,const char * subnode_name)5747a0fd3bSSimon Glass ofnode dev_read_subnode(struct udevice *dev, const char *subnode_name)
5847a0fd3bSSimon Glass {
5947a0fd3bSSimon Glass 	return ofnode_find_subnode(dev_ofnode(dev), subnode_name);
6047a0fd3bSSimon Glass }
6147a0fd3bSSimon Glass 
dev_read_first_subnode(struct udevice * dev)6247a0fd3bSSimon Glass ofnode dev_read_first_subnode(struct udevice *dev)
6347a0fd3bSSimon Glass {
6447a0fd3bSSimon Glass 	return ofnode_first_subnode(dev_ofnode(dev));
6547a0fd3bSSimon Glass }
6647a0fd3bSSimon Glass 
dev_read_next_subnode(ofnode node)6747a0fd3bSSimon Glass ofnode dev_read_next_subnode(ofnode node)
6847a0fd3bSSimon Glass {
6947a0fd3bSSimon Glass 	return ofnode_next_subnode(node);
7047a0fd3bSSimon Glass }
7147a0fd3bSSimon Glass 
dev_read_size(struct udevice * dev,const char * propname)7247a0fd3bSSimon Glass int dev_read_size(struct udevice *dev, const char *propname)
7347a0fd3bSSimon Glass {
7447a0fd3bSSimon Glass 	return ofnode_read_size(dev_ofnode(dev), propname);
7547a0fd3bSSimon Glass }
7647a0fd3bSSimon Glass 
dev_read_addr_index(struct udevice * dev,int index)7747a0fd3bSSimon Glass fdt_addr_t dev_read_addr_index(struct udevice *dev, int index)
7847a0fd3bSSimon Glass {
7947a0fd3bSSimon Glass 	if (ofnode_is_np(dev_ofnode(dev)))
8047a0fd3bSSimon Glass 		return ofnode_get_addr_index(dev_ofnode(dev), index);
8147a0fd3bSSimon Glass 	else
8247a0fd3bSSimon Glass 		return devfdt_get_addr_index(dev, index);
8347a0fd3bSSimon Glass }
8447a0fd3bSSimon Glass 
dev_remap_addr_index(struct udevice * dev,int index)8530a90f56SÁlvaro Fernández Rojas void *dev_remap_addr_index(struct udevice *dev, int index)
8630a90f56SÁlvaro Fernández Rojas {
8730a90f56SÁlvaro Fernández Rojas 	fdt_addr_t addr = dev_read_addr_index(dev, index);
8830a90f56SÁlvaro Fernández Rojas 
8930a90f56SÁlvaro Fernández Rojas 	if (addr == FDT_ADDR_T_NONE)
9030a90f56SÁlvaro Fernández Rojas 		return NULL;
9130a90f56SÁlvaro Fernández Rojas 
9230a90f56SÁlvaro Fernández Rojas 	return map_physmem(addr, 0, MAP_NOCACHE);
9330a90f56SÁlvaro Fernández Rojas }
9430a90f56SÁlvaro Fernández Rojas 
dev_read_addr_name(struct udevice * dev,const char * name)9579598820SÁlvaro Fernández Rojas fdt_addr_t dev_read_addr_name(struct udevice *dev, const char *name)
9679598820SÁlvaro Fernández Rojas {
9779598820SÁlvaro Fernández Rojas 	int index = dev_read_stringlist_search(dev, "reg-names", name);
9879598820SÁlvaro Fernández Rojas 
9979598820SÁlvaro Fernández Rojas 	if (index < 0)
10079598820SÁlvaro Fernández Rojas 		return FDT_ADDR_T_NONE;
10179598820SÁlvaro Fernández Rojas 	else
10279598820SÁlvaro Fernández Rojas 		return dev_read_addr_index(dev, index);
10379598820SÁlvaro Fernández Rojas }
10479598820SÁlvaro Fernández Rojas 
dev_remap_addr_name(struct udevice * dev,const char * name)10579598820SÁlvaro Fernández Rojas void *dev_remap_addr_name(struct udevice *dev, const char *name)
10679598820SÁlvaro Fernández Rojas {
10779598820SÁlvaro Fernández Rojas 	fdt_addr_t addr = dev_read_addr_name(dev, name);
10879598820SÁlvaro Fernández Rojas 
10979598820SÁlvaro Fernández Rojas 	if (addr == FDT_ADDR_T_NONE)
11079598820SÁlvaro Fernández Rojas 		return NULL;
11179598820SÁlvaro Fernández Rojas 
11279598820SÁlvaro Fernández Rojas 	return map_physmem(addr, 0, MAP_NOCACHE);
11379598820SÁlvaro Fernández Rojas }
11479598820SÁlvaro Fernández Rojas 
dev_read_addr(struct udevice * dev)11547a0fd3bSSimon Glass fdt_addr_t dev_read_addr(struct udevice *dev)
11647a0fd3bSSimon Glass {
11747a0fd3bSSimon Glass 	return dev_read_addr_index(dev, 0);
11847a0fd3bSSimon Glass }
11947a0fd3bSSimon Glass 
dev_read_addr_ptr(struct udevice * dev)120c131c8bcSPhilipp Tomsich void *dev_read_addr_ptr(struct udevice *dev)
121c131c8bcSPhilipp Tomsich {
122c131c8bcSPhilipp Tomsich 	fdt_addr_t addr = dev_read_addr(dev);
123c131c8bcSPhilipp Tomsich 
1248ccc2db6SSimon Glass 	return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0);
125c131c8bcSPhilipp Tomsich }
126c131c8bcSPhilipp Tomsich 
dev_remap_addr(struct udevice * dev)12730a90f56SÁlvaro Fernández Rojas void *dev_remap_addr(struct udevice *dev)
12830a90f56SÁlvaro Fernández Rojas {
12930a90f56SÁlvaro Fernández Rojas 	return dev_remap_addr_index(dev, 0);
13030a90f56SÁlvaro Fernández Rojas }
13130a90f56SÁlvaro Fernández Rojas 
dev_read_addr_size(struct udevice * dev,const char * property,fdt_size_t * sizep)13247a0fd3bSSimon Glass fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *property,
13347a0fd3bSSimon Glass 			      fdt_size_t *sizep)
13447a0fd3bSSimon Glass {
13547a0fd3bSSimon Glass 	return ofnode_get_addr_size(dev_ofnode(dev), property, sizep);
13647a0fd3bSSimon Glass }
13747a0fd3bSSimon Glass 
dev_read_name(struct udevice * dev)13847a0fd3bSSimon Glass const char *dev_read_name(struct udevice *dev)
13947a0fd3bSSimon Glass {
14047a0fd3bSSimon Glass 	return ofnode_get_name(dev_ofnode(dev));
14147a0fd3bSSimon Glass }
14247a0fd3bSSimon Glass 
dev_read_stringlist_search(struct udevice * dev,const char * property,const char * string)14347a0fd3bSSimon Glass int dev_read_stringlist_search(struct udevice *dev, const char *property,
14447a0fd3bSSimon Glass 			       const char *string)
14547a0fd3bSSimon Glass {
14647a0fd3bSSimon Glass 	return ofnode_stringlist_search(dev_ofnode(dev), property, string);
14747a0fd3bSSimon Glass }
14847a0fd3bSSimon Glass 
dev_read_string_index(struct udevice * dev,const char * propname,int index,const char ** outp)149b5a144a5SJean-Jacques Hiblot int dev_read_string_index(struct udevice *dev, const char *propname, int index,
150b5a144a5SJean-Jacques Hiblot 			  const char **outp)
151b5a144a5SJean-Jacques Hiblot {
152b5a144a5SJean-Jacques Hiblot 	return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp);
153b5a144a5SJean-Jacques Hiblot }
154b5a144a5SJean-Jacques Hiblot 
dev_read_string_count(struct udevice * dev,const char * propname)155b5a144a5SJean-Jacques Hiblot int dev_read_string_count(struct udevice *dev, const char *propname)
156b5a144a5SJean-Jacques Hiblot {
157b5a144a5SJean-Jacques Hiblot 	return ofnode_read_string_count(dev_ofnode(dev), propname);
158b5a144a5SJean-Jacques Hiblot }
159b5a144a5SJean-Jacques Hiblot 
dev_read_phandle_with_args(struct udevice * dev,const char * list_name,const char * cells_name,int cell_count,int index,struct ofnode_phandle_args * out_args)16047a0fd3bSSimon Glass int dev_read_phandle_with_args(struct udevice *dev, const char *list_name,
16147a0fd3bSSimon Glass 			       const char *cells_name, int cell_count,
16283a462a5SMario Six 			       int index, struct ofnode_phandle_args *out_args)
16347a0fd3bSSimon Glass {
16447a0fd3bSSimon Glass 	return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
16547a0fd3bSSimon Glass 					      cells_name, cell_count, index,
16647a0fd3bSSimon Glass 					      out_args);
16747a0fd3bSSimon Glass }
16847a0fd3bSSimon Glass 
dev_count_phandle_with_args(struct udevice * dev,const char * list_name,const char * cells_name)169ea8cd652SPatrice Chotard int dev_count_phandle_with_args(struct udevice *dev, const char *list_name,
170ea8cd652SPatrice Chotard 				const char *cells_name)
171ea8cd652SPatrice Chotard {
172ea8cd652SPatrice Chotard 	return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
173ea8cd652SPatrice Chotard 					      cells_name);
174ea8cd652SPatrice Chotard }
175ea8cd652SPatrice Chotard 
dev_read_addr_cells(struct udevice * dev)17647a0fd3bSSimon Glass int dev_read_addr_cells(struct udevice *dev)
17747a0fd3bSSimon Glass {
17847a0fd3bSSimon Glass 	return ofnode_read_addr_cells(dev_ofnode(dev));
17947a0fd3bSSimon Glass }
18047a0fd3bSSimon Glass 
dev_read_size_cells(struct udevice * dev)18147a0fd3bSSimon Glass int dev_read_size_cells(struct udevice *dev)
18247a0fd3bSSimon Glass {
18347a0fd3bSSimon Glass 	return ofnode_read_size_cells(dev_ofnode(dev));
18447a0fd3bSSimon Glass }
18547a0fd3bSSimon Glass 
dev_read_simple_addr_cells(struct udevice * dev)186878d68c0SSimon Glass int dev_read_simple_addr_cells(struct udevice *dev)
187878d68c0SSimon Glass {
188878d68c0SSimon Glass 	return ofnode_read_simple_addr_cells(dev_ofnode(dev));
189878d68c0SSimon Glass }
190878d68c0SSimon Glass 
dev_read_simple_size_cells(struct udevice * dev)191878d68c0SSimon Glass int dev_read_simple_size_cells(struct udevice *dev)
192878d68c0SSimon Glass {
193878d68c0SSimon Glass 	return ofnode_read_simple_size_cells(dev_ofnode(dev));
194878d68c0SSimon Glass }
195878d68c0SSimon Glass 
dev_read_phandle(struct udevice * dev)19647a0fd3bSSimon Glass int dev_read_phandle(struct udevice *dev)
19747a0fd3bSSimon Glass {
19847a0fd3bSSimon Glass 	ofnode node = dev_ofnode(dev);
19947a0fd3bSSimon Glass 
20047a0fd3bSSimon Glass 	if (ofnode_is_np(node))
20147a0fd3bSSimon Glass 		return ofnode_to_np(node)->phandle;
20247a0fd3bSSimon Glass 	else
20347a0fd3bSSimon Glass 		return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node));
20447a0fd3bSSimon Glass }
20547a0fd3bSSimon Glass 
dev_read_prop(struct udevice * dev,const char * propname,int * lenp)206fd73621cSMasahiro Yamada const void *dev_read_prop(struct udevice *dev, const char *propname, int *lenp)
20747a0fd3bSSimon Glass {
20861e51babSMasahiro Yamada 	return ofnode_get_property(dev_ofnode(dev), propname, lenp);
20947a0fd3bSSimon Glass }
21047a0fd3bSSimon Glass 
dev_read_alias_seq(struct udevice * dev,int * devnump)21147a0fd3bSSimon Glass int dev_read_alias_seq(struct udevice *dev, int *devnump)
21247a0fd3bSSimon Glass {
21347a0fd3bSSimon Glass 	ofnode node = dev_ofnode(dev);
21447a0fd3bSSimon Glass 	const char *uc_name = dev->uclass->uc_drv->name;
21547a0fd3bSSimon Glass 	int ret;
21647a0fd3bSSimon Glass 
21747a0fd3bSSimon Glass 	if (ofnode_is_np(node)) {
21847a0fd3bSSimon Glass 		ret = of_alias_get_id(ofnode_to_np(node), uc_name);
21947a0fd3bSSimon Glass 		if (ret >= 0)
22047a0fd3bSSimon Glass 			*devnump = ret;
22147a0fd3bSSimon Glass 	} else {
22247a0fd3bSSimon Glass 		ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
22347a0fd3bSSimon Glass 					   ofnode_to_offset(node), devnump);
22447a0fd3bSSimon Glass 	}
22547a0fd3bSSimon Glass 
22647a0fd3bSSimon Glass 	return ret;
22747a0fd3bSSimon Glass }
22847a0fd3bSSimon Glass 
dev_read_u32_array(struct udevice * dev,const char * propname,u32 * out_values,size_t sz)22947a0fd3bSSimon Glass int dev_read_u32_array(struct udevice *dev, const char *propname,
23047a0fd3bSSimon Glass 		       u32 *out_values, size_t sz)
23147a0fd3bSSimon Glass {
23247a0fd3bSSimon Glass 	return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz);
23347a0fd3bSSimon Glass }
23447a0fd3bSSimon Glass 
dev_read_u8_array_ptr(struct udevice * dev,const char * propname,size_t sz)23547a0fd3bSSimon Glass const uint8_t *dev_read_u8_array_ptr(struct udevice *dev, const char *propname,
23647a0fd3bSSimon Glass 				     size_t sz)
23747a0fd3bSSimon Glass {
23847a0fd3bSSimon Glass 	return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz);
23947a0fd3bSSimon Glass }
240f7d6fcf7SSimon Glass 
dev_read_enabled(struct udevice * dev)241f7d6fcf7SSimon Glass int dev_read_enabled(struct udevice *dev)
242f7d6fcf7SSimon Glass {
243f7d6fcf7SSimon Glass 	ofnode node = dev_ofnode(dev);
244f7d6fcf7SSimon Glass 
245f7d6fcf7SSimon Glass 	if (ofnode_is_np(node))
246f7d6fcf7SSimon Glass 		return of_device_is_available(ofnode_to_np(node));
247f7d6fcf7SSimon Glass 	else
248f7d6fcf7SSimon Glass 		return fdtdec_get_is_enabled(gd->fdt_blob,
249f7d6fcf7SSimon Glass 					     ofnode_to_offset(node));
250f7d6fcf7SSimon Glass }
251dcf98852SSimon Glass 
dev_read_resource(struct udevice * dev,uint index,struct resource * res)252dcf98852SSimon Glass int dev_read_resource(struct udevice *dev, uint index, struct resource *res)
253dcf98852SSimon Glass {
254dcf98852SSimon Glass 	return ofnode_read_resource(dev_ofnode(dev), index, res);
255dcf98852SSimon Glass }
2567b8b47bdSMasahiro Yamada 
dev_read_resource_byname(struct udevice * dev,const char * name,struct resource * res)2577b8b47bdSMasahiro Yamada int dev_read_resource_byname(struct udevice *dev, const char *name,
2587b8b47bdSMasahiro Yamada 			     struct resource *res)
2597b8b47bdSMasahiro Yamada {
2607b8b47bdSMasahiro Yamada 	return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
2617b8b47bdSMasahiro Yamada }
262147c6074SMario Six 
dev_translate_address(struct udevice * dev,const fdt32_t * in_addr)263147c6074SMario Six u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr)
264147c6074SMario Six {
265147c6074SMario Six 	return ofnode_translate_address(dev_ofnode(dev), in_addr);
266147c6074SMario Six }
267*83e4c7e9SMichal Simek 
dev_read_alias_highest_id(const char * stem)268*83e4c7e9SMichal Simek int dev_read_alias_highest_id(const char *stem)
269*83e4c7e9SMichal Simek {
270*83e4c7e9SMichal Simek 	if (of_live_active())
271*83e4c7e9SMichal Simek 		return of_alias_get_highest_id(stem);
272*83e4c7e9SMichal Simek 
273*83e4c7e9SMichal Simek 	return fdtdec_get_alias_highest_id(gd->fdt_blob, stem);
274*83e4c7e9SMichal Simek }
275