Skip to content

Commit 5421c00

Browse files
committed
perfection ofw bus dm
1 parent 4609da1 commit 5421c00

File tree

16 files changed

+1183
-230
lines changed

16 files changed

+1183
-230
lines changed

components/drivers/core/bus.c

+236-126
Large diffs are not rendered by default.

components/drivers/core/dm.c

+308-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2006-2023, RT-Thread Development Team
2+
* Copyright (c) 2006-2024, RT-Thread Development Team
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*
@@ -10,6 +10,10 @@
1010

1111
#include <rtthread.h>
1212

13+
#ifdef RT_USING_OFW
14+
#include <drivers/ofw_io.h>
15+
#include <drivers/ofw_irq.h>
16+
#endif
1317
#include <drivers/core/dm.h>
1418

1519
#ifdef RT_USING_SMP
@@ -56,10 +60,10 @@ struct prefix_track
5660
int uid;
5761
const char *prefix;
5862
};
59-
static struct rt_spinlock _prefix_nodes_lock;
63+
static struct rt_spinlock _prefix_nodes_lock = { 0 };
6064
static rt_list_t _prefix_nodes = RT_LIST_OBJECT_INIT(_prefix_nodes);
6165

62-
int rt_dm_set_dev_name_auto(rt_device_t dev, const char *prefix)
66+
int rt_dm_dev_set_name_auto(rt_device_t dev, const char *prefix)
6367
{
6468
int uid = -1;
6569
struct prefix_track *pt = RT_NULL;
@@ -104,17 +108,17 @@ int rt_dm_set_dev_name_auto(rt_device_t dev, const char *prefix)
104108
rt_spin_unlock(&_prefix_nodes_lock);
105109
}
106110

107-
return rt_dm_set_dev_name(dev, "%s%u", prefix, uid);
111+
return rt_dm_dev_set_name(dev, "%s%u", prefix, uid);
108112
}
109113

110-
int rt_dm_get_dev_name_id(rt_device_t dev)
114+
int rt_dm_dev_get_name_id(rt_device_t dev)
111115
{
112116
int id = 0, len;
113117
const char *name;
114118

115119
RT_ASSERT(dev != RT_NULL);
116120

117-
name = rt_dm_get_dev_name(dev);
121+
name = rt_dm_dev_get_name(dev);
118122
len = rt_strlen(name) - 1;
119123
name += len;
120124

@@ -137,7 +141,7 @@ int rt_dm_get_dev_name_id(rt_device_t dev)
137141
return id;
138142
}
139143

140-
int rt_dm_set_dev_name(rt_device_t dev, const char *format, ...)
144+
int rt_dm_dev_set_name(rt_device_t dev, const char *format, ...)
141145
{
142146
int n;
143147
va_list arg_ptr;
@@ -152,9 +156,305 @@ int rt_dm_set_dev_name(rt_device_t dev, const char *format, ...)
152156
return n;
153157
}
154158

155-
const char *rt_dm_get_dev_name(rt_device_t dev)
159+
const char *rt_dm_dev_get_name(rt_device_t dev)
156160
{
157161
RT_ASSERT(dev != RT_NULL);
158162

159163
return dev->parent.name;
160164
}
165+
166+
#ifdef RT_USING_OFW
167+
#define ofw_api_call(name, ...) rt_ofw_##name(__VA_ARGS__)
168+
#define ofw_api_call_ptr(name, ...) ofw_api_call(name, __VA_ARGS__)
169+
#else
170+
#define ofw_api_call(name, ...) (-RT_ENOSYS)
171+
#define ofw_api_call_ptr(name, ...) RT_NULL
172+
#endif
173+
174+
int rt_dm_dev_get_address_count(rt_device_t dev)
175+
{
176+
RT_ASSERT(dev != RT_NULL);
177+
178+
#ifdef RT_USING_OFW
179+
if (dev->ofw_node)
180+
{
181+
return ofw_api_call(get_address_count, dev->ofw_node);
182+
}
183+
#endif
184+
185+
return -RT_ENOSYS;
186+
}
187+
188+
rt_err_t rt_dm_dev_get_address(rt_device_t dev, int index,
189+
rt_uint64_t *out_address, rt_uint64_t *out_size)
190+
{
191+
RT_ASSERT(dev != RT_NULL);
192+
193+
#ifdef RT_USING_OFW
194+
if (dev->ofw_node)
195+
{
196+
return ofw_api_call(get_address, dev->ofw_node, index,
197+
out_address, out_size);
198+
}
199+
#endif
200+
201+
return -RT_ENOSYS;
202+
}
203+
204+
rt_err_t rt_dm_dev_get_address_by_name(rt_device_t dev, const char *name,
205+
rt_uint64_t *out_address, rt_uint64_t *out_size)
206+
{
207+
RT_ASSERT(dev != RT_NULL);
208+
#ifdef RT_USING_OFW
209+
if (dev->ofw_node)
210+
{
211+
return ofw_api_call(get_address_by_name, dev->ofw_node, name,
212+
out_address, out_size);
213+
}
214+
#endif
215+
216+
return -RT_ENOSYS;
217+
}
218+
219+
int rt_dm_dev_get_address_array(rt_device_t dev, int nr, rt_uint64_t *out_regs)
220+
{
221+
RT_ASSERT(dev != RT_NULL);
222+
223+
#ifdef RT_USING_OFW
224+
if (dev->ofw_node)
225+
{
226+
return ofw_api_call(get_address_array, dev->ofw_node, nr, out_regs);
227+
}
228+
#endif
229+
230+
return -RT_ENOSYS;
231+
}
232+
233+
void *rt_dm_dev_iomap(rt_device_t dev, int index)
234+
{
235+
RT_ASSERT(dev != RT_NULL);
236+
237+
#ifdef RT_USING_OFW
238+
if (dev->ofw_node)
239+
{
240+
return ofw_api_call_ptr(iomap, dev->ofw_node, index);
241+
}
242+
#endif
243+
244+
return RT_NULL;
245+
}
246+
247+
void *rt_dm_dev_iomap_by_name(rt_device_t dev, const char *name)
248+
{
249+
RT_ASSERT(dev != RT_NULL);
250+
251+
#ifdef RT_USING_OFW
252+
if (dev->ofw_node)
253+
{
254+
return ofw_api_call_ptr(iomap_by_name, dev->ofw_node, name);
255+
}
256+
#endif
257+
258+
return RT_NULL;
259+
}
260+
261+
int rt_dm_dev_get_irq_count(rt_device_t dev)
262+
{
263+
RT_ASSERT(dev != RT_NULL);
264+
265+
#ifdef RT_USING_OFW
266+
if (dev->ofw_node)
267+
{
268+
return ofw_api_call(get_irq_count, dev->ofw_node);
269+
}
270+
#endif
271+
272+
return -RT_ENOSYS;
273+
}
274+
275+
int rt_dm_dev_get_irq(rt_device_t dev, int index)
276+
{
277+
RT_ASSERT(dev != RT_NULL);
278+
279+
#ifdef RT_USING_OFW
280+
if (dev->ofw_node)
281+
{
282+
return ofw_api_call(get_irq, dev->ofw_node, index);
283+
}
284+
#endif
285+
286+
return -RT_ENOSYS;
287+
}
288+
289+
int rt_dm_dev_get_irq_by_name(rt_device_t dev, const char *name)
290+
{
291+
RT_ASSERT(dev != RT_NULL);
292+
293+
#ifdef RT_USING_OFW
294+
if (dev->ofw_node)
295+
{
296+
return ofw_api_call(get_irq_by_name, dev->ofw_node, name);
297+
}
298+
#endif
299+
300+
return -RT_ENOSYS;
301+
}
302+
303+
void rt_dm_dev_bind_fwdata(rt_device_t dev, void *fw_np, void *data)
304+
{
305+
RT_ASSERT(dev != RT_NULL);
306+
307+
#ifdef RT_USING_OFW
308+
if (!dev->ofw_node && fw_np)
309+
{
310+
dev->ofw_node = fw_np;
311+
rt_ofw_data(fw_np) = data;
312+
}
313+
314+
RT_ASSERT(dev->ofw_node != RT_NULL);
315+
316+
rt_ofw_data(dev->ofw_node) = data;
317+
#endif
318+
}
319+
320+
void rt_dm_dev_unbind_fwdata(rt_device_t dev, void *fw_np)
321+
{
322+
RT_ASSERT(dev!= RT_NULL);
323+
324+
#ifdef RT_USING_OFW
325+
void *dev_fw_np;
326+
327+
if (!dev->ofw_node && fw_np)
328+
{
329+
dev_fw_np = fw_np;
330+
rt_ofw_data(fw_np) = RT_NULL;
331+
}
332+
333+
RT_ASSERT(dev_fw_np != RT_NULL);
334+
335+
rt_ofw_data(dev_fw_np) = RT_NULL;
336+
#endif
337+
}
338+
339+
int rt_dm_dev_prop_read_u8_array_index(rt_device_t dev, const char *propname,
340+
int index, int nr, rt_uint8_t *out_values)
341+
{
342+
RT_ASSERT(dev != RT_NULL);
343+
344+
#ifdef RT_UISNG_OFW
345+
if (dev->ofw_node)
346+
{
347+
return ofw_api_call(prop_read_u8_array_index, dev->ofw_node, propname,
348+
index, nr, out_value);
349+
}
350+
#endif
351+
352+
return -RT_ENOSYS;
353+
}
354+
355+
int rt_dm_dev_prop_read_u16_array_index(rt_device_t dev, const char *propname,
356+
int index, int nr, rt_uint16_t *out_values)
357+
{
358+
RT_ASSERT(dev != RT_NULL);
359+
360+
#ifdef RT_USING_OFW
361+
if (dev->ofw_node)
362+
{
363+
return ofw_api_call(prop_read_u16_array_index, dev->ofw_node, propname,
364+
index, nr, out_values);
365+
}
366+
#endif
367+
368+
return -RT_ENOSYS;
369+
}
370+
371+
int rt_dm_dev_prop_read_u32_array_index(rt_device_t dev, const char *propname,
372+
int index, int nr, rt_uint32_t *out_values)
373+
{
374+
RT_ASSERT(dev != RT_NULL);
375+
376+
#ifdef RT_USING_OFW
377+
if (dev->ofw_node)
378+
{
379+
return ofw_api_call(prop_read_u32_array_index, dev->ofw_node, propname,
380+
index, nr, out_values);
381+
}
382+
#endif
383+
384+
return -RT_ENOSYS;
385+
}
386+
387+
int rt_dm_dev_prop_read_u64_array_index(rt_device_t dev, const char *propname,
388+
int index, int nr, rt_uint64_t *out_values)
389+
{
390+
RT_ASSERT(dev != RT_NULL);
391+
392+
#ifdef RT_USING_OFW
393+
if (dev->ofw_node)
394+
{
395+
return ofw_api_call(prop_read_u64_array_index, dev->ofw_node, propname,
396+
index, nr, out_values);
397+
}
398+
#endif
399+
400+
return -RT_ENOSYS;
401+
}
402+
403+
int rt_dm_dev_prop_read_string_array_index(rt_device_t dev, const char *propname,
404+
int index, int nr, const char **out_strings)
405+
{
406+
RT_ASSERT(dev != RT_NULL);
407+
408+
#ifdef RT_USING_OFW
409+
if (dev->ofw_node)
410+
{
411+
return ofw_api_call(prop_read_string_array_index, dev->ofw_node, propname,
412+
index, nr, out_strings);
413+
}
414+
#endif
415+
416+
return -RT_ENOSYS;
417+
}
418+
419+
int rt_dm_dev_prop_count_of_size(rt_device_t dev, const char *propname, int size)
420+
{
421+
RT_ASSERT(dev != RT_NULL);
422+
423+
#ifdef RT_USING_OFW
424+
if (dev->ofw_node)
425+
{
426+
return ofw_api_call(prop_count_of_size, dev->ofw_node, propname, size);
427+
}
428+
#endif
429+
430+
return -RT_ENOSYS;
431+
}
432+
433+
int rt_dm_dev_prop_index_of_string(rt_device_t dev, const char *propname, const char *string)
434+
{
435+
RT_ASSERT(dev != RT_NULL);
436+
437+
#ifdef RT_USING_OFW
438+
if (dev->ofw_node)
439+
{
440+
return ofw_api_call(prop_index_of_string, dev->ofw_node, propname, string);
441+
}
442+
#endif
443+
444+
return -RT_ENOSYS;
445+
}
446+
447+
rt_bool_t rt_dm_dev_prop_read_bool(rt_device_t dev, const char *propname)
448+
{
449+
RT_ASSERT(dev != RT_NULL);
450+
451+
#ifdef RT_USING_OFW
452+
if (dev->ofw_node)
453+
{
454+
return ofw_api_call(prop_read_bool, dev->ofw_node, propname);
455+
}
456+
#endif
457+
458+
return RT_FALSE;
459+
}
460+

0 commit comments

Comments
 (0)