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>
11*8f7de514SShawn Lin #include <asm/io.h>
1247a0fd3bSSimon Glass #include <dm/of_access.h>
1347a0fd3bSSimon Glass
dev_read_u32_default(struct udevice * dev,const char * propname,int def)1447a0fd3bSSimon Glass int dev_read_u32_default(struct udevice *dev, const char *propname, int def)
1547a0fd3bSSimon Glass {
1647a0fd3bSSimon Glass return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
1747a0fd3bSSimon Glass }
1847a0fd3bSSimon Glass
dev_read_s32_default(struct udevice * dev,const char * propname,int def)19270d4d86SJoseph Chen int dev_read_s32_default(struct udevice *dev, const char *propname, int def)
20270d4d86SJoseph Chen {
21270d4d86SJoseph Chen return ofnode_read_s32_default(dev_ofnode(dev), propname, def);
22270d4d86SJoseph Chen }
23270d4d86SJoseph Chen
dev_read_string(struct udevice * dev,const char * propname)2447a0fd3bSSimon Glass const char *dev_read_string(struct udevice *dev, const char *propname)
2547a0fd3bSSimon Glass {
2647a0fd3bSSimon Glass return ofnode_read_string(dev_ofnode(dev), propname);
2747a0fd3bSSimon Glass }
2847a0fd3bSSimon Glass
dev_read_bool(struct udevice * dev,const char * propname)2947a0fd3bSSimon Glass bool dev_read_bool(struct udevice *dev, const char *propname)
3047a0fd3bSSimon Glass {
3147a0fd3bSSimon Glass return ofnode_read_bool(dev_ofnode(dev), propname);
3247a0fd3bSSimon Glass }
3347a0fd3bSSimon Glass
dev_read_subnode(struct udevice * dev,const char * subnode_name)3447a0fd3bSSimon Glass ofnode dev_read_subnode(struct udevice *dev, const char *subnode_name)
3547a0fd3bSSimon Glass {
3647a0fd3bSSimon Glass return ofnode_find_subnode(dev_ofnode(dev), subnode_name);
3747a0fd3bSSimon Glass }
3847a0fd3bSSimon Glass
dev_read_first_subnode(struct udevice * dev)3947a0fd3bSSimon Glass ofnode dev_read_first_subnode(struct udevice *dev)
4047a0fd3bSSimon Glass {
4147a0fd3bSSimon Glass return ofnode_first_subnode(dev_ofnode(dev));
4247a0fd3bSSimon Glass }
4347a0fd3bSSimon Glass
dev_read_next_subnode(ofnode node)4447a0fd3bSSimon Glass ofnode dev_read_next_subnode(ofnode node)
4547a0fd3bSSimon Glass {
4647a0fd3bSSimon Glass return ofnode_next_subnode(node);
4747a0fd3bSSimon Glass }
4847a0fd3bSSimon Glass
dev_read_size(struct udevice * dev,const char * propname)4947a0fd3bSSimon Glass int dev_read_size(struct udevice *dev, const char *propname)
5047a0fd3bSSimon Glass {
5147a0fd3bSSimon Glass return ofnode_read_size(dev_ofnode(dev), propname);
5247a0fd3bSSimon Glass }
5347a0fd3bSSimon Glass
dev_read_addr_index(struct udevice * dev,int index)5447a0fd3bSSimon Glass fdt_addr_t dev_read_addr_index(struct udevice *dev, int index)
5547a0fd3bSSimon Glass {
5647a0fd3bSSimon Glass if (ofnode_is_np(dev_ofnode(dev)))
5747a0fd3bSSimon Glass return ofnode_get_addr_index(dev_ofnode(dev), index);
5847a0fd3bSSimon Glass else
5947a0fd3bSSimon Glass return devfdt_get_addr_index(dev, index);
6047a0fd3bSSimon Glass }
6147a0fd3bSSimon Glass
dev_read_addr(struct udevice * dev)6247a0fd3bSSimon Glass fdt_addr_t dev_read_addr(struct udevice *dev)
6347a0fd3bSSimon Glass {
6447a0fd3bSSimon Glass return dev_read_addr_index(dev, 0);
6547a0fd3bSSimon Glass }
6647a0fd3bSSimon Glass
dev_remap_addr_index(struct udevice * dev,int index)67*8f7de514SShawn Lin void *dev_remap_addr_index(struct udevice *dev, int index)
68*8f7de514SShawn Lin {
69*8f7de514SShawn Lin fdt_addr_t addr = dev_read_addr_index(dev, index);
70*8f7de514SShawn Lin
71*8f7de514SShawn Lin if (addr == FDT_ADDR_T_NONE)
72*8f7de514SShawn Lin return NULL;
73*8f7de514SShawn Lin
74*8f7de514SShawn Lin return map_physmem(addr, 0, MAP_NOCACHE);
75*8f7de514SShawn Lin }
76*8f7de514SShawn Lin
dev_read_addr_ptr(struct udevice * dev)7718a0c4a6SPhilipp Tomsich void *dev_read_addr_ptr(struct udevice *dev)
7818a0c4a6SPhilipp Tomsich {
7918a0c4a6SPhilipp Tomsich fdt_addr_t addr = dev_read_addr(dev);
8018a0c4a6SPhilipp Tomsich
811abc22ccSSimon Glass return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0);
8218a0c4a6SPhilipp Tomsich }
8318a0c4a6SPhilipp Tomsich
dev_read_addr_size(struct udevice * dev,const char * property,fdt_size_t * sizep)8447a0fd3bSSimon Glass fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *property,
8547a0fd3bSSimon Glass fdt_size_t *sizep)
8647a0fd3bSSimon Glass {
8747a0fd3bSSimon Glass return ofnode_get_addr_size(dev_ofnode(dev), property, sizep);
8847a0fd3bSSimon Glass }
8947a0fd3bSSimon Glass
dev_read_name(struct udevice * dev)9047a0fd3bSSimon Glass const char *dev_read_name(struct udevice *dev)
9147a0fd3bSSimon Glass {
92b283d2aeSKever Yang if (!dev_of_valid(dev))
93b283d2aeSKever Yang return NULL;
94b283d2aeSKever Yang
9547a0fd3bSSimon Glass return ofnode_get_name(dev_ofnode(dev));
9647a0fd3bSSimon Glass }
9747a0fd3bSSimon Glass
dev_read_stringlist_search(struct udevice * dev,const char * property,const char * string)9847a0fd3bSSimon Glass int dev_read_stringlist_search(struct udevice *dev, const char *property,
9947a0fd3bSSimon Glass const char *string)
10047a0fd3bSSimon Glass {
10147a0fd3bSSimon Glass return ofnode_stringlist_search(dev_ofnode(dev), property, string);
10247a0fd3bSSimon Glass }
10347a0fd3bSSimon Glass
dev_read_string_index(struct udevice * dev,const char * propname,int index,const char ** outp)10457a9c706SJean-Jacques Hiblot int dev_read_string_index(struct udevice *dev, const char *propname, int index,
10557a9c706SJean-Jacques Hiblot const char **outp)
10657a9c706SJean-Jacques Hiblot {
10757a9c706SJean-Jacques Hiblot return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp);
10857a9c706SJean-Jacques Hiblot }
10957a9c706SJean-Jacques Hiblot
dev_read_string_count(struct udevice * dev,const char * propname)11057a9c706SJean-Jacques Hiblot int dev_read_string_count(struct udevice *dev, const char *propname)
11157a9c706SJean-Jacques Hiblot {
11257a9c706SJean-Jacques Hiblot return ofnode_read_string_count(dev_ofnode(dev), propname);
11357a9c706SJean-Jacques Hiblot }
11457a9c706SJean-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)11547a0fd3bSSimon Glass int dev_read_phandle_with_args(struct udevice *dev, const char *list_name,
11647a0fd3bSSimon Glass const char *cells_name, int cell_count,
11747a0fd3bSSimon Glass int index,
11847a0fd3bSSimon Glass struct ofnode_phandle_args *out_args)
11947a0fd3bSSimon Glass {
12047a0fd3bSSimon Glass return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
12147a0fd3bSSimon Glass cells_name, cell_count, index,
12247a0fd3bSSimon Glass out_args);
12347a0fd3bSSimon Glass }
12447a0fd3bSSimon Glass
dev_count_phandle_with_args(struct udevice * dev,const char * list_name,const char * cells_name)125d5b5cd14SKever Yang int dev_count_phandle_with_args(struct udevice *dev,
126d5b5cd14SKever Yang const char *list_name, const char *cells_name)
127d5b5cd14SKever Yang {
128d5b5cd14SKever Yang return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
129d5b5cd14SKever Yang cells_name);
130d5b5cd14SKever Yang }
131d5b5cd14SKever Yang
132d5b5cd14SKever Yang
dev_read_addr_cells(struct udevice * dev)13347a0fd3bSSimon Glass int dev_read_addr_cells(struct udevice *dev)
13447a0fd3bSSimon Glass {
13547a0fd3bSSimon Glass return ofnode_read_addr_cells(dev_ofnode(dev));
13647a0fd3bSSimon Glass }
13747a0fd3bSSimon Glass
dev_read_size_cells(struct udevice * dev)13847a0fd3bSSimon Glass int dev_read_size_cells(struct udevice *dev)
13947a0fd3bSSimon Glass {
14047a0fd3bSSimon Glass return ofnode_read_size_cells(dev_ofnode(dev));
14147a0fd3bSSimon Glass }
14247a0fd3bSSimon Glass
dev_read_simple_addr_cells(struct udevice * dev)143878d68c0SSimon Glass int dev_read_simple_addr_cells(struct udevice *dev)
144878d68c0SSimon Glass {
145878d68c0SSimon Glass return ofnode_read_simple_addr_cells(dev_ofnode(dev));
146878d68c0SSimon Glass }
147878d68c0SSimon Glass
dev_read_simple_size_cells(struct udevice * dev)148878d68c0SSimon Glass int dev_read_simple_size_cells(struct udevice *dev)
149878d68c0SSimon Glass {
150878d68c0SSimon Glass return ofnode_read_simple_size_cells(dev_ofnode(dev));
151878d68c0SSimon Glass }
152878d68c0SSimon Glass
dev_read_phandle(struct udevice * dev)15347a0fd3bSSimon Glass int dev_read_phandle(struct udevice *dev)
15447a0fd3bSSimon Glass {
15547a0fd3bSSimon Glass ofnode node = dev_ofnode(dev);
15647a0fd3bSSimon Glass
15747a0fd3bSSimon Glass if (ofnode_is_np(node))
15847a0fd3bSSimon Glass return ofnode_to_np(node)->phandle;
15947a0fd3bSSimon Glass else
16047a0fd3bSSimon Glass return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node));
16147a0fd3bSSimon Glass }
16247a0fd3bSSimon Glass
dev_read_prop(struct udevice * dev,const char * propname,int * lenp)163fd73621cSMasahiro Yamada const void *dev_read_prop(struct udevice *dev, const char *propname, int *lenp)
16447a0fd3bSSimon Glass {
16561e51babSMasahiro Yamada return ofnode_get_property(dev_ofnode(dev), propname, lenp);
16647a0fd3bSSimon Glass }
16747a0fd3bSSimon Glass
dev_read_first_prop(struct udevice * dev,struct ofprop * prop)1683cf48410SPatrick Delaunay int dev_read_first_prop(struct udevice *dev, struct ofprop *prop)
1693cf48410SPatrick Delaunay {
1703cf48410SPatrick Delaunay return ofnode_get_first_property(dev_ofnode(dev), prop);
1713cf48410SPatrick Delaunay }
1723cf48410SPatrick Delaunay
dev_read_next_prop(struct ofprop * prop)1733cf48410SPatrick Delaunay int dev_read_next_prop(struct ofprop *prop)
1743cf48410SPatrick Delaunay {
1753cf48410SPatrick Delaunay return ofnode_get_next_property(prop);
1763cf48410SPatrick Delaunay }
1773cf48410SPatrick Delaunay
dev_read_prop_by_prop(struct ofprop * prop,const char ** propname,int * lenp)1783cf48410SPatrick Delaunay const void *dev_read_prop_by_prop(struct ofprop *prop,
1793cf48410SPatrick Delaunay const char **propname, int *lenp)
1803cf48410SPatrick Delaunay {
1813cf48410SPatrick Delaunay return ofnode_get_property_by_prop(prop, propname, lenp);
1823cf48410SPatrick Delaunay }
1833cf48410SPatrick Delaunay
dev_read_alias_seq(struct udevice * dev,int * devnump)18447a0fd3bSSimon Glass int dev_read_alias_seq(struct udevice *dev, int *devnump)
18547a0fd3bSSimon Glass {
18647a0fd3bSSimon Glass ofnode node = dev_ofnode(dev);
18747a0fd3bSSimon Glass const char *uc_name = dev->uclass->uc_drv->name;
18847a0fd3bSSimon Glass int ret;
18947a0fd3bSSimon Glass
19047a0fd3bSSimon Glass if (ofnode_is_np(node)) {
19147a0fd3bSSimon Glass ret = of_alias_get_id(ofnode_to_np(node), uc_name);
19247a0fd3bSSimon Glass if (ret >= 0)
19347a0fd3bSSimon Glass *devnump = ret;
19447a0fd3bSSimon Glass } else {
19547a0fd3bSSimon Glass ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
19647a0fd3bSSimon Glass ofnode_to_offset(node), devnump);
19747a0fd3bSSimon Glass }
19847a0fd3bSSimon Glass
19947a0fd3bSSimon Glass return ret;
20047a0fd3bSSimon Glass }
20147a0fd3bSSimon Glass
dev_read_u32_array(struct udevice * dev,const char * propname,u32 * out_values,size_t sz)20247a0fd3bSSimon Glass int dev_read_u32_array(struct udevice *dev, const char *propname,
20347a0fd3bSSimon Glass u32 *out_values, size_t sz)
20447a0fd3bSSimon Glass {
205b283d2aeSKever Yang if (!dev_of_valid(dev))
206b283d2aeSKever Yang return -EINVAL;
20747a0fd3bSSimon Glass return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz);
20847a0fd3bSSimon Glass }
20947a0fd3bSSimon Glass
dev_write_u32_array(struct udevice * dev,const char * propname,u32 * values,size_t sz)21004539b46SJoseph Chen int dev_write_u32_array(struct udevice *dev, const char *propname,
21104539b46SJoseph Chen u32 *values, size_t sz)
21204539b46SJoseph Chen {
21304539b46SJoseph Chen if (!dev_of_valid(dev))
21404539b46SJoseph Chen return -EINVAL;
21504539b46SJoseph Chen return ofnode_write_u32_array(dev_ofnode(dev), propname, values, sz);
21604539b46SJoseph Chen }
21704539b46SJoseph Chen
dev_read_u8_array_ptr(struct udevice * dev,const char * propname,size_t sz)21847a0fd3bSSimon Glass const uint8_t *dev_read_u8_array_ptr(struct udevice *dev, const char *propname,
21947a0fd3bSSimon Glass size_t sz)
22047a0fd3bSSimon Glass {
22147a0fd3bSSimon Glass return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz);
22247a0fd3bSSimon Glass }
223f7d6fcf7SSimon Glass
dev_read_enabled(struct udevice * dev)224f7d6fcf7SSimon Glass int dev_read_enabled(struct udevice *dev)
225f7d6fcf7SSimon Glass {
226f7d6fcf7SSimon Glass ofnode node = dev_ofnode(dev);
227f7d6fcf7SSimon Glass
228f7d6fcf7SSimon Glass if (ofnode_is_np(node))
229f7d6fcf7SSimon Glass return of_device_is_available(ofnode_to_np(node));
230f7d6fcf7SSimon Glass else
231f7d6fcf7SSimon Glass return fdtdec_get_is_enabled(gd->fdt_blob,
232f7d6fcf7SSimon Glass ofnode_to_offset(node));
233f7d6fcf7SSimon Glass }
234dcf98852SSimon Glass
dev_read_resource(struct udevice * dev,uint index,struct resource * res)235dcf98852SSimon Glass int dev_read_resource(struct udevice *dev, uint index, struct resource *res)
236dcf98852SSimon Glass {
237dcf98852SSimon Glass return ofnode_read_resource(dev_ofnode(dev), index, res);
238dcf98852SSimon Glass }
2397b8b47bdSMasahiro Yamada
dev_read_resource_byname(struct udevice * dev,const char * name,struct resource * res)2407b8b47bdSMasahiro Yamada int dev_read_resource_byname(struct udevice *dev, const char *name,
2417b8b47bdSMasahiro Yamada struct resource *res)
2427b8b47bdSMasahiro Yamada {
2437b8b47bdSMasahiro Yamada return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
2447b8b47bdSMasahiro Yamada }
245a9bd1c73SMario Six
dev_translate_address(struct udevice * dev,const fdt32_t * in_addr)246a9bd1c73SMario Six u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr)
247a9bd1c73SMario Six {
248a9bd1c73SMario Six return ofnode_translate_address(dev_ofnode(dev), in_addr);
249a9bd1c73SMario Six }
250