blob: e0543bbad597376b7bbf013a6614be3c7a9d4e58 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Simon Glasscfdae5c2017-05-18 20:09:04 -06002/*
3 * Copyright (c) 2017 Google, Inc
4 * Written by Simon Glass <sjg@chromium.org>
Simon Glasscfdae5c2017-05-18 20:09:04 -06005 */
6
7#include <common.h>
8#include <dm.h>
9#include <dm/of_access.h>
Stefan Roesea8c43062020-04-29 09:08:44 +020010#include <mapmem.h>
Simon Glass3ba929a2020-10-30 21:38:53 -060011#include <asm/global_data.h>
Stefan Roesea8c43062020-04-29 09:08:44 +020012#include <asm/types.h>
13#include <asm/io.h>
Stefan Roese0a9ecc52020-08-05 13:56:11 +020014#include <linux/ioport.h>
Simon Glasscfdae5c2017-05-18 20:09:04 -060015
Stefan Herbrechtsmeier1b090e62022-06-14 15:21:30 +020016int dev_read_u8(const struct udevice *dev, const char *propname, u8 *outp)
17{
18 return ofnode_read_u8(dev_ofnode(dev), propname, outp);
19}
20
21u8 dev_read_u8_default(const struct udevice *dev, const char *propname, u8 def)
22{
23 return ofnode_read_u8_default(dev_ofnode(dev), propname, def);
24}
25
26int dev_read_u16(const struct udevice *dev, const char *propname, u16 *outp)
27{
28 return ofnode_read_u16(dev_ofnode(dev), propname, outp);
29}
30
31u16 dev_read_u16_default(const struct udevice *dev, const char *propname,
32 u16 def)
33{
34 return ofnode_read_u16_default(dev_ofnode(dev), propname, def);
35}
36
Simon Glass2f9a6122020-01-27 08:49:40 -070037int dev_read_u32(const struct udevice *dev, const char *propname, u32 *outp)
Masahiro Yamada71d115f2017-12-30 02:00:05 +090038{
39 return ofnode_read_u32(dev_ofnode(dev), propname, outp);
40}
41
Simon Glass2f9a6122020-01-27 08:49:40 -070042int dev_read_u32_default(const struct udevice *dev, const char *propname,
43 int def)
Simon Glasscfdae5c2017-05-18 20:09:04 -060044{
45 return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
46}
47
Dario Binacchi81d80b52020-03-29 18:04:41 +020048int dev_read_u32_index(struct udevice *dev, const char *propname, int index,
49 u32 *outp)
50{
51 return ofnode_read_u32_index(dev_ofnode(dev), propname, index, outp);
52}
53
54u32 dev_read_u32_index_default(struct udevice *dev, const char *propname,
55 int index, u32 def)
56{
57 return ofnode_read_u32_index_default(dev_ofnode(dev), propname, index,
58 def);
59}
60
Simon Glass2f9a6122020-01-27 08:49:40 -070061int dev_read_s32(const struct udevice *dev, const char *propname, s32 *outp)
Simon Glass6df01f92018-12-10 10:37:37 -070062{
63 return ofnode_read_u32(dev_ofnode(dev), propname, (u32 *)outp);
64}
65
Simon Glass2f9a6122020-01-27 08:49:40 -070066int dev_read_s32_default(const struct udevice *dev, const char *propname,
67 int def)
Simon Glass6df01f92018-12-10 10:37:37 -070068{
69 return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
70}
71
Simon Glass2f9a6122020-01-27 08:49:40 -070072int dev_read_u32u(const struct udevice *dev, const char *propname, uint *outp)
Simon Glass6df01f92018-12-10 10:37:37 -070073{
74 u32 val;
75 int ret;
76
77 ret = ofnode_read_u32(dev_ofnode(dev), propname, &val);
78 if (ret)
79 return ret;
80 *outp = val;
81
82 return 0;
83}
84
Simon Glass2f9a6122020-01-27 08:49:40 -070085int dev_read_u64(const struct udevice *dev, const char *propname, u64 *outp)
T Karthik Reddy478860d2019-09-02 16:34:30 +020086{
87 return ofnode_read_u64(dev_ofnode(dev), propname, outp);
88}
89
Simon Glass2f9a6122020-01-27 08:49:40 -070090u64 dev_read_u64_default(const struct udevice *dev, const char *propname,
91 u64 def)
T Karthik Reddy478860d2019-09-02 16:34:30 +020092{
93 return ofnode_read_u64_default(dev_ofnode(dev), propname, def);
94}
95
Simon Glass2f9a6122020-01-27 08:49:40 -070096const char *dev_read_string(const struct udevice *dev, const char *propname)
Simon Glasscfdae5c2017-05-18 20:09:04 -060097{
98 return ofnode_read_string(dev_ofnode(dev), propname);
99}
100
Simon Glass2f9a6122020-01-27 08:49:40 -0700101bool dev_read_bool(const struct udevice *dev, const char *propname)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600102{
103 return ofnode_read_bool(dev_ofnode(dev), propname);
104}
105
Simon Glass2f9a6122020-01-27 08:49:40 -0700106ofnode dev_read_subnode(const struct udevice *dev, const char *subnode_name)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600107{
108 return ofnode_find_subnode(dev_ofnode(dev), subnode_name);
109}
110
Simon Glass2f9a6122020-01-27 08:49:40 -0700111ofnode dev_read_first_subnode(const struct udevice *dev)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600112{
113 return ofnode_first_subnode(dev_ofnode(dev));
114}
115
116ofnode dev_read_next_subnode(ofnode node)
117{
118 return ofnode_next_subnode(node);
119}
120
Simon Glass2f9a6122020-01-27 08:49:40 -0700121int dev_read_size(const struct udevice *dev, const char *propname)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600122{
123 return ofnode_read_size(dev_ofnode(dev), propname);
124}
125
Simon Glass2f9a6122020-01-27 08:49:40 -0700126fdt_addr_t dev_read_addr_index(const struct udevice *dev, int index)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600127{
128 if (ofnode_is_np(dev_ofnode(dev)))
129 return ofnode_get_addr_index(dev_ofnode(dev), index);
130 else
131 return devfdt_get_addr_index(dev, index);
132}
133
Simon Glass2f9a6122020-01-27 08:49:40 -0700134fdt_addr_t dev_read_addr_size_index(const struct udevice *dev, int index,
Sekhar Norif677c6f2019-08-01 19:12:56 +0530135 fdt_size_t *size)
136{
137 if (ofnode_is_np(dev_ofnode(dev)))
138 return ofnode_get_addr_size_index(dev_ofnode(dev), index, size);
139 else
140 return devfdt_get_addr_size_index(dev, index, size);
141}
142
Simon Glass2f9a6122020-01-27 08:49:40 -0700143void *dev_remap_addr_index(const struct udevice *dev, int index)
Álvaro Fernández Rojas670361292018-04-29 21:56:54 +0200144{
145 fdt_addr_t addr = dev_read_addr_index(dev, index);
146
147 if (addr == FDT_ADDR_T_NONE)
148 return NULL;
149
150 return map_physmem(addr, 0, MAP_NOCACHE);
151}
152
Simon Glass2f9a6122020-01-27 08:49:40 -0700153fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name)
Álvaro Fernández Rojasa3181152018-12-03 19:37:09 +0100154{
155 int index = dev_read_stringlist_search(dev, "reg-names", name);
156
157 if (index < 0)
158 return FDT_ADDR_T_NONE;
159 else
160 return dev_read_addr_index(dev, index);
161}
162
Simon Glass2f9a6122020-01-27 08:49:40 -0700163fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name,
Sekhar Norif677c6f2019-08-01 19:12:56 +0530164 fdt_size_t *size)
165{
166 int index = dev_read_stringlist_search(dev, "reg-names", name);
167
168 if (index < 0)
169 return FDT_ADDR_T_NONE;
170 else
171 return dev_read_addr_size_index(dev, index, size);
172}
173
Simon Glass2f9a6122020-01-27 08:49:40 -0700174void *dev_remap_addr_name(const struct udevice *dev, const char *name)
Álvaro Fernández Rojasa3181152018-12-03 19:37:09 +0100175{
176 fdt_addr_t addr = dev_read_addr_name(dev, name);
177
178 if (addr == FDT_ADDR_T_NONE)
179 return NULL;
180
181 return map_physmem(addr, 0, MAP_NOCACHE);
182}
183
Simon Glass2f9a6122020-01-27 08:49:40 -0700184fdt_addr_t dev_read_addr(const struct udevice *dev)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600185{
186 return dev_read_addr_index(dev, 0);
187}
188
Simon Glass2f9a6122020-01-27 08:49:40 -0700189void *dev_read_addr_ptr(const struct udevice *dev)
Philipp Tomsich7719b392017-09-11 22:04:12 +0200190{
191 fdt_addr_t addr = dev_read_addr(dev);
192
Sean Anderson42db70b2020-06-24 06:41:13 -0400193 return (addr == FDT_ADDR_T_NONE) ? NULL : (void *)(uintptr_t)addr;
Philipp Tomsich7719b392017-09-11 22:04:12 +0200194}
195
Simon Glass2f9a6122020-01-27 08:49:40 -0700196void *dev_remap_addr(const struct udevice *dev)
Álvaro Fernández Rojas670361292018-04-29 21:56:54 +0200197{
198 return dev_remap_addr_index(dev, 0);
199}
200
Simon Glass2f9a6122020-01-27 08:49:40 -0700201fdt_addr_t dev_read_addr_size(const struct udevice *dev, const char *property,
Mario Six6eac2222018-01-15 11:07:18 +0100202 fdt_size_t *sizep)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600203{
204 return ofnode_get_addr_size(dev_ofnode(dev), property, sizep);
205}
206
Simon Glass2f9a6122020-01-27 08:49:40 -0700207const char *dev_read_name(const struct udevice *dev)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600208{
209 return ofnode_get_name(dev_ofnode(dev));
210}
211
Simon Glass2f9a6122020-01-27 08:49:40 -0700212int dev_read_stringlist_search(const struct udevice *dev, const char *property,
Mario Six6eac2222018-01-15 11:07:18 +0100213 const char *string)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600214{
215 return ofnode_stringlist_search(dev_ofnode(dev), property, string);
216}
217
Simon Glass2f9a6122020-01-27 08:49:40 -0700218int dev_read_string_index(const struct udevice *dev, const char *propname,
219 int index, const char **outp)
Jean-Jacques Hiblot8365ebd2017-09-21 17:03:09 +0200220{
221 return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp);
222}
223
Simon Glass2f9a6122020-01-27 08:49:40 -0700224int dev_read_string_count(const struct udevice *dev, const char *propname)
Jean-Jacques Hiblot8365ebd2017-09-21 17:03:09 +0200225{
226 return ofnode_read_string_count(dev_ofnode(dev), propname);
227}
228
Simon Glass9580bfc2021-10-23 17:26:07 -0600229int dev_read_string_list(const struct udevice *dev, const char *propname,
230 const char ***listp)
231{
232 return ofnode_read_string_list(dev_ofnode(dev), propname, listp);
233}
234
Simon Glass2f9a6122020-01-27 08:49:40 -0700235int dev_read_phandle_with_args(const struct udevice *dev, const char *list_name,
Mario Six6eac2222018-01-15 11:07:18 +0100236 const char *cells_name, int cell_count,
237 int index, struct ofnode_phandle_args *out_args)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600238{
239 return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
240 cells_name, cell_count, index,
241 out_args);
242}
243
Simon Glass2f9a6122020-01-27 08:49:40 -0700244int dev_count_phandle_with_args(const struct udevice *dev,
Patrick Delaunayd776a842020-09-25 09:41:14 +0200245 const char *list_name, const char *cells_name,
246 int cell_count)
Patrice Chotard99503c12017-11-29 09:06:10 +0100247{
248 return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
Patrick Delaunayd776a842020-09-25 09:41:14 +0200249 cells_name, cell_count);
Patrice Chotard99503c12017-11-29 09:06:10 +0100250}
251
Simon Glass2f9a6122020-01-27 08:49:40 -0700252int dev_read_addr_cells(const struct udevice *dev)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600253{
254 return ofnode_read_addr_cells(dev_ofnode(dev));
255}
256
Simon Glass2f9a6122020-01-27 08:49:40 -0700257int dev_read_size_cells(const struct udevice *dev)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600258{
259 return ofnode_read_size_cells(dev_ofnode(dev));
260}
261
Simon Glass2f9a6122020-01-27 08:49:40 -0700262int dev_read_simple_addr_cells(const struct udevice *dev)
Simon Glass4191dc12017-06-12 06:21:31 -0600263{
264 return ofnode_read_simple_addr_cells(dev_ofnode(dev));
265}
266
Simon Glass2f9a6122020-01-27 08:49:40 -0700267int dev_read_simple_size_cells(const struct udevice *dev)
Simon Glass4191dc12017-06-12 06:21:31 -0600268{
269 return ofnode_read_simple_size_cells(dev_ofnode(dev));
270}
271
Simon Glass2f9a6122020-01-27 08:49:40 -0700272int dev_read_phandle(const struct udevice *dev)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600273{
274 ofnode node = dev_ofnode(dev);
275
276 if (ofnode_is_np(node))
277 return ofnode_to_np(node)->phandle;
278 else
279 return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node));
280}
281
Simon Glass2f9a6122020-01-27 08:49:40 -0700282const void *dev_read_prop(const struct udevice *dev, const char *propname,
283 int *lenp)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600284{
Masahiro Yamada9cf85cb2017-06-22 16:54:05 +0900285 return ofnode_get_property(dev_ofnode(dev), propname, lenp);
Simon Glasscfdae5c2017-05-18 20:09:04 -0600286}
287
Patrick Delaunaycaee1552020-01-13 11:34:56 +0100288int dev_read_first_prop(const struct udevice *dev, struct ofprop *prop)
289{
Simon Glassfec058d2022-09-06 20:27:13 -0600290 return ofnode_first_property(dev_ofnode(dev), prop);
Patrick Delaunaycaee1552020-01-13 11:34:56 +0100291}
292
293int dev_read_next_prop(struct ofprop *prop)
294{
Simon Glassfec058d2022-09-06 20:27:13 -0600295 return ofnode_next_property(prop);
Patrick Delaunaycaee1552020-01-13 11:34:56 +0100296}
297
298const void *dev_read_prop_by_prop(struct ofprop *prop,
299 const char **propname, int *lenp)
300{
Simon Glassd0aff8b2022-09-06 20:27:14 -0600301 return ofprop_get_property(prop, propname, lenp);
Patrick Delaunaycaee1552020-01-13 11:34:56 +0100302}
303
Simon Glass2f9a6122020-01-27 08:49:40 -0700304int dev_read_alias_seq(const struct udevice *dev, int *devnump)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600305{
306 ofnode node = dev_ofnode(dev);
307 const char *uc_name = dev->uclass->uc_drv->name;
Marcel Ziswiler65c2bf62019-05-20 02:44:57 +0200308 int ret = -ENOTSUPP;
Simon Glasscfdae5c2017-05-18 20:09:04 -0600309
310 if (ofnode_is_np(node)) {
311 ret = of_alias_get_id(ofnode_to_np(node), uc_name);
Simon Glassa2b58552020-12-16 21:20:12 -0700312 if (ret >= 0) {
Simon Glasscfdae5c2017-05-18 20:09:04 -0600313 *devnump = ret;
Simon Glassa2b58552020-12-16 21:20:12 -0700314 ret = 0;
315 }
Simon Glasscfdae5c2017-05-18 20:09:04 -0600316 } else {
Marcel Ziswiler65c2bf62019-05-20 02:44:57 +0200317#if CONFIG_IS_ENABLED(OF_CONTROL)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600318 ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
319 ofnode_to_offset(node), devnump);
Marcel Ziswiler65c2bf62019-05-20 02:44:57 +0200320#endif
Simon Glasscfdae5c2017-05-18 20:09:04 -0600321 }
322
323 return ret;
324}
325
Simon Glass2f9a6122020-01-27 08:49:40 -0700326int dev_read_u32_array(const struct udevice *dev, const char *propname,
Simon Glasscfdae5c2017-05-18 20:09:04 -0600327 u32 *out_values, size_t sz)
328{
329 return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz);
330}
331
Simon Glass2f9a6122020-01-27 08:49:40 -0700332const uint8_t *dev_read_u8_array_ptr(const struct udevice *dev,
333 const char *propname, size_t sz)
Simon Glasscfdae5c2017-05-18 20:09:04 -0600334{
335 return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz);
336}
Simon Glassfa031f82017-06-12 06:21:30 -0600337
Simon Glass2f9a6122020-01-27 08:49:40 -0700338int dev_read_enabled(const struct udevice *dev)
Simon Glassfa031f82017-06-12 06:21:30 -0600339{
340 ofnode node = dev_ofnode(dev);
341
342 if (ofnode_is_np(node))
343 return of_device_is_available(ofnode_to_np(node));
344 else
345 return fdtdec_get_is_enabled(gd->fdt_blob,
346 ofnode_to_offset(node));
347}
Simon Glassf7bfcc42017-07-25 08:29:55 -0600348
Simon Glass2f9a6122020-01-27 08:49:40 -0700349int dev_read_resource(const struct udevice *dev, uint index,
350 struct resource *res)
Simon Glassf7bfcc42017-07-25 08:29:55 -0600351{
352 return ofnode_read_resource(dev_ofnode(dev), index, res);
353}
Masahiro Yamada4dada2c2017-08-26 01:12:30 +0900354
Simon Glass2f9a6122020-01-27 08:49:40 -0700355int dev_read_resource_byname(const struct udevice *dev, const char *name,
Masahiro Yamada4dada2c2017-08-26 01:12:30 +0900356 struct resource *res)
357{
358 return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
359}
Mario Sixaefac062018-01-15 11:07:19 +0100360
Simon Glass2f9a6122020-01-27 08:49:40 -0700361u64 dev_translate_address(const struct udevice *dev, const fdt32_t *in_addr)
Mario Sixaefac062018-01-15 11:07:19 +0100362{
363 return ofnode_translate_address(dev_ofnode(dev), in_addr);
364}
Michal Simekd0e30a02019-01-31 16:30:59 +0100365
Simon Glass2f9a6122020-01-27 08:49:40 -0700366u64 dev_translate_dma_address(const struct udevice *dev, const fdt32_t *in_addr)
Fabien Dessenne22236e02019-05-31 15:11:30 +0200367{
368 return ofnode_translate_dma_address(dev_ofnode(dev), in_addr);
369}
370
Nicolas Saenz Julienne50d2fa42021-01-12 13:55:22 +0100371int dev_get_dma_range(const struct udevice *dev, phys_addr_t *cpu,
372 dma_addr_t *bus, u64 *size)
373{
374 return ofnode_get_dma_range(dev_ofnode(dev), cpu, bus, size);
375}
376
Michal Simekd0e30a02019-01-31 16:30:59 +0100377int dev_read_alias_highest_id(const char *stem)
378{
379 if (of_live_active())
380 return of_alias_get_highest_id(stem);
381
382 return fdtdec_get_alias_highest_id(gd->fdt_blob, stem);
383}
Simon Glass23b27592019-09-15 12:08:58 -0600384
Simon Glass2f9a6122020-01-27 08:49:40 -0700385fdt_addr_t dev_read_addr_pci(const struct udevice *dev)
Simon Glass23b27592019-09-15 12:08:58 -0600386{
387 ulong addr;
388
389 addr = dev_read_addr(dev);
390 if (addr == FDT_ADDR_T_NONE && !of_live_active())
391 addr = devfdt_get_addr_pci(dev);
392
393 return addr;
394}
developerd93c8b42020-05-02 11:35:09 +0200395
396int dev_get_child_count(const struct udevice *dev)
397{
398 return ofnode_get_child_count(dev_ofnode(dev));
399}
Stefan Roese0a9ecc52020-08-05 13:56:11 +0200400
401int dev_read_pci_bus_range(const struct udevice *dev,
402 struct resource *res)
403{
404 const u32 *values;
405 int len;
406
407 values = dev_read_prop(dev, "bus-range", &len);
408 if (!values || len < sizeof(*values) * 2)
409 return -EINVAL;
410
411 res->start = *values++;
412 res->end = *values;
413
414 return 0;
415}
Dario Binacchi836cc9d2020-12-30 00:16:26 +0100416
417int dev_decode_display_timing(const struct udevice *dev, int index,
418 struct display_timing *config)
419{
420 return ofnode_decode_display_timing(dev_ofnode(dev), index, config);
421}
Marek Behúnf4f1ddc2022-04-07 00:32:57 +0200422
Nikhil M Jainff407062023-01-31 15:35:14 +0530423int dev_decode_panel_timing(const struct udevice *dev,
424 struct display_timing *config)
425{
426 return ofnode_decode_panel_timing(dev_ofnode(dev), config);
427}
428
Marek Behúnf4f1ddc2022-04-07 00:32:57 +0200429ofnode dev_get_phy_node(const struct udevice *dev)
430{
431 return ofnode_get_phy_node(dev_ofnode(dev));
432}
Marek Behúnbc194772022-04-07 00:33:01 +0200433
434phy_interface_t dev_read_phy_mode(const struct udevice *dev)
435{
436 return ofnode_read_phy_mode(dev_ofnode(dev));
437}