xref: /rk3399_rockchip-uboot/drivers/core/read.c (revision a9bd1c7342d0a84e6b647c88ad85fecea35febaa)
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>
101abc22ccSSimon Glass #include <mapmem.h>
1147a0fd3bSSimon Glass #include <dm/of_access.h>
1247a0fd3bSSimon Glass 
1347a0fd3bSSimon Glass int dev_read_u32_default(struct udevice *dev, const char *propname, int def)
1447a0fd3bSSimon Glass {
1547a0fd3bSSimon Glass 	return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
1647a0fd3bSSimon Glass }
1747a0fd3bSSimon Glass 
18270d4d86SJoseph Chen int dev_read_s32_default(struct udevice *dev, const char *propname, int def)
19270d4d86SJoseph Chen {
20270d4d86SJoseph Chen 	return ofnode_read_s32_default(dev_ofnode(dev), propname, def);
21270d4d86SJoseph Chen }
22270d4d86SJoseph Chen 
2347a0fd3bSSimon Glass const char *dev_read_string(struct udevice *dev, const char *propname)
2447a0fd3bSSimon Glass {
2547a0fd3bSSimon Glass 	return ofnode_read_string(dev_ofnode(dev), propname);
2647a0fd3bSSimon Glass }
2747a0fd3bSSimon Glass 
2847a0fd3bSSimon Glass bool dev_read_bool(struct udevice *dev, const char *propname)
2947a0fd3bSSimon Glass {
3047a0fd3bSSimon Glass 	return ofnode_read_bool(dev_ofnode(dev), propname);
3147a0fd3bSSimon Glass }
3247a0fd3bSSimon Glass 
3347a0fd3bSSimon Glass ofnode dev_read_subnode(struct udevice *dev, const char *subnode_name)
3447a0fd3bSSimon Glass {
3547a0fd3bSSimon Glass 	return ofnode_find_subnode(dev_ofnode(dev), subnode_name);
3647a0fd3bSSimon Glass }
3747a0fd3bSSimon Glass 
3847a0fd3bSSimon Glass ofnode dev_read_first_subnode(struct udevice *dev)
3947a0fd3bSSimon Glass {
4047a0fd3bSSimon Glass 	return ofnode_first_subnode(dev_ofnode(dev));
4147a0fd3bSSimon Glass }
4247a0fd3bSSimon Glass 
4347a0fd3bSSimon Glass ofnode dev_read_next_subnode(ofnode node)
4447a0fd3bSSimon Glass {
4547a0fd3bSSimon Glass 	return ofnode_next_subnode(node);
4647a0fd3bSSimon Glass }
4747a0fd3bSSimon Glass 
4847a0fd3bSSimon Glass int dev_read_size(struct udevice *dev, const char *propname)
4947a0fd3bSSimon Glass {
5047a0fd3bSSimon Glass 	return ofnode_read_size(dev_ofnode(dev), propname);
5147a0fd3bSSimon Glass }
5247a0fd3bSSimon Glass 
5347a0fd3bSSimon Glass fdt_addr_t dev_read_addr_index(struct udevice *dev, int index)
5447a0fd3bSSimon Glass {
5547a0fd3bSSimon Glass 	if (ofnode_is_np(dev_ofnode(dev)))
5647a0fd3bSSimon Glass 		return ofnode_get_addr_index(dev_ofnode(dev), index);
5747a0fd3bSSimon Glass 	else
5847a0fd3bSSimon Glass 		return devfdt_get_addr_index(dev, index);
5947a0fd3bSSimon Glass }
6047a0fd3bSSimon Glass 
6147a0fd3bSSimon Glass fdt_addr_t dev_read_addr(struct udevice *dev)
6247a0fd3bSSimon Glass {
6347a0fd3bSSimon Glass 	return dev_read_addr_index(dev, 0);
6447a0fd3bSSimon Glass }
6547a0fd3bSSimon Glass 
6618a0c4a6SPhilipp Tomsich void *dev_read_addr_ptr(struct udevice *dev)
6718a0c4a6SPhilipp Tomsich {
6818a0c4a6SPhilipp Tomsich 	fdt_addr_t addr = dev_read_addr(dev);
6918a0c4a6SPhilipp Tomsich 
701abc22ccSSimon Glass 	return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0);
7118a0c4a6SPhilipp Tomsich }
7218a0c4a6SPhilipp Tomsich 
7347a0fd3bSSimon Glass fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *property,
7447a0fd3bSSimon Glass 				fdt_size_t *sizep)
7547a0fd3bSSimon Glass {
7647a0fd3bSSimon Glass 	return ofnode_get_addr_size(dev_ofnode(dev), property, sizep);
7747a0fd3bSSimon Glass }
7847a0fd3bSSimon Glass 
7947a0fd3bSSimon Glass const char *dev_read_name(struct udevice *dev)
8047a0fd3bSSimon Glass {
81b283d2aeSKever Yang 	if (!dev_of_valid(dev))
82b283d2aeSKever Yang 		return NULL;
83b283d2aeSKever Yang 
8447a0fd3bSSimon Glass 	return ofnode_get_name(dev_ofnode(dev));
8547a0fd3bSSimon Glass }
8647a0fd3bSSimon Glass 
8747a0fd3bSSimon Glass int dev_read_stringlist_search(struct udevice *dev, const char *property,
8847a0fd3bSSimon Glass 			  const char *string)
8947a0fd3bSSimon Glass {
9047a0fd3bSSimon Glass 	return ofnode_stringlist_search(dev_ofnode(dev), property, string);
9147a0fd3bSSimon Glass }
9247a0fd3bSSimon Glass 
9357a9c706SJean-Jacques Hiblot int dev_read_string_index(struct udevice *dev, const char *propname, int index,
9457a9c706SJean-Jacques Hiblot 			  const char **outp)
9557a9c706SJean-Jacques Hiblot {
9657a9c706SJean-Jacques Hiblot 	return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp);
9757a9c706SJean-Jacques Hiblot }
9857a9c706SJean-Jacques Hiblot 
9957a9c706SJean-Jacques Hiblot int dev_read_string_count(struct udevice *dev, const char *propname)
10057a9c706SJean-Jacques Hiblot {
10157a9c706SJean-Jacques Hiblot 	return ofnode_read_string_count(dev_ofnode(dev), propname);
10257a9c706SJean-Jacques Hiblot }
10357a9c706SJean-Jacques Hiblot 
10447a0fd3bSSimon Glass int dev_read_phandle_with_args(struct udevice *dev, const char *list_name,
10547a0fd3bSSimon Glass 				const char *cells_name, int cell_count,
10647a0fd3bSSimon Glass 				int index,
10747a0fd3bSSimon Glass 				struct ofnode_phandle_args *out_args)
10847a0fd3bSSimon Glass {
10947a0fd3bSSimon Glass 	return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
11047a0fd3bSSimon Glass 					      cells_name, cell_count, index,
11147a0fd3bSSimon Glass 					      out_args);
11247a0fd3bSSimon Glass }
11347a0fd3bSSimon Glass 
114d5b5cd14SKever Yang int dev_count_phandle_with_args(struct udevice *dev,
115d5b5cd14SKever Yang 		const char *list_name, const char *cells_name)
116d5b5cd14SKever Yang {
117d5b5cd14SKever Yang 	return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
118d5b5cd14SKever Yang 					      cells_name);
119d5b5cd14SKever Yang }
120d5b5cd14SKever Yang 
121d5b5cd14SKever Yang 
12247a0fd3bSSimon Glass int dev_read_addr_cells(struct udevice *dev)
12347a0fd3bSSimon Glass {
12447a0fd3bSSimon Glass 	return ofnode_read_addr_cells(dev_ofnode(dev));
12547a0fd3bSSimon Glass }
12647a0fd3bSSimon Glass 
12747a0fd3bSSimon Glass int dev_read_size_cells(struct udevice *dev)
12847a0fd3bSSimon Glass {
12947a0fd3bSSimon Glass 	return ofnode_read_size_cells(dev_ofnode(dev));
13047a0fd3bSSimon Glass }
13147a0fd3bSSimon Glass 
132878d68c0SSimon Glass int dev_read_simple_addr_cells(struct udevice *dev)
133878d68c0SSimon Glass {
134878d68c0SSimon Glass 	return ofnode_read_simple_addr_cells(dev_ofnode(dev));
135878d68c0SSimon Glass }
136878d68c0SSimon Glass 
137878d68c0SSimon Glass int dev_read_simple_size_cells(struct udevice *dev)
138878d68c0SSimon Glass {
139878d68c0SSimon Glass 	return ofnode_read_simple_size_cells(dev_ofnode(dev));
140878d68c0SSimon Glass }
141878d68c0SSimon Glass 
14247a0fd3bSSimon Glass int dev_read_phandle(struct udevice *dev)
14347a0fd3bSSimon Glass {
14447a0fd3bSSimon Glass 	ofnode node = dev_ofnode(dev);
14547a0fd3bSSimon Glass 
14647a0fd3bSSimon Glass 	if (ofnode_is_np(node))
14747a0fd3bSSimon Glass 		return ofnode_to_np(node)->phandle;
14847a0fd3bSSimon Glass 	else
14947a0fd3bSSimon Glass 		return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node));
15047a0fd3bSSimon Glass }
15147a0fd3bSSimon Glass 
152fd73621cSMasahiro Yamada const void *dev_read_prop(struct udevice *dev, const char *propname, int *lenp)
15347a0fd3bSSimon Glass {
15461e51babSMasahiro Yamada 	return ofnode_get_property(dev_ofnode(dev), propname, lenp);
15547a0fd3bSSimon Glass }
15647a0fd3bSSimon Glass 
15747a0fd3bSSimon Glass int dev_read_alias_seq(struct udevice *dev, int *devnump)
15847a0fd3bSSimon Glass {
15947a0fd3bSSimon Glass 	ofnode node = dev_ofnode(dev);
16047a0fd3bSSimon Glass 	const char *uc_name = dev->uclass->uc_drv->name;
16147a0fd3bSSimon Glass 	int ret;
16247a0fd3bSSimon Glass 
16347a0fd3bSSimon Glass 	if (ofnode_is_np(node)) {
16447a0fd3bSSimon Glass 		ret = of_alias_get_id(ofnode_to_np(node), uc_name);
16547a0fd3bSSimon Glass 		if (ret >= 0)
16647a0fd3bSSimon Glass 			*devnump = ret;
16747a0fd3bSSimon Glass 	} else {
16847a0fd3bSSimon Glass 		ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
16947a0fd3bSSimon Glass 					   ofnode_to_offset(node), devnump);
17047a0fd3bSSimon Glass 	}
17147a0fd3bSSimon Glass 
17247a0fd3bSSimon Glass 	return ret;
17347a0fd3bSSimon Glass }
17447a0fd3bSSimon Glass 
17547a0fd3bSSimon Glass int dev_read_u32_array(struct udevice *dev, const char *propname,
17647a0fd3bSSimon Glass 		       u32 *out_values, size_t sz)
17747a0fd3bSSimon Glass {
178b283d2aeSKever Yang 	if (!dev_of_valid(dev))
179b283d2aeSKever Yang 		return -EINVAL;
18047a0fd3bSSimon Glass 	return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz);
18147a0fd3bSSimon Glass }
18247a0fd3bSSimon Glass 
18304539b46SJoseph Chen int dev_write_u32_array(struct udevice *dev, const char *propname,
18404539b46SJoseph Chen 			u32 *values, size_t sz)
18504539b46SJoseph Chen {
18604539b46SJoseph Chen 	if (!dev_of_valid(dev))
18704539b46SJoseph Chen 		return -EINVAL;
18804539b46SJoseph Chen 	return ofnode_write_u32_array(dev_ofnode(dev), propname, values, sz);
18904539b46SJoseph Chen }
19004539b46SJoseph Chen 
19147a0fd3bSSimon Glass const uint8_t *dev_read_u8_array_ptr(struct udevice *dev, const char *propname,
19247a0fd3bSSimon Glass 				     size_t sz)
19347a0fd3bSSimon Glass {
19447a0fd3bSSimon Glass 	return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz);
19547a0fd3bSSimon Glass }
196f7d6fcf7SSimon Glass 
197f7d6fcf7SSimon Glass int dev_read_enabled(struct udevice *dev)
198f7d6fcf7SSimon Glass {
199f7d6fcf7SSimon Glass 	ofnode node = dev_ofnode(dev);
200f7d6fcf7SSimon Glass 
201f7d6fcf7SSimon Glass 	if (ofnode_is_np(node))
202f7d6fcf7SSimon Glass 		return of_device_is_available(ofnode_to_np(node));
203f7d6fcf7SSimon Glass 	else
204f7d6fcf7SSimon Glass 		return fdtdec_get_is_enabled(gd->fdt_blob,
205f7d6fcf7SSimon Glass 					     ofnode_to_offset(node));
206f7d6fcf7SSimon Glass }
207dcf98852SSimon Glass 
208dcf98852SSimon Glass int dev_read_resource(struct udevice *dev, uint index, struct resource *res)
209dcf98852SSimon Glass {
210dcf98852SSimon Glass 	return ofnode_read_resource(dev_ofnode(dev), index, res);
211dcf98852SSimon Glass }
2127b8b47bdSMasahiro Yamada 
2137b8b47bdSMasahiro Yamada int dev_read_resource_byname(struct udevice *dev, const char *name,
2147b8b47bdSMasahiro Yamada 			     struct resource *res)
2157b8b47bdSMasahiro Yamada {
2167b8b47bdSMasahiro Yamada 	return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
2177b8b47bdSMasahiro Yamada }
218*a9bd1c73SMario Six 
219*a9bd1c73SMario Six u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr)
220*a9bd1c73SMario Six {
221*a9bd1c73SMario Six 	return ofnode_translate_address(dev_ofnode(dev), in_addr);
222*a9bd1c73SMario Six }
223