1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (c) 2017 Google, Inc
12 #include <dm/of_access.h>
14 int dev_read_u32(const struct udevice *dev, const char *propname, u32 *outp)
16 return ofnode_read_u32(dev_ofnode(dev), propname, outp);
19 int dev_read_u32_default(const struct udevice *dev, const char *propname,
22 return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
25 int dev_read_u32_index(struct udevice *dev, const char *propname, int index,
28 return ofnode_read_u32_index(dev_ofnode(dev), propname, index, outp);
31 u32 dev_read_u32_index_default(struct udevice *dev, const char *propname,
34 return ofnode_read_u32_index_default(dev_ofnode(dev), propname, index,
38 int dev_read_s32(const struct udevice *dev, const char *propname, s32 *outp)
40 return ofnode_read_u32(dev_ofnode(dev), propname, (u32 *)outp);
43 int dev_read_s32_default(const struct udevice *dev, const char *propname,
46 return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
49 int dev_read_u32u(const struct udevice *dev, const char *propname, uint *outp)
54 ret = ofnode_read_u32(dev_ofnode(dev), propname, &val);
62 int dev_read_u64(const struct udevice *dev, const char *propname, u64 *outp)
64 return ofnode_read_u64(dev_ofnode(dev), propname, outp);
67 u64 dev_read_u64_default(const struct udevice *dev, const char *propname,
70 return ofnode_read_u64_default(dev_ofnode(dev), propname, def);
73 const char *dev_read_string(const struct udevice *dev, const char *propname)
75 return ofnode_read_string(dev_ofnode(dev), propname);
78 bool dev_read_bool(const struct udevice *dev, const char *propname)
80 return ofnode_read_bool(dev_ofnode(dev), propname);
83 ofnode dev_read_subnode(const struct udevice *dev, const char *subnode_name)
85 return ofnode_find_subnode(dev_ofnode(dev), subnode_name);
88 ofnode dev_read_first_subnode(const struct udevice *dev)
90 return ofnode_first_subnode(dev_ofnode(dev));
93 ofnode dev_read_next_subnode(ofnode node)
95 return ofnode_next_subnode(node);
98 int dev_read_size(const struct udevice *dev, const char *propname)
100 return ofnode_read_size(dev_ofnode(dev), propname);
103 fdt_addr_t dev_read_addr_index(const struct udevice *dev, int index)
105 if (ofnode_is_np(dev_ofnode(dev)))
106 return ofnode_get_addr_index(dev_ofnode(dev), index);
108 return devfdt_get_addr_index(dev, index);
111 fdt_addr_t dev_read_addr_size_index(const struct udevice *dev, int index,
114 if (ofnode_is_np(dev_ofnode(dev)))
115 return ofnode_get_addr_size_index(dev_ofnode(dev), index, size);
117 return devfdt_get_addr_size_index(dev, index, size);
120 void *dev_remap_addr_index(const struct udevice *dev, int index)
122 fdt_addr_t addr = dev_read_addr_index(dev, index);
124 if (addr == FDT_ADDR_T_NONE)
127 return map_physmem(addr, 0, MAP_NOCACHE);
130 fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name)
132 int index = dev_read_stringlist_search(dev, "reg-names", name);
135 return FDT_ADDR_T_NONE;
137 return dev_read_addr_index(dev, index);
140 fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name,
143 int index = dev_read_stringlist_search(dev, "reg-names", name);
146 return FDT_ADDR_T_NONE;
148 return dev_read_addr_size_index(dev, index, size);
151 void *dev_remap_addr_name(const struct udevice *dev, const char *name)
153 fdt_addr_t addr = dev_read_addr_name(dev, name);
155 if (addr == FDT_ADDR_T_NONE)
158 return map_physmem(addr, 0, MAP_NOCACHE);
161 fdt_addr_t dev_read_addr(const struct udevice *dev)
163 return dev_read_addr_index(dev, 0);
166 void *dev_read_addr_ptr(const struct udevice *dev)
168 fdt_addr_t addr = dev_read_addr(dev);
170 return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0);
173 void *dev_remap_addr(const struct udevice *dev)
175 return dev_remap_addr_index(dev, 0);
178 fdt_addr_t dev_read_addr_size(const struct udevice *dev, const char *property,
181 return ofnode_get_addr_size(dev_ofnode(dev), property, sizep);
184 const char *dev_read_name(const struct udevice *dev)
186 return ofnode_get_name(dev_ofnode(dev));
189 int dev_read_stringlist_search(const struct udevice *dev, const char *property,
192 return ofnode_stringlist_search(dev_ofnode(dev), property, string);
195 int dev_read_string_index(const struct udevice *dev, const char *propname,
196 int index, const char **outp)
198 return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp);
201 int dev_read_string_count(const struct udevice *dev, const char *propname)
203 return ofnode_read_string_count(dev_ofnode(dev), propname);
206 int dev_read_phandle_with_args(const struct udevice *dev, const char *list_name,
207 const char *cells_name, int cell_count,
208 int index, struct ofnode_phandle_args *out_args)
210 return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
211 cells_name, cell_count, index,
215 int dev_count_phandle_with_args(const struct udevice *dev,
216 const char *list_name, const char *cells_name)
218 return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
222 int dev_read_addr_cells(const struct udevice *dev)
224 return ofnode_read_addr_cells(dev_ofnode(dev));
227 int dev_read_size_cells(const struct udevice *dev)
229 return ofnode_read_size_cells(dev_ofnode(dev));
232 int dev_read_simple_addr_cells(const struct udevice *dev)
234 return ofnode_read_simple_addr_cells(dev_ofnode(dev));
237 int dev_read_simple_size_cells(const struct udevice *dev)
239 return ofnode_read_simple_size_cells(dev_ofnode(dev));
242 int dev_read_phandle(const struct udevice *dev)
244 ofnode node = dev_ofnode(dev);
246 if (ofnode_is_np(node))
247 return ofnode_to_np(node)->phandle;
249 return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node));
252 const void *dev_read_prop(const struct udevice *dev, const char *propname,
255 return ofnode_get_property(dev_ofnode(dev), propname, lenp);
258 int dev_read_first_prop(const struct udevice *dev, struct ofprop *prop)
260 return ofnode_get_first_property(dev_ofnode(dev), prop);
263 int dev_read_next_prop(struct ofprop *prop)
265 return ofnode_get_next_property(prop);
268 const void *dev_read_prop_by_prop(struct ofprop *prop,
269 const char **propname, int *lenp)
271 return ofnode_get_property_by_prop(prop, propname, lenp);
274 int dev_read_alias_seq(const struct udevice *dev, int *devnump)
276 ofnode node = dev_ofnode(dev);
277 const char *uc_name = dev->uclass->uc_drv->name;
280 if (ofnode_is_np(node)) {
281 ret = of_alias_get_id(ofnode_to_np(node), uc_name);
285 ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
286 ofnode_to_offset(node), devnump);
292 int dev_read_u32_array(const struct udevice *dev, const char *propname,
293 u32 *out_values, size_t sz)
295 return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz);
298 const uint8_t *dev_read_u8_array_ptr(const struct udevice *dev,
299 const char *propname, size_t sz)
301 return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz);
304 int dev_read_enabled(const struct udevice *dev)
306 ofnode node = dev_ofnode(dev);
308 if (ofnode_is_np(node))
309 return of_device_is_available(ofnode_to_np(node));
311 return fdtdec_get_is_enabled(gd->fdt_blob,
312 ofnode_to_offset(node));
315 int dev_read_resource(const struct udevice *dev, uint index,
316 struct resource *res)
318 return ofnode_read_resource(dev_ofnode(dev), index, res);
321 int dev_read_resource_byname(const struct udevice *dev, const char *name,
322 struct resource *res)
324 return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
327 u64 dev_translate_address(const struct udevice *dev, const fdt32_t *in_addr)
329 return ofnode_translate_address(dev_ofnode(dev), in_addr);
332 u64 dev_translate_dma_address(const struct udevice *dev, const fdt32_t *in_addr)
334 return ofnode_translate_dma_address(dev_ofnode(dev), in_addr);
337 int dev_read_alias_highest_id(const char *stem)
339 if (of_live_active())
340 return of_alias_get_highest_id(stem);
342 return fdtdec_get_alias_highest_id(gd->fdt_blob, stem);
345 fdt_addr_t dev_read_addr_pci(const struct udevice *dev)
349 addr = dev_read_addr(dev);
350 if (addr == FDT_ADDR_T_NONE && !of_live_active())
351 addr = devfdt_get_addr_pci(dev);