1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (c) 2017 Google, Inc
8 #include <dm/of_access.h>
10 #include <asm/global_data.h>
11 #include <asm/types.h>
13 #include <linux/ioport.h>
15 int dev_read_u8(const struct udevice *dev, const char *propname, u8 *outp)
17 return ofnode_read_u8(dev_ofnode(dev), propname, outp);
20 u8 dev_read_u8_default(const struct udevice *dev, const char *propname, u8 def)
22 return ofnode_read_u8_default(dev_ofnode(dev), propname, def);
25 int dev_read_u16(const struct udevice *dev, const char *propname, u16 *outp)
27 return ofnode_read_u16(dev_ofnode(dev), propname, outp);
30 u16 dev_read_u16_default(const struct udevice *dev, const char *propname,
33 return ofnode_read_u16_default(dev_ofnode(dev), propname, def);
36 int dev_read_u32(const struct udevice *dev, const char *propname, u32 *outp)
38 return ofnode_read_u32(dev_ofnode(dev), propname, outp);
41 int dev_read_u32_default(const struct udevice *dev, const char *propname,
44 return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
47 int dev_read_u32_index(struct udevice *dev, const char *propname, int index,
50 return ofnode_read_u32_index(dev_ofnode(dev), propname, index, outp);
53 u32 dev_read_u32_index_default(struct udevice *dev, const char *propname,
56 return ofnode_read_u32_index_default(dev_ofnode(dev), propname, index,
60 int dev_read_s32(const struct udevice *dev, const char *propname, s32 *outp)
62 return ofnode_read_u32(dev_ofnode(dev), propname, (u32 *)outp);
65 int dev_read_s32_default(const struct udevice *dev, const char *propname,
68 return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
71 int dev_read_u32u(const struct udevice *dev, const char *propname, uint *outp)
76 ret = ofnode_read_u32(dev_ofnode(dev), propname, &val);
84 int dev_read_u64(const struct udevice *dev, const char *propname, u64 *outp)
86 return ofnode_read_u64(dev_ofnode(dev), propname, outp);
89 u64 dev_read_u64_default(const struct udevice *dev, const char *propname,
92 return ofnode_read_u64_default(dev_ofnode(dev), propname, def);
95 const char *dev_read_string(const struct udevice *dev, const char *propname)
97 return ofnode_read_string(dev_ofnode(dev), propname);
100 bool dev_read_bool(const struct udevice *dev, const char *propname)
102 return ofnode_read_bool(dev_ofnode(dev), propname);
105 ofnode dev_read_subnode(const struct udevice *dev, const char *subnode_name)
107 return ofnode_find_subnode(dev_ofnode(dev), subnode_name);
110 ofnode dev_read_first_subnode(const struct udevice *dev)
112 return ofnode_first_subnode(dev_ofnode(dev));
115 ofnode dev_read_next_subnode(ofnode node)
117 return ofnode_next_subnode(node);
120 int dev_read_size(const struct udevice *dev, const char *propname)
122 return ofnode_read_size(dev_ofnode(dev), propname);
125 fdt_addr_t dev_read_addr_index(const struct udevice *dev, int index)
127 if (ofnode_is_np(dev_ofnode(dev)))
128 return ofnode_get_addr_index(dev_ofnode(dev), index);
130 return devfdt_get_addr_index(dev, index);
133 void *dev_read_addr_index_ptr(const struct udevice *dev, int index)
135 fdt_addr_t addr = dev_read_addr_index(dev, index);
137 if (addr == FDT_ADDR_T_NONE)
140 return map_sysmem(addr, 0);
143 fdt_addr_t dev_read_addr_size_index(const struct udevice *dev, int index,
146 if (ofnode_is_np(dev_ofnode(dev)))
147 return ofnode_get_addr_size_index(dev_ofnode(dev), index, size);
149 return devfdt_get_addr_size_index(dev, index, size);
152 void *dev_read_addr_size_index_ptr(const struct udevice *dev, int index,
155 fdt_addr_t addr = dev_read_addr_size_index(dev, index, size);
157 if (addr == FDT_ADDR_T_NONE)
160 return map_sysmem(addr, 0);
163 void *dev_remap_addr_index(const struct udevice *dev, int index)
165 fdt_addr_t addr = dev_read_addr_index(dev, index);
167 if (addr == FDT_ADDR_T_NONE)
170 return map_physmem(addr, 0, MAP_NOCACHE);
173 fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name)
175 int index = dev_read_stringlist_search(dev, "reg-names", name);
178 return FDT_ADDR_T_NONE;
180 return dev_read_addr_index(dev, index);
183 void *dev_read_addr_name_ptr(const struct udevice *dev, const char *name)
185 fdt_addr_t addr = dev_read_addr_name(dev, name);
187 if (addr == FDT_ADDR_T_NONE)
190 return map_sysmem(addr, 0);
193 fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name,
196 int index = dev_read_stringlist_search(dev, "reg-names", name);
199 return FDT_ADDR_T_NONE;
201 return dev_read_addr_size_index(dev, index, size);
204 void *dev_read_addr_size_name_ptr(const struct udevice *dev, const char *name,
207 fdt_addr_t addr = dev_read_addr_size_name(dev, name, size);
209 if (addr == FDT_ADDR_T_NONE)
212 return map_sysmem(addr, 0);
215 void *dev_remap_addr_name(const struct udevice *dev, const char *name)
217 fdt_addr_t addr = dev_read_addr_name(dev, name);
219 if (addr == FDT_ADDR_T_NONE)
222 return map_physmem(addr, 0, MAP_NOCACHE);
225 fdt_addr_t dev_read_addr(const struct udevice *dev)
227 return dev_read_addr_index(dev, 0);
230 void *dev_read_addr_ptr(const struct udevice *dev)
232 fdt_addr_t addr = dev_read_addr(dev);
234 if (addr == FDT_ADDR_T_NONE)
237 return map_sysmem(addr, 0);
240 void *dev_remap_addr(const struct udevice *dev)
242 return dev_remap_addr_index(dev, 0);
245 fdt_addr_t dev_read_addr_size(const struct udevice *dev, fdt_size_t *sizep)
247 return dev_read_addr_size_index(dev, 0, sizep);
250 const char *dev_read_name(const struct udevice *dev)
252 return ofnode_get_name(dev_ofnode(dev));
255 int dev_read_stringlist_search(const struct udevice *dev, const char *property,
258 return ofnode_stringlist_search(dev_ofnode(dev), property, string);
261 int dev_read_string_index(const struct udevice *dev, const char *propname,
262 int index, const char **outp)
264 return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp);
267 int dev_read_string_count(const struct udevice *dev, const char *propname)
269 return ofnode_read_string_count(dev_ofnode(dev), propname);
272 int dev_read_string_list(const struct udevice *dev, const char *propname,
275 return ofnode_read_string_list(dev_ofnode(dev), propname, listp);
278 int dev_read_phandle_with_args(const struct udevice *dev, const char *list_name,
279 const char *cells_name, int cell_count,
280 int index, struct ofnode_phandle_args *out_args)
282 return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
283 cells_name, cell_count, index,
287 int dev_count_phandle_with_args(const struct udevice *dev,
288 const char *list_name, const char *cells_name,
291 return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
292 cells_name, cell_count);
295 int dev_read_addr_cells(const struct udevice *dev)
297 return ofnode_read_addr_cells(dev_ofnode(dev));
300 int dev_read_size_cells(const struct udevice *dev)
302 return ofnode_read_size_cells(dev_ofnode(dev));
305 int dev_read_simple_addr_cells(const struct udevice *dev)
307 return ofnode_read_simple_addr_cells(dev_ofnode(dev));
310 int dev_read_simple_size_cells(const struct udevice *dev)
312 return ofnode_read_simple_size_cells(dev_ofnode(dev));
315 int dev_read_phandle(const struct udevice *dev)
317 ofnode node = dev_ofnode(dev);
319 if (ofnode_is_np(node))
320 return ofnode_to_np(node)->phandle;
322 return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node));
325 const void *dev_read_prop(const struct udevice *dev, const char *propname,
328 return ofnode_get_property(dev_ofnode(dev), propname, lenp);
331 int dev_read_first_prop(const struct udevice *dev, struct ofprop *prop)
333 return ofnode_first_property(dev_ofnode(dev), prop);
336 int dev_read_next_prop(struct ofprop *prop)
338 return ofnode_next_property(prop);
341 const void *dev_read_prop_by_prop(struct ofprop *prop,
342 const char **propname, int *lenp)
344 return ofprop_get_property(prop, propname, lenp);
347 int dev_read_alias_seq(const struct udevice *dev, int *devnump)
349 ofnode node = dev_ofnode(dev);
350 const char *uc_name = dev->uclass->uc_drv->name;
353 if (ofnode_is_np(node)) {
354 ret = of_alias_get_id(ofnode_to_np(node), uc_name);
360 #if CONFIG_IS_ENABLED(OF_CONTROL)
361 ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
362 ofnode_to_offset(node), devnump);
369 int dev_read_u32_array(const struct udevice *dev, const char *propname,
370 u32 *out_values, size_t sz)
372 return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz);
375 const uint8_t *dev_read_u8_array_ptr(const struct udevice *dev,
376 const char *propname, size_t sz)
378 return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz);
381 int dev_read_enabled(const struct udevice *dev)
383 ofnode node = dev_ofnode(dev);
385 if (ofnode_is_np(node))
386 return of_device_is_available(ofnode_to_np(node));
388 return fdtdec_get_is_enabled(gd->fdt_blob,
389 ofnode_to_offset(node));
392 int dev_read_resource(const struct udevice *dev, uint index,
393 struct resource *res)
395 return ofnode_read_resource(dev_ofnode(dev), index, res);
398 int dev_read_resource_byname(const struct udevice *dev, const char *name,
399 struct resource *res)
401 return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
404 u64 dev_translate_address(const struct udevice *dev, const fdt32_t *in_addr)
406 return ofnode_translate_address(dev_ofnode(dev), in_addr);
409 u64 dev_translate_dma_address(const struct udevice *dev, const fdt32_t *in_addr)
411 return ofnode_translate_dma_address(dev_ofnode(dev), in_addr);
414 int dev_get_dma_range(const struct udevice *dev, phys_addr_t *cpu,
415 dma_addr_t *bus, u64 *size)
417 return ofnode_get_dma_range(dev_ofnode(dev), cpu, bus, size);
420 int dev_read_alias_highest_id(const char *stem)
422 if (of_live_active())
423 return of_alias_get_highest_id(stem);
425 return fdtdec_get_alias_highest_id(gd->fdt_blob, stem);
428 fdt_addr_t dev_read_addr_pci(const struct udevice *dev, fdt_size_t *sizep)
432 addr = dev_read_addr(dev);
435 if (addr == FDT_ADDR_T_NONE && !of_live_active())
436 addr = devfdt_get_addr_pci(dev, sizep);
441 int dev_get_child_count(const struct udevice *dev)
443 return ofnode_get_child_count(dev_ofnode(dev));
446 int dev_read_pci_bus_range(const struct udevice *dev,
447 struct resource *res)
452 values = dev_read_prop(dev, "bus-range", &len);
453 if (!values || len < sizeof(*values) * 2)
456 res->start = *values++;
462 int dev_decode_display_timing(const struct udevice *dev, int index,
463 struct display_timing *config)
465 return ofnode_decode_display_timing(dev_ofnode(dev), index, config);
468 int dev_decode_panel_timing(const struct udevice *dev,
469 struct display_timing *config)
471 return ofnode_decode_panel_timing(dev_ofnode(dev), config);
474 ofnode dev_get_phy_node(const struct udevice *dev)
476 return ofnode_get_phy_node(dev_ofnode(dev));
479 phy_interface_t dev_read_phy_mode(const struct udevice *dev)
481 return ofnode_read_phy_mode(dev_ofnode(dev));