cf3c20ae |
1 | /* $OpenBSD: omap.c,v 1.9 2016/05/02 15:27:24 patrick Exp $ */ |
2 | /* |
3 | * Copyright (c) 2005,2008 Dale Rahn <drahn@openbsd.com> |
4 | * |
5 | * Permission to use, copy, modify, and distribute this software for any |
6 | * purpose with or without fee is hereby granted, provided that the above |
7 | * copyright notice and this permission notice appear in all copies. |
8 | * |
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
16 | */ |
17 | |
18 | #include <sys/param.h> |
19 | #include <sys/systm.h> |
20 | |
21 | #include <machine/bus.h> |
22 | |
23 | #include <arm/mainbus/mainbus.h> |
24 | #include <armv7/armv7/armv7var.h> |
25 | |
26 | int omap_match(struct device *, void *, void *); |
27 | void omap3_init(); |
28 | void omap4_init(); |
29 | void am335x_init(); |
30 | |
31 | struct cfattach omap_ca = { |
32 | sizeof(struct armv7_softc), omap_match, armv7_attach |
33 | }; |
34 | |
35 | struct cfdriver omap_cd = { |
36 | NULL, "omap", DV_DULL |
37 | }; |
38 | |
39 | struct board_dev beagleboard_devs[] = { |
40 | { "prcm", 0 }, |
41 | { "intc", 0 }, |
42 | { "gptimer", 0 }, |
43 | { "gptimer", 1 }, |
44 | { "omdog", 0 }, |
45 | { "omgpio", 0 }, |
46 | { "omgpio", 1 }, |
47 | { "omgpio", 2 }, |
48 | { "omgpio", 3 }, |
49 | { "omgpio", 4 }, |
50 | { "omgpio", 5 }, |
51 | { "ommmc", 0 }, /* HSMMC1 */ |
52 | { "com", 2 }, /* UART3 */ |
53 | { NULL, 0 } |
54 | }; |
55 | |
56 | struct board_dev beaglebone_devs[] = { |
57 | { "prcm", 0 }, |
58 | { "sitaracm", 0 }, |
59 | { "intc", 0 }, |
60 | { "edma", 0 }, |
61 | { "dmtimer", 0 }, |
62 | { "dmtimer", 1 }, |
63 | { "omdog", 0 }, |
64 | { "omgpio", 0 }, |
65 | { "omgpio", 1 }, |
66 | { "omgpio", 2 }, |
67 | { "omgpio", 3 }, |
68 | { "tiiic", 0 }, |
69 | { "tiiic", 1 }, |
70 | { "tiiic", 2 }, |
71 | { "ommmc", 0 }, /* HSMMC0 */ |
72 | { "ommmc", 1 }, /* HSMMC1 */ |
73 | { "com", 0 }, /* UART0 */ |
74 | { "cpsw", 0 }, |
75 | { NULL, 0 } |
76 | }; |
77 | |
78 | struct board_dev overo_devs[] = { |
79 | { "prcm", 0 }, |
80 | { "intc", 0 }, |
81 | { "gptimer", 0 }, |
82 | { "gptimer", 1 }, |
83 | { "omdog", 0 }, |
84 | { "omgpio", 0 }, |
85 | { "omgpio", 1 }, |
86 | { "omgpio", 2 }, |
87 | { "omgpio", 3 }, |
88 | { "omgpio", 4 }, |
89 | { "omgpio", 5 }, |
90 | { "ommmc", 0 }, /* HSMMC1 */ |
91 | { "com", 2 }, /* UART3 */ |
92 | { NULL, 0 } |
93 | }; |
94 | |
95 | struct board_dev pandaboard_devs[] = { |
96 | { "omapid", 0 }, |
97 | { "prcm", 0 }, |
98 | { "omdog", 0 }, |
99 | { "omgpio", 0 }, |
100 | { "omgpio", 1 }, |
101 | { "omgpio", 2 }, |
102 | { "omgpio", 3 }, |
103 | { "omgpio", 4 }, |
104 | { "omgpio", 5 }, |
105 | { "ommmc", 0 }, /* HSMMC1 */ |
106 | { "com", 2 }, /* UART3 */ |
107 | { "ehci", 0 }, |
108 | { NULL, 0 } |
109 | }; |
110 | |
111 | struct armv7_board omap_boards[] = { |
112 | { |
113 | BOARD_ID_OMAP3_BEAGLE, |
114 | "TI OMAP3 BeagleBoard", |
115 | beagleboard_devs, |
116 | omap3_init, |
117 | }, |
118 | { |
119 | BOARD_ID_AM335X_BEAGLEBONE, |
120 | "TI AM335x BeagleBone", |
121 | beaglebone_devs, |
122 | am335x_init, |
123 | }, |
124 | { |
125 | BOARD_ID_OMAP3_OVERO, |
126 | "Gumstix OMAP3 Overo", |
127 | overo_devs, |
128 | omap3_init, |
129 | }, |
130 | { |
131 | BOARD_ID_OMAP4_PANDA, |
132 | "TI OMAP4 PandaBoard", |
133 | pandaboard_devs, |
134 | omap4_init, |
135 | }, |
136 | { 0, NULL, NULL, NULL }, |
137 | }; |
138 | |
139 | struct board_dev * |
140 | omap_board_devs(void) |
141 | { |
142 | int i; |
143 | |
144 | for (i = 0; omap_boards[i].name != NULL; i++) { |
145 | if (omap_boards[i].board_id == board_id) |
146 | return (omap_boards[i].devs); |
147 | } |
148 | return (NULL); |
149 | } |
150 | |
151 | void |
152 | omap_board_init(void) |
153 | { |
154 | int i; |
155 | |
156 | for (i = 0; omap_boards[i].name != NULL; i++) { |
157 | if (omap_boards[i].board_id == board_id) { |
158 | omap_boards[i].init(); |
159 | break; |
160 | } |
161 | } |
162 | } |
163 | |
164 | const char * |
165 | omap_board_name(void) |
166 | { |
167 | int i; |
168 | |
169 | for (i = 0; omap_boards[i].name != NULL; i++) { |
170 | if (omap_boards[i].board_id == board_id) |
171 | return (omap_boards[i].name); |
172 | } |
173 | return (NULL); |
174 | } |
175 | |
176 | int |
177 | omap_match(struct device *parent, void *cfdata, void *aux) |
178 | { |
179 | union mainbus_attach_args *ma = (union mainbus_attach_args *)aux; |
180 | struct cfdata *cf = (struct cfdata *)cfdata; |
181 | |
182 | if (ma->ma_name == NULL) |
183 | return (0); |
184 | |
185 | if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0) |
186 | return (0); |
187 | |
188 | return (omap_board_devs() != NULL); |
189 | } |