xref: /optee_os/core/include/kernel/dt.h (revision a4f139d7fc30f5de9b7cd822b83495b22597fd5b)
1*a4f139d7SJerome Forissier /*
2*a4f139d7SJerome Forissier  * Copyright (c) 2016, Linaro Limited
3*a4f139d7SJerome Forissier  * All rights reserved.
4*a4f139d7SJerome Forissier  *
5*a4f139d7SJerome Forissier  * Redistribution and use in source and binary forms, with or without
6*a4f139d7SJerome Forissier  * modification, are permitted provided that the following conditions are met:
7*a4f139d7SJerome Forissier  *
8*a4f139d7SJerome Forissier  * 1. Redistributions of source code must retain the above copyright notice,
9*a4f139d7SJerome Forissier  * this list of conditions and the following disclaimer.
10*a4f139d7SJerome Forissier  *
11*a4f139d7SJerome Forissier  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*a4f139d7SJerome Forissier  * this list of conditions and the following disclaimer in the documentation
13*a4f139d7SJerome Forissier  * and/or other materials provided with the distribution.
14*a4f139d7SJerome Forissier  *
15*a4f139d7SJerome Forissier  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16*a4f139d7SJerome Forissier  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*a4f139d7SJerome Forissier  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*a4f139d7SJerome Forissier  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19*a4f139d7SJerome Forissier  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*a4f139d7SJerome Forissier  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*a4f139d7SJerome Forissier  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*a4f139d7SJerome Forissier  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*a4f139d7SJerome Forissier  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*a4f139d7SJerome Forissier  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*a4f139d7SJerome Forissier  * POSSIBILITY OF SUCH DAMAGE.
26*a4f139d7SJerome Forissier  */
27*a4f139d7SJerome Forissier 
28*a4f139d7SJerome Forissier #ifndef KERNEL_DT_H
29*a4f139d7SJerome Forissier #define KERNEL_DT_H
30*a4f139d7SJerome Forissier 
31*a4f139d7SJerome Forissier #include <compiler.h>
32*a4f139d7SJerome Forissier #include <stdint.h>
33*a4f139d7SJerome Forissier #include <types_ext.h>
34*a4f139d7SJerome Forissier 
35*a4f139d7SJerome Forissier #if defined(CFG_DT)
36*a4f139d7SJerome Forissier 
37*a4f139d7SJerome Forissier /*
38*a4f139d7SJerome Forissier  * DT-aware drivers
39*a4f139d7SJerome Forissier  */
40*a4f139d7SJerome Forissier 
41*a4f139d7SJerome Forissier struct dt_device_match {
42*a4f139d7SJerome Forissier 	const char *compatible;
43*a4f139d7SJerome Forissier };
44*a4f139d7SJerome Forissier 
45*a4f139d7SJerome Forissier struct dt_driver {
46*a4f139d7SJerome Forissier 	const char *name;
47*a4f139d7SJerome Forissier 	const struct dt_device_match *match_table; /* null-terminated */
48*a4f139d7SJerome Forissier 	const void *driver;
49*a4f139d7SJerome Forissier };
50*a4f139d7SJerome Forissier 
51*a4f139d7SJerome Forissier #define __dt_driver __section(".rodata.dtdrv")
52*a4f139d7SJerome Forissier 
53*a4f139d7SJerome Forissier extern const struct dt_driver __rodata_dtdrv_start, __rodata_dtdrv_end;
54*a4f139d7SJerome Forissier 
55*a4f139d7SJerome Forissier /*
56*a4f139d7SJerome Forissier  * Find a driver that is suitable for the given DT node, that is, with
57*a4f139d7SJerome Forissier  * a matching "compatible" property.
58*a4f139d7SJerome Forissier  *
59*a4f139d7SJerome Forissier  * @fdt: pointer to the device tree
60*a4f139d7SJerome Forissier  * @offs: node offset
61*a4f139d7SJerome Forissier  */
62*a4f139d7SJerome Forissier const struct dt_driver *dt_find_compatible_driver(const void *fdt, int offs);
63*a4f139d7SJerome Forissier 
64*a4f139d7SJerome Forissier const struct dt_driver *__dt_driver_start(void);
65*a4f139d7SJerome Forissier 
66*a4f139d7SJerome Forissier const struct dt_driver *__dt_driver_end(void);
67*a4f139d7SJerome Forissier 
68*a4f139d7SJerome Forissier #else
69*a4f139d7SJerome Forissier 
70*a4f139d7SJerome Forissier static inline const struct dt_driver *__dt_driver_start(void)
71*a4f139d7SJerome Forissier {
72*a4f139d7SJerome Forissier 	return NULL;
73*a4f139d7SJerome Forissier }
74*a4f139d7SJerome Forissier 
75*a4f139d7SJerome Forissier static inline const struct dt_driver *__dt_driver_end(void)
76*a4f139d7SJerome Forissier {
77*a4f139d7SJerome Forissier 	return NULL;
78*a4f139d7SJerome Forissier }
79*a4f139d7SJerome Forissier 
80*a4f139d7SJerome Forissier static inline const struct dt_driver *dt_find_compatible_driver(
81*a4f139d7SJerome Forissier 					const void *fdt __unused,
82*a4f139d7SJerome Forissier 					int offs __unused)
83*a4f139d7SJerome Forissier {
84*a4f139d7SJerome Forissier 	return NULL;
85*a4f139d7SJerome Forissier }
86*a4f139d7SJerome Forissier 
87*a4f139d7SJerome Forissier #endif /* !CFG_DT */
88*a4f139d7SJerome Forissier 
89*a4f139d7SJerome Forissier #define for_each_dt_driver(drv) \
90*a4f139d7SJerome Forissier 	for (drv = __dt_driver_start(); drv < __dt_driver_end(); drv++)
91*a4f139d7SJerome Forissier 
92*a4f139d7SJerome Forissier #endif /* KERNEL_DT_H */
93