1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (c) 2017 Google, Inc
4 * Written by Simon Glass <sjg@chromium.org>
5 */
6
7 #include <dm.h>
8 #include <dm/of_access.h>
9 #include <mapmem.h>
10 #include <asm/global_data.h>
11 #include <asm/types.h>
12 #include <asm/io.h>
13 #include <linux/ioport.h>
14
dev_read_u8(const struct udevice * dev,const char * propname,u8 * outp)15 int dev_read_u8(const struct udevice *dev, const char *propname, u8 *outp)
16 {
17 return ofnode_read_u8(dev_ofnode(dev), propname, outp);
18 }
19
dev_read_u8_default(const struct udevice * dev,const char * propname,u8 def)20 u8 dev_read_u8_default(const struct udevice *dev, const char *propname, u8 def)
21 {
22 return ofnode_read_u8_default(dev_ofnode(dev), propname, def);
23 }
24
dev_read_u16(const struct udevice * dev,const char * propname,u16 * outp)25 int dev_read_u16(const struct udevice *dev, const char *propname, u16 *outp)
26 {
27 return ofnode_read_u16(dev_ofnode(dev), propname, outp);
28 }
29
dev_read_u16_default(const struct udevice * dev,const char * propname,u16 def)30 u16 dev_read_u16_default(const struct udevice *dev, const char *propname,
31 u16 def)
32 {
33 return ofnode_read_u16_default(dev_ofnode(dev), propname, def);
34 }
35
dev_read_u32(const struct udevice * dev,const char * propname,u32 * outp)36 int dev_read_u32(const struct udevice *dev, const char *propname, u32 *outp)
37 {
38 return ofnode_read_u32(dev_ofnode(dev), propname, outp);
39 }
40
dev_read_u32_default(const struct udevice * dev,const char * propname,u32 def)41 u32 dev_read_u32_default(const struct udevice *dev, const char *propname,
42 u32 def)
43 {
44 return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
45 }
46
dev_read_u32_index(struct udevice * dev,const char * propname,int index,u32 * outp)47 int dev_read_u32_index(struct udevice *dev, const char *propname, int index,
48 u32 *outp)
49 {
50 return ofnode_read_u32_index(dev_ofnode(dev), propname, index, outp);
51 }
52
dev_read_u32_index_default(struct udevice * dev,const char * propname,int index,u32 def)53 u32 dev_read_u32_index_default(struct udevice *dev, const char *propname,
54 int index, u32 def)
55 {
56 return ofnode_read_u32_index_default(dev_ofnode(dev), propname, index,
57 def);
58 }
59
dev_read_s32(const struct udevice * dev,const char * propname,s32 * outp)60 int dev_read_s32(const struct udevice *dev, const char *propname, s32 *outp)
61 {
62 return ofnode_read_u32(dev_ofnode(dev), propname, (u32 *)outp);
63 }
64
dev_read_s32_default(const struct udevice * dev,const char * propname,s32 def)65 s32 dev_read_s32_default(const struct udevice *dev, const char *propname,
66 s32 def)
67 {
68 return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
69 }
70
dev_read_u32u(const struct udevice * dev,const char * propname,uint * outp)71 int dev_read_u32u(const struct udevice *dev, const char *propname, uint *outp)
72 {
73 u32 val;
74 int ret;
75
76 ret = ofnode_read_u32(dev_ofnode(dev), propname, &val);
77 if (ret)
78 return ret;
79 *outp = val;
80
81 return 0;
82 }
83
dev_read_u64(const struct udevice * dev,const char * propname,u64 * outp)84 int dev_read_u64(const struct udevice *dev, const char *propname, u64 *outp)
85 {
86 return ofnode_read_u64(dev_ofnode(dev), propname, outp);
87 }
88
dev_read_u64_default(const struct udevice * dev,const char * propname,u64 def)89 u64 dev_read_u64_default(const struct udevice *dev, const char *propname,
90 u64 def)
91 {
92 return ofnode_read_u64_default(dev_ofnode(dev), propname, def);
93 }
94
dev_read_string(const struct udevice * dev,const char * propname)95 const char *dev_read_string(const struct udevice *dev, const char *propname)
96 {
97 return ofnode_read_string(dev_ofnode(dev), propname);
98 }
99
dev_read_bool(const struct udevice * dev,const char * propname)100 bool dev_read_bool(const struct udevice *dev, const char *propname)
101 {
102 return ofnode_read_bool(dev_ofnode(dev), propname);
103 }
104
dev_read_subnode(const struct udevice * dev,const char * subnode_name)105 ofnode dev_read_subnode(const struct udevice *dev, const char *subnode_name)
106 {
107 return ofnode_find_subnode(dev_ofnode(dev), subnode_name);
108 }
109
dev_read_first_subnode(const struct udevice * dev)110 ofnode dev_read_first_subnode(const struct udevice *dev)
111 {
112 return ofnode_first_subnode(dev_ofnode(dev));
113 }
114
dev_read_next_subnode(ofnode node)115 ofnode dev_read_next_subnode(ofnode node)
116 {
117 return ofnode_next_subnode(node);
118 }
119
dev_read_size(const struct udevice * dev,const char * propname)120 int dev_read_size(const struct udevice *dev, const char *propname)
121 {
122 return ofnode_read_size(dev_ofnode(dev), propname);
123 }
124
dev_read_addr_index(const struct udevice * dev,int index)125 fdt_addr_t dev_read_addr_index(const struct udevice *dev, int index)
126 {
127 if (ofnode_is_np(dev_ofnode(dev)))
128 return ofnode_get_addr_index(dev_ofnode(dev), index);
129 else
130 return devfdt_get_addr_index(dev, index);
131 }
132
dev_read_addr_index_ptr(const struct udevice * dev,int index)133 void *dev_read_addr_index_ptr(const struct udevice *dev, int index)
134 {
135 fdt_addr_t addr = dev_read_addr_index(dev, index);
136
137 if (addr == FDT_ADDR_T_NONE)
138 return NULL;
139
140 return map_sysmem(addr, 0);
141 }
142
dev_read_addr_size_index(const struct udevice * dev,int index,fdt_size_t * size)143 fdt_addr_t dev_read_addr_size_index(const struct udevice *dev, int index,
144 fdt_size_t *size)
145 {
146 if (ofnode_is_np(dev_ofnode(dev)))
147 return ofnode_get_addr_size_index(dev_ofnode(dev), index, size);
148 else
149 return devfdt_get_addr_size_index(dev, index, size);
150 }
151
dev_read_addr_size_index_ptr(const struct udevice * dev,int index,fdt_size_t * size)152 void *dev_read_addr_size_index_ptr(const struct udevice *dev, int index,
153 fdt_size_t *size)
154 {
155 fdt_addr_t addr = dev_read_addr_size_index(dev, index, size);
156
157 if (addr == FDT_ADDR_T_NONE)
158 return NULL;
159
160 return map_sysmem(addr, 0);
161 }
162
dev_remap_addr_index(const struct udevice * dev,int index)163 void *dev_remap_addr_index(const struct udevice *dev, int index)
164 {
165 fdt_addr_t addr = dev_read_addr_index(dev, index);
166
167 if (addr == FDT_ADDR_T_NONE)
168 return NULL;
169
170 return map_physmem(addr, 0, MAP_NOCACHE);
171 }
172
dev_read_addr_name(const struct udevice * dev,const char * name)173 fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name)
174 {
175 int index = dev_read_stringlist_search(dev, "reg-names", name);
176
177 if (index < 0)
178 return FDT_ADDR_T_NONE;
179 else
180 return dev_read_addr_index(dev, index);
181 }
182
dev_read_addr_name_ptr(const struct udevice * dev,const char * name)183 void *dev_read_addr_name_ptr(const struct udevice *dev, const char *name)
184 {
185 fdt_addr_t addr = dev_read_addr_name(dev, name);
186
187 if (addr == FDT_ADDR_T_NONE)
188 return NULL;
189
190 return map_sysmem(addr, 0);
191 }
192
dev_read_addr_size_name(const struct udevice * dev,const char * name,fdt_size_t * size)193 fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name,
194 fdt_size_t *size)
195 {
196 int index = dev_read_stringlist_search(dev, "reg-names", name);
197
198 if (index < 0)
199 return FDT_ADDR_T_NONE;
200 else
201 return dev_read_addr_size_index(dev, index, size);
202 }
203
dev_read_addr_size_name_ptr(const struct udevice * dev,const char * name,fdt_size_t * size)204 void *dev_read_addr_size_name_ptr(const struct udevice *dev, const char *name,
205 fdt_size_t *size)
206 {
207 fdt_addr_t addr = dev_read_addr_size_name(dev, name, size);
208
209 if (addr == FDT_ADDR_T_NONE)
210 return NULL;
211
212 return map_sysmem(addr, 0);
213 }
214
dev_remap_addr_name(const struct udevice * dev,const char * name)215 void *dev_remap_addr_name(const struct udevice *dev, const char *name)
216 {
217 fdt_addr_t addr = dev_read_addr_name(dev, name);
218
219 if (addr == FDT_ADDR_T_NONE)
220 return NULL;
221
222 return map_physmem(addr, 0, MAP_NOCACHE);
223 }
224
dev_read_addr(const struct udevice * dev)225 fdt_addr_t dev_read_addr(const struct udevice *dev)
226 {
227 return dev_read_addr_index(dev, 0);
228 }
229
dev_read_addr_ptr(const struct udevice * dev)230 void *dev_read_addr_ptr(const struct udevice *dev)
231 {
232 fdt_addr_t addr = dev_read_addr(dev);
233
234 if (addr == FDT_ADDR_T_NONE)
235 return NULL;
236
237 return map_sysmem(addr, 0);
238 }
239
dev_remap_addr(const struct udevice * dev)240 void *dev_remap_addr(const struct udevice *dev)
241 {
242 return dev_remap_addr_index(dev, 0);
243 }
244
dev_read_addr_size(const struct udevice * dev,fdt_size_t * sizep)245 fdt_addr_t dev_read_addr_size(const struct udevice *dev, fdt_size_t *sizep)
246 {
247 return dev_read_addr_size_index(dev, 0, sizep);
248 }
249
dev_read_name(const struct udevice * dev)250 const char *dev_read_name(const struct udevice *dev)
251 {
252 return ofnode_get_name(dev_ofnode(dev));
253 }
254
dev_read_stringlist_search(const struct udevice * dev,const char * property,const char * string)255 int dev_read_stringlist_search(const struct udevice *dev, const char *property,
256 const char *string)
257 {
258 return ofnode_stringlist_search(dev_ofnode(dev), property, string);
259 }
260
dev_read_string_index(const struct udevice * dev,const char * propname,int index,const char ** outp)261 int dev_read_string_index(const struct udevice *dev, const char *propname,
262 int index, const char **outp)
263 {
264 return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp);
265 }
266
dev_read_string_count(const struct udevice * dev,const char * propname)267 int dev_read_string_count(const struct udevice *dev, const char *propname)
268 {
269 return ofnode_read_string_count(dev_ofnode(dev), propname);
270 }
271
dev_read_string_list(const struct udevice * dev,const char * propname,const char *** listp)272 int dev_read_string_list(const struct udevice *dev, const char *propname,
273 const char ***listp)
274 {
275 return ofnode_read_string_list(dev_ofnode(dev), propname, listp);
276 }
277
dev_read_phandle_with_args(const struct udevice * dev,const char * list_name,const char * cells_name,int cell_count,int index,struct ofnode_phandle_args * out_args)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)
281 {
282 return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
283 cells_name, cell_count, index,
284 out_args);
285 }
286
dev_count_phandle_with_args(const struct udevice * dev,const char * list_name,const char * cells_name,int cell_count)287 int dev_count_phandle_with_args(const struct udevice *dev,
288 const char *list_name, const char *cells_name,
289 int cell_count)
290 {
291 return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
292 cells_name, cell_count);
293 }
294
dev_read_addr_cells(const struct udevice * dev)295 int dev_read_addr_cells(const struct udevice *dev)
296 {
297 return ofnode_read_addr_cells(dev_ofnode(dev));
298 }
299
dev_read_size_cells(const struct udevice * dev)300 int dev_read_size_cells(const struct udevice *dev)
301 {
302 return ofnode_read_size_cells(dev_ofnode(dev));
303 }
304
dev_read_simple_addr_cells(const struct udevice * dev)305 int dev_read_simple_addr_cells(const struct udevice *dev)
306 {
307 return ofnode_read_simple_addr_cells(dev_ofnode(dev));
308 }
309
dev_read_simple_size_cells(const struct udevice * dev)310 int dev_read_simple_size_cells(const struct udevice *dev)
311 {
312 return ofnode_read_simple_size_cells(dev_ofnode(dev));
313 }
314
dev_read_phandle(const struct udevice * dev)315 int dev_read_phandle(const struct udevice *dev)
316 {
317 ofnode node = dev_ofnode(dev);
318
319 if (ofnode_is_np(node))
320 return ofnode_to_np(node)->phandle;
321 else
322 return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node));
323 }
324
dev_read_prop(const struct udevice * dev,const char * propname,int * lenp)325 const void *dev_read_prop(const struct udevice *dev, const char *propname,
326 int *lenp)
327 {
328 return ofnode_get_property(dev_ofnode(dev), propname, lenp);
329 }
330
dev_read_first_prop(const struct udevice * dev,struct ofprop * prop)331 int dev_read_first_prop(const struct udevice *dev, struct ofprop *prop)
332 {
333 return ofnode_first_property(dev_ofnode(dev), prop);
334 }
335
dev_read_next_prop(struct ofprop * prop)336 int dev_read_next_prop(struct ofprop *prop)
337 {
338 return ofnode_next_property(prop);
339 }
340
dev_read_prop_by_prop(struct ofprop * prop,const char ** propname,int * lenp)341 const void *dev_read_prop_by_prop(struct ofprop *prop,
342 const char **propname, int *lenp)
343 {
344 return ofprop_get_property(prop, propname, lenp);
345 }
346
dev_read_alias_seq(const struct udevice * dev,int * devnump)347 int dev_read_alias_seq(const struct udevice *dev, int *devnump)
348 {
349 ofnode node = dev_ofnode(dev);
350 const char *uc_name = dev->uclass->uc_drv->name;
351 int ret = -ENOTSUPP;
352
353 if (ofnode_is_np(node)) {
354 ret = of_alias_get_id(ofnode_to_np(node), uc_name);
355 if (ret >= 0) {
356 *devnump = ret;
357 ret = 0;
358 }
359 } else {
360 #if CONFIG_IS_ENABLED(OF_CONTROL)
361 ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
362 ofnode_to_offset(node), devnump);
363 #endif
364 }
365
366 return ret;
367 }
368
dev_read_u32_array(const struct udevice * dev,const char * propname,u32 * out_values,size_t sz)369 int dev_read_u32_array(const struct udevice *dev, const char *propname,
370 u32 *out_values, size_t sz)
371 {
372 return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz);
373 }
374
dev_read_u8_array_ptr(const struct udevice * dev,const char * propname,size_t sz)375 const uint8_t *dev_read_u8_array_ptr(const struct udevice *dev,
376 const char *propname, size_t sz)
377 {
378 return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz);
379 }
380
dev_read_enabled(const struct udevice * dev)381 int dev_read_enabled(const struct udevice *dev)
382 {
383 ofnode node = dev_ofnode(dev);
384
385 if (ofnode_is_np(node))
386 return of_device_is_available(ofnode_to_np(node));
387 else
388 return fdtdec_get_is_enabled(gd->fdt_blob,
389 ofnode_to_offset(node));
390 }
391
dev_read_resource(const struct udevice * dev,uint index,struct resource * res)392 int dev_read_resource(const struct udevice *dev, uint index,
393 struct resource *res)
394 {
395 return ofnode_read_resource(dev_ofnode(dev), index, res);
396 }
397
dev_read_resource_byname(const struct udevice * dev,const char * name,struct resource * res)398 int dev_read_resource_byname(const struct udevice *dev, const char *name,
399 struct resource *res)
400 {
401 return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
402 }
403
dev_translate_address(const struct udevice * dev,const fdt32_t * in_addr)404 u64 dev_translate_address(const struct udevice *dev, const fdt32_t *in_addr)
405 {
406 return ofnode_translate_address(dev_ofnode(dev), in_addr);
407 }
408
dev_translate_dma_address(const struct udevice * dev,const fdt32_t * in_addr)409 u64 dev_translate_dma_address(const struct udevice *dev, const fdt32_t *in_addr)
410 {
411 return ofnode_translate_dma_address(dev_ofnode(dev), in_addr);
412 }
413
dev_get_dma_range(const struct udevice * dev,phys_addr_t * cpu,dma_addr_t * bus,u64 * size)414 int dev_get_dma_range(const struct udevice *dev, phys_addr_t *cpu,
415 dma_addr_t *bus, u64 *size)
416 {
417 return ofnode_get_dma_range(dev_ofnode(dev), cpu, bus, size);
418 }
419
dev_read_alias_highest_id(const char * stem)420 int dev_read_alias_highest_id(const char *stem)
421 {
422 if (of_live_active())
423 return of_alias_get_highest_id(stem);
424
425 return fdtdec_get_alias_highest_id(gd->fdt_blob, stem);
426 }
427
dev_read_addr_pci(const struct udevice * dev,fdt_size_t * sizep)428 fdt_addr_t dev_read_addr_pci(const struct udevice *dev, fdt_size_t *sizep)
429 {
430 ulong addr;
431
432 addr = dev_read_addr(dev);
433 if (sizep)
434 *sizep = 0;
435 if (addr == FDT_ADDR_T_NONE && !of_live_active())
436 addr = devfdt_get_addr_pci(dev, sizep);
437
438 return addr;
439 }
440
dev_get_child_count(const struct udevice * dev)441 int dev_get_child_count(const struct udevice *dev)
442 {
443 return ofnode_get_child_count(dev_ofnode(dev));
444 }
445
dev_read_pci_bus_range(const struct udevice * dev,struct resource * res)446 int dev_read_pci_bus_range(const struct udevice *dev,
447 struct resource *res)
448 {
449 const u32 *values;
450 int len;
451
452 values = dev_read_prop(dev, "bus-range", &len);
453 if (!values || len < sizeof(*values) * 2)
454 return -EINVAL;
455
456 res->start = *values++;
457 res->end = *values;
458
459 return 0;
460 }
461
dev_decode_display_timing(const struct udevice * dev,int index,struct display_timing * config)462 int dev_decode_display_timing(const struct udevice *dev, int index,
463 struct display_timing *config)
464 {
465 return ofnode_decode_display_timing(dev_ofnode(dev), index, config);
466 }
467
dev_decode_panel_timing(const struct udevice * dev,struct display_timing * config)468 int dev_decode_panel_timing(const struct udevice *dev,
469 struct display_timing *config)
470 {
471 return ofnode_decode_panel_timing(dev_ofnode(dev), config);
472 }
473
dev_get_phy_node(const struct udevice * dev)474 ofnode dev_get_phy_node(const struct udevice *dev)
475 {
476 return ofnode_get_phy_node(dev_ofnode(dev));
477 }
478
dev_read_phy_mode(const struct udevice * dev)479 phy_interface_t dev_read_phy_mode(const struct udevice *dev)
480 {
481 return ofnode_read_phy_mode(dev_ofnode(dev));
482 }
483