Blame view

drivers/core/read.c 7.82 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
47a0fd3ba   Simon Glass   dm: core: Impleme...
2
3
4
  /*
   * Copyright (c) 2017 Google, Inc
   * Written by Simon Glass <sjg@chromium.org>
47a0fd3ba   Simon Glass   dm: core: Impleme...
5
   */
30a90f56c   Álvaro Fernández Rojas   dm: core: add fun...
6
7
  #include <asm/types.h>
  #include <asm/io.h>
47a0fd3ba   Simon Glass   dm: core: Impleme...
8
9
  #include <common.h>
  #include <dm.h>
8ccc2db6e   Simon Glass   dm: core: Correct...
10
  #include <mapmem.h>
47a0fd3ba   Simon Glass   dm: core: Impleme...
11
  #include <dm/of_access.h>
88b3a37ea   Simon Glass   dm: core: Use con...
12
  int dev_read_u32(const struct udevice *dev, const char *propname, u32 *outp)
3ab48f622   Masahiro Yamada   dm: add dev_read_...
13
14
15
  {
  	return ofnode_read_u32(dev_ofnode(dev), propname, outp);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
16
17
  int dev_read_u32_default(const struct udevice *dev, const char *propname,
  			 int def)
47a0fd3ba   Simon Glass   dm: core: Impleme...
18
19
20
  {
  	return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
21
  int dev_read_s32(const struct udevice *dev, const char *propname, s32 *outp)
a1b17e4f4   Simon Glass   dm: core: Add a f...
22
23
24
  {
  	return ofnode_read_u32(dev_ofnode(dev), propname, (u32 *)outp);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
25
26
  int dev_read_s32_default(const struct udevice *dev, const char *propname,
  			 int def)
a1b17e4f4   Simon Glass   dm: core: Add a f...
27
28
29
  {
  	return ofnode_read_u32_default(dev_ofnode(dev), propname, def);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
30
  int dev_read_u32u(const struct udevice *dev, const char *propname, uint *outp)
a1b17e4f4   Simon Glass   dm: core: Add a f...
31
32
33
34
35
36
37
38
39
40
41
  {
  	u32 val;
  	int ret;
  
  	ret = ofnode_read_u32(dev_ofnode(dev), propname, &val);
  	if (ret)
  		return ret;
  	*outp = val;
  
  	return 0;
  }
88b3a37ea   Simon Glass   dm: core: Use con...
42
  int dev_read_u64(const struct udevice *dev, const char *propname, u64 *outp)
3f3d77158   T Karthik Reddy   dm: core: Add fun...
43
44
45
  {
  	return ofnode_read_u64(dev_ofnode(dev), propname, outp);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
46
47
  u64 dev_read_u64_default(const struct udevice *dev, const char *propname,
  			 u64 def)
3f3d77158   T Karthik Reddy   dm: core: Add fun...
48
49
50
  {
  	return ofnode_read_u64_default(dev_ofnode(dev), propname, def);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
51
  const char *dev_read_string(const struct udevice *dev, const char *propname)
47a0fd3ba   Simon Glass   dm: core: Impleme...
52
53
54
  {
  	return ofnode_read_string(dev_ofnode(dev), propname);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
55
  bool dev_read_bool(const struct udevice *dev, const char *propname)
47a0fd3ba   Simon Glass   dm: core: Impleme...
56
57
58
  {
  	return ofnode_read_bool(dev_ofnode(dev), propname);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
59
  ofnode dev_read_subnode(const struct udevice *dev, const char *subnode_name)
47a0fd3ba   Simon Glass   dm: core: Impleme...
60
61
62
  {
  	return ofnode_find_subnode(dev_ofnode(dev), subnode_name);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
63
  ofnode dev_read_first_subnode(const struct udevice *dev)
47a0fd3ba   Simon Glass   dm: core: Impleme...
64
65
66
67
68
69
70
71
  {
  	return ofnode_first_subnode(dev_ofnode(dev));
  }
  
  ofnode dev_read_next_subnode(ofnode node)
  {
  	return ofnode_next_subnode(node);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
72
  int dev_read_size(const struct udevice *dev, const char *propname)
47a0fd3ba   Simon Glass   dm: core: Impleme...
73
74
75
  {
  	return ofnode_read_size(dev_ofnode(dev), propname);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
76
  fdt_addr_t dev_read_addr_index(const struct udevice *dev, int index)
47a0fd3ba   Simon Glass   dm: core: Impleme...
77
78
79
80
81
82
  {
  	if (ofnode_is_np(dev_ofnode(dev)))
  		return ofnode_get_addr_index(dev_ofnode(dev), index);
  	else
  		return devfdt_get_addr_index(dev, index);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
83
  fdt_addr_t dev_read_addr_size_index(const struct udevice *dev, int index,
f5b904796   Sekhar Nori   dm: core: add sup...
84
85
86
87
88
89
90
  				    fdt_size_t *size)
  {
  	if (ofnode_is_np(dev_ofnode(dev)))
  		return ofnode_get_addr_size_index(dev_ofnode(dev), index, size);
  	else
  		return devfdt_get_addr_size_index(dev, index, size);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
91
  void *dev_remap_addr_index(const struct udevice *dev, int index)
30a90f56c   Álvaro Fernández Rojas   dm: core: add fun...
92
93
94
95
96
97
98
99
  {
  	fdt_addr_t addr = dev_read_addr_index(dev, index);
  
  	if (addr == FDT_ADDR_T_NONE)
  		return NULL;
  
  	return map_physmem(addr, 0, MAP_NOCACHE);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
100
  fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name)
795988204   Álvaro Fernández Rojas   dm: core: add fun...
101
102
103
104
105
106
107
108
  {
  	int index = dev_read_stringlist_search(dev, "reg-names", name);
  
  	if (index < 0)
  		return FDT_ADDR_T_NONE;
  	else
  		return dev_read_addr_index(dev, index);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
109
  fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name,
f5b904796   Sekhar Nori   dm: core: add sup...
110
111
112
113
114
115
116
117
118
  				   fdt_size_t *size)
  {
  	int index = dev_read_stringlist_search(dev, "reg-names", name);
  
  	if (index < 0)
  		return FDT_ADDR_T_NONE;
  	else
  		return dev_read_addr_size_index(dev, index, size);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
119
  void *dev_remap_addr_name(const struct udevice *dev, const char *name)
795988204   Álvaro Fernández Rojas   dm: core: add fun...
120
121
122
123
124
125
126
127
  {
  	fdt_addr_t addr = dev_read_addr_name(dev, name);
  
  	if (addr == FDT_ADDR_T_NONE)
  		return NULL;
  
  	return map_physmem(addr, 0, MAP_NOCACHE);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
128
  fdt_addr_t dev_read_addr(const struct udevice *dev)
47a0fd3ba   Simon Glass   dm: core: Impleme...
129
130
131
  {
  	return dev_read_addr_index(dev, 0);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
132
  void *dev_read_addr_ptr(const struct udevice *dev)
c131c8bca   Philipp Tomsich   dm: core: add dev...
133
134
  {
  	fdt_addr_t addr = dev_read_addr(dev);
8ccc2db6e   Simon Glass   dm: core: Correct...
135
  	return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0);
c131c8bca   Philipp Tomsich   dm: core: add dev...
136
  }
88b3a37ea   Simon Glass   dm: core: Use con...
137
  void *dev_remap_addr(const struct udevice *dev)
30a90f56c   Álvaro Fernández Rojas   dm: core: add fun...
138
139
140
  {
  	return dev_remap_addr_index(dev, 0);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
141
  fdt_addr_t dev_read_addr_size(const struct udevice *dev, const char *property,
83a462a5e   Mario Six   core: read: Fix s...
142
  			      fdt_size_t *sizep)
47a0fd3ba   Simon Glass   dm: core: Impleme...
143
144
145
  {
  	return ofnode_get_addr_size(dev_ofnode(dev), property, sizep);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
146
  const char *dev_read_name(const struct udevice *dev)
47a0fd3ba   Simon Glass   dm: core: Impleme...
147
148
149
  {
  	return ofnode_get_name(dev_ofnode(dev));
  }
88b3a37ea   Simon Glass   dm: core: Use con...
150
  int dev_read_stringlist_search(const struct udevice *dev, const char *property,
83a462a5e   Mario Six   core: read: Fix s...
151
  			       const char *string)
47a0fd3ba   Simon Glass   dm: core: Impleme...
152
153
154
  {
  	return ofnode_stringlist_search(dev_ofnode(dev), property, string);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
155
156
  int dev_read_string_index(const struct udevice *dev, const char *propname,
  			  int index, const char **outp)
b5a144a50   Jean-Jacques Hiblot   dm: core: Add fun...
157
158
159
  {
  	return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
160
  int dev_read_string_count(const struct udevice *dev, const char *propname)
b5a144a50   Jean-Jacques Hiblot   dm: core: Add fun...
161
162
163
  {
  	return ofnode_read_string_count(dev_ofnode(dev), propname);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
164
  int dev_read_phandle_with_args(const struct udevice *dev, const char *list_name,
83a462a5e   Mario Six   core: read: Fix s...
165
166
  			       const char *cells_name, int cell_count,
  			       int index, struct ofnode_phandle_args *out_args)
47a0fd3ba   Simon Glass   dm: core: Impleme...
167
168
169
170
171
  {
  	return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name,
  					      cells_name, cell_count, index,
  					      out_args);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
172
173
  int dev_count_phandle_with_args(const struct udevice *dev,
  				const char *list_name, const char *cells_name)
ea8cd652a   Patrice Chotard   dm: core: add mis...
174
175
176
177
  {
  	return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name,
  					      cells_name);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
178
  int dev_read_addr_cells(const struct udevice *dev)
47a0fd3ba   Simon Glass   dm: core: Impleme...
179
180
181
  {
  	return ofnode_read_addr_cells(dev_ofnode(dev));
  }
88b3a37ea   Simon Glass   dm: core: Use con...
182
  int dev_read_size_cells(const struct udevice *dev)
47a0fd3ba   Simon Glass   dm: core: Impleme...
183
184
185
  {
  	return ofnode_read_size_cells(dev_ofnode(dev));
  }
88b3a37ea   Simon Glass   dm: core: Use con...
186
  int dev_read_simple_addr_cells(const struct udevice *dev)
878d68c0c   Simon Glass   dm: core: Add fun...
187
188
189
  {
  	return ofnode_read_simple_addr_cells(dev_ofnode(dev));
  }
88b3a37ea   Simon Glass   dm: core: Use con...
190
  int dev_read_simple_size_cells(const struct udevice *dev)
878d68c0c   Simon Glass   dm: core: Add fun...
191
192
193
  {
  	return ofnode_read_simple_size_cells(dev_ofnode(dev));
  }
88b3a37ea   Simon Glass   dm: core: Use con...
194
  int dev_read_phandle(const struct udevice *dev)
47a0fd3ba   Simon Glass   dm: core: Impleme...
195
196
197
198
199
200
201
202
  {
  	ofnode node = dev_ofnode(dev);
  
  	if (ofnode_is_np(node))
  		return ofnode_to_np(node)->phandle;
  	else
  		return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node));
  }
88b3a37ea   Simon Glass   dm: core: Use con...
203
204
  const void *dev_read_prop(const struct udevice *dev, const char *propname,
  			  int *lenp)
47a0fd3ba   Simon Glass   dm: core: Impleme...
205
  {
61e51babd   Masahiro Yamada   dm: ofnode: renam...
206
  	return ofnode_get_property(dev_ofnode(dev), propname, lenp);
47a0fd3ba   Simon Glass   dm: core: Impleme...
207
  }
88b3a37ea   Simon Glass   dm: core: Use con...
208
  int dev_read_alias_seq(const struct udevice *dev, int *devnump)
47a0fd3ba   Simon Glass   dm: core: Impleme...
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
  {
  	ofnode node = dev_ofnode(dev);
  	const char *uc_name = dev->uclass->uc_drv->name;
  	int ret;
  
  	if (ofnode_is_np(node)) {
  		ret = of_alias_get_id(ofnode_to_np(node), uc_name);
  		if (ret >= 0)
  			*devnump = ret;
  	} else {
  		ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name,
  					   ofnode_to_offset(node), devnump);
  	}
  
  	return ret;
  }
88b3a37ea   Simon Glass   dm: core: Use con...
225
  int dev_read_u32_array(const struct udevice *dev, const char *propname,
47a0fd3ba   Simon Glass   dm: core: Impleme...
226
227
228
229
  		       u32 *out_values, size_t sz)
  {
  	return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz);
  }
88b3a37ea   Simon Glass   dm: core: Use con...
230
231
  const uint8_t *dev_read_u8_array_ptr(const struct udevice *dev,
  				     const char *propname, size_t sz)
47a0fd3ba   Simon Glass   dm: core: Impleme...
232
233
234
  {
  	return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz);
  }
f7d6fcf7a   Simon Glass   dm: core: Add dev...
235

88b3a37ea   Simon Glass   dm: core: Use con...
236
  int dev_read_enabled(const struct udevice *dev)
f7d6fcf7a   Simon Glass   dm: core: Add dev...
237
238
239
240
241
242
243
244
245
  {
  	ofnode node = dev_ofnode(dev);
  
  	if (ofnode_is_np(node))
  		return of_device_is_available(ofnode_to_np(node));
  	else
  		return fdtdec_get_is_enabled(gd->fdt_blob,
  					     ofnode_to_offset(node));
  }
dcf988525   Simon Glass   dm: core: Add ofn...
246

88b3a37ea   Simon Glass   dm: core: Use con...
247
248
  int dev_read_resource(const struct udevice *dev, uint index,
  		      struct resource *res)
dcf988525   Simon Glass   dm: core: Add ofn...
249
250
251
  {
  	return ofnode_read_resource(dev_ofnode(dev), index, res);
  }
7b8b47bd2   Masahiro Yamada   ofnode: add {ofno...
252

88b3a37ea   Simon Glass   dm: core: Use con...
253
  int dev_read_resource_byname(const struct udevice *dev, const char *name,
7b8b47bd2   Masahiro Yamada   ofnode: add {ofno...
254
255
256
257
  			     struct resource *res)
  {
  	return ofnode_read_resource_byname(dev_ofnode(dev), name, res);
  }
147c60744   Mario Six   core: Add {ofnode...
258

88b3a37ea   Simon Glass   dm: core: Use con...
259
  u64 dev_translate_address(const struct udevice *dev, const fdt32_t *in_addr)
147c60744   Mario Six   core: Add {ofnode...
260
261
262
  {
  	return ofnode_translate_address(dev_ofnode(dev), in_addr);
  }
83e4c7e9f   Michal Simek   dm: core: Introdu...
263

88b3a37ea   Simon Glass   dm: core: Use con...
264
  u64 dev_translate_dma_address(const struct udevice *dev, const fdt32_t *in_addr)
641067fb0   Fabien Dessenne   dm: core: Introdu...
265
266
267
  {
  	return ofnode_translate_dma_address(dev_ofnode(dev), in_addr);
  }
83e4c7e9f   Michal Simek   dm: core: Introdu...
268
269
270
271
272
273
274
  int dev_read_alias_highest_id(const char *stem)
  {
  	if (of_live_active())
  		return of_alias_get_highest_id(stem);
  
  	return fdtdec_get_alias_highest_id(gd->fdt_blob, stem);
  }
33c215af4   Simon Glass   dm: pci: Add a fu...
275

88b3a37ea   Simon Glass   dm: core: Use con...
276
  fdt_addr_t dev_read_addr_pci(const struct udevice *dev)
33c215af4   Simon Glass   dm: pci: Add a fu...
277
278
279
280
281
282
283
284
285
  {
  	ulong addr;
  
  	addr = dev_read_addr(dev);
  	if (addr == FDT_ADDR_T_NONE && !of_live_active())
  		addr = devfdt_get_addr_pci(dev);
  
  	return addr;
  }