1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * OMAP cpu type detection
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2004, 2008 Nokia Corporation
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Copyright (C) 2009-11 Texas Instruments.
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Written by Tony Lindgren <tony.lindgren@nokia.com>
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * Added OMAP4/5 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com>
12*4882a593Smuzhiyun * Added DRA7xxx specific defines - Sricharan R<r.sricharan@ti.com>
13*4882a593Smuzhiyun */
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #include "omap24xx.h"
16*4882a593Smuzhiyun #include "omap34xx.h"
17*4882a593Smuzhiyun #include "omap44xx.h"
18*4882a593Smuzhiyun #include "ti81xx.h"
19*4882a593Smuzhiyun #include "am33xx.h"
20*4882a593Smuzhiyun #include "omap54xx.h"
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #ifndef __ASSEMBLY__
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #include <linux/bitops.h>
25*4882a593Smuzhiyun #include <linux/of.h>
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun * OMAP2+ is always defined as ARCH_MULTIPLATFORM in Kconfig
29*4882a593Smuzhiyun */
30*4882a593Smuzhiyun #undef MULTI_OMAP2
31*4882a593Smuzhiyun #define MULTI_OMAP2
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun * Omap device type i.e. EMU/HS/TST/GP/BAD
35*4882a593Smuzhiyun */
36*4882a593Smuzhiyun #define OMAP2_DEVICE_TYPE_TEST 0
37*4882a593Smuzhiyun #define OMAP2_DEVICE_TYPE_EMU 1
38*4882a593Smuzhiyun #define OMAP2_DEVICE_TYPE_SEC 2
39*4882a593Smuzhiyun #define OMAP2_DEVICE_TYPE_GP 3
40*4882a593Smuzhiyun #define OMAP2_DEVICE_TYPE_BAD 4
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun int omap_type(void);
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun * omap_rev bits:
46*4882a593Smuzhiyun * SoC id bits (0730, 1510, 1710, 2422...) [31:16]
47*4882a593Smuzhiyun * SoC revision (See _REV_ defined in cpu.h) [15:08]
48*4882a593Smuzhiyun * SoC class bits (15xx, 16xx, 24xx, 34xx...) [07:00]
49*4882a593Smuzhiyun */
50*4882a593Smuzhiyun unsigned int omap_rev(void);
51*4882a593Smuzhiyun
soc_is_omap(void)52*4882a593Smuzhiyun static inline int soc_is_omap(void)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun return omap_rev() != 0;
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun /*
58*4882a593Smuzhiyun * Get the SoC revision for OMAP devices
59*4882a593Smuzhiyun */
60*4882a593Smuzhiyun #define GET_OMAP_REVISION() ((omap_rev() >> 8) & 0xff)
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun /*
63*4882a593Smuzhiyun * Macros to group OMAP into cpu classes.
64*4882a593Smuzhiyun * These can be used in most places.
65*4882a593Smuzhiyun * soc_is_omap24xx(): True for OMAP2420, OMAP2422, OMAP2423, OMAP2430
66*4882a593Smuzhiyun * soc_is_omap242x(): True for OMAP2420, OMAP2422, OMAP2423
67*4882a593Smuzhiyun * soc_is_omap243x(): True for OMAP2430
68*4882a593Smuzhiyun * soc_is_omap343x(): True for OMAP3430
69*4882a593Smuzhiyun * soc_is_omap443x(): True for OMAP4430
70*4882a593Smuzhiyun * soc_is_omap446x(): True for OMAP4460
71*4882a593Smuzhiyun * soc_is_omap447x(): True for OMAP4470
72*4882a593Smuzhiyun * soc_is_omap543x(): True for OMAP5430, OMAP5432
73*4882a593Smuzhiyun */
74*4882a593Smuzhiyun #define GET_OMAP_CLASS (omap_rev() & 0xff)
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun #define IS_OMAP_CLASS(class, id) \
77*4882a593Smuzhiyun static inline int is_omap ##class (void) \
78*4882a593Smuzhiyun { \
79*4882a593Smuzhiyun return (GET_OMAP_CLASS == (id)) ? 1 : 0; \
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun #define GET_AM_CLASS ((omap_rev() >> 24) & 0xff)
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun #define IS_AM_CLASS(class, id) \
85*4882a593Smuzhiyun static inline int is_am ##class (void) \
86*4882a593Smuzhiyun { \
87*4882a593Smuzhiyun return (GET_AM_CLASS == (id)) ? 1 : 0; \
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun #define GET_TI_CLASS ((omap_rev() >> 24) & 0xff)
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun #define IS_TI_CLASS(class, id) \
93*4882a593Smuzhiyun static inline int is_ti ##class (void) \
94*4882a593Smuzhiyun { \
95*4882a593Smuzhiyun return (GET_TI_CLASS == (id)) ? 1 : 0; \
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun #define GET_DRA_CLASS ((omap_rev() >> 24) & 0xff)
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun #define IS_DRA_CLASS(class, id) \
101*4882a593Smuzhiyun static inline int is_dra ##class (void) \
102*4882a593Smuzhiyun { \
103*4882a593Smuzhiyun return (GET_DRA_CLASS == (id)) ? 1 : 0; \
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun #define GET_OMAP_SUBCLASS ((omap_rev() >> 20) & 0x0fff)
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun #define IS_OMAP_SUBCLASS(subclass, id) \
109*4882a593Smuzhiyun static inline int is_omap ##subclass (void) \
110*4882a593Smuzhiyun { \
111*4882a593Smuzhiyun return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0; \
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun #define IS_TI_SUBCLASS(subclass, id) \
115*4882a593Smuzhiyun static inline int is_ti ##subclass (void) \
116*4882a593Smuzhiyun { \
117*4882a593Smuzhiyun return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0; \
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun #define IS_AM_SUBCLASS(subclass, id) \
121*4882a593Smuzhiyun static inline int is_am ##subclass (void) \
122*4882a593Smuzhiyun { \
123*4882a593Smuzhiyun return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0; \
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun #define IS_DRA_SUBCLASS(subclass, id) \
127*4882a593Smuzhiyun static inline int is_dra ##subclass (void) \
128*4882a593Smuzhiyun { \
129*4882a593Smuzhiyun return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0; \
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun #define GET_DRA_PACKAGE (omap_rev() & 0xff)
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun #define IS_DRA_SUBCLASS_PACKAGE(subclass, package, id) \
135*4882a593Smuzhiyun static inline int is_dra ##subclass ##_ ##package (void) \
136*4882a593Smuzhiyun { \
137*4882a593Smuzhiyun return (is_dra ##subclass () && GET_DRA_PACKAGE == id) ? 1 : 0; \
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun IS_OMAP_CLASS(24xx, 0x24)
141*4882a593Smuzhiyun IS_OMAP_CLASS(34xx, 0x34)
142*4882a593Smuzhiyun IS_OMAP_CLASS(44xx, 0x44)
143*4882a593Smuzhiyun IS_AM_CLASS(35xx, 0x35)
144*4882a593Smuzhiyun IS_OMAP_CLASS(54xx, 0x54)
145*4882a593Smuzhiyun IS_AM_CLASS(33xx, 0x33)
146*4882a593Smuzhiyun IS_AM_CLASS(43xx, 0x43)
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun IS_TI_CLASS(81xx, 0x81)
149*4882a593Smuzhiyun IS_DRA_CLASS(7xx, 0x7)
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun IS_OMAP_SUBCLASS(242x, 0x242)
152*4882a593Smuzhiyun IS_OMAP_SUBCLASS(243x, 0x243)
153*4882a593Smuzhiyun IS_OMAP_SUBCLASS(343x, 0x343)
154*4882a593Smuzhiyun IS_OMAP_SUBCLASS(363x, 0x363)
155*4882a593Smuzhiyun IS_OMAP_SUBCLASS(443x, 0x443)
156*4882a593Smuzhiyun IS_OMAP_SUBCLASS(446x, 0x446)
157*4882a593Smuzhiyun IS_OMAP_SUBCLASS(447x, 0x447)
158*4882a593Smuzhiyun IS_OMAP_SUBCLASS(543x, 0x543)
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun IS_TI_SUBCLASS(816x, 0x816)
161*4882a593Smuzhiyun IS_TI_SUBCLASS(814x, 0x814)
162*4882a593Smuzhiyun IS_AM_SUBCLASS(335x, 0x335)
163*4882a593Smuzhiyun IS_AM_SUBCLASS(437x, 0x437)
164*4882a593Smuzhiyun IS_DRA_SUBCLASS(76x, 0x76)
165*4882a593Smuzhiyun IS_DRA_SUBCLASS_PACKAGE(76x, abz, 2)
166*4882a593Smuzhiyun IS_DRA_SUBCLASS_PACKAGE(76x, acd, 3)
167*4882a593Smuzhiyun IS_DRA_SUBCLASS(75x, 0x75)
168*4882a593Smuzhiyun IS_DRA_SUBCLASS(72x, 0x72)
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun #define soc_is_ti81xx() 0
171*4882a593Smuzhiyun #define soc_is_ti816x() 0
172*4882a593Smuzhiyun #define soc_is_ti814x() 0
173*4882a593Smuzhiyun #define soc_is_am35xx() 0
174*4882a593Smuzhiyun #define soc_is_am33xx() 0
175*4882a593Smuzhiyun #define soc_is_am335x() 0
176*4882a593Smuzhiyun #define soc_is_am43xx() 0
177*4882a593Smuzhiyun #define soc_is_am437x() 0
178*4882a593Smuzhiyun #define soc_is_omap44xx() 0
179*4882a593Smuzhiyun #define soc_is_omap443x() 0
180*4882a593Smuzhiyun #define soc_is_omap446x() 0
181*4882a593Smuzhiyun #define soc_is_omap447x() 0
182*4882a593Smuzhiyun #define soc_is_omap54xx() 0
183*4882a593Smuzhiyun #define soc_is_omap543x() 0
184*4882a593Smuzhiyun #define soc_is_dra7xx() 0
185*4882a593Smuzhiyun #define soc_is_dra76x() 0
186*4882a593Smuzhiyun #define soc_is_dra74x() 0
187*4882a593Smuzhiyun #define soc_is_dra72x() 0
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun #if defined(CONFIG_ARCH_OMAP2)
190*4882a593Smuzhiyun # define soc_is_omap24xx() is_omap24xx()
191*4882a593Smuzhiyun #else
192*4882a593Smuzhiyun # define soc_is_omap24xx() 0
193*4882a593Smuzhiyun #endif
194*4882a593Smuzhiyun #if defined(CONFIG_SOC_OMAP2420)
195*4882a593Smuzhiyun # define soc_is_omap242x() is_omap242x()
196*4882a593Smuzhiyun #else
197*4882a593Smuzhiyun # define soc_is_omap242x() 0
198*4882a593Smuzhiyun #endif
199*4882a593Smuzhiyun #if defined(CONFIG_SOC_OMAP2430)
200*4882a593Smuzhiyun # define soc_is_omap243x() is_omap243x()
201*4882a593Smuzhiyun #else
202*4882a593Smuzhiyun # define soc_is_omap243x() 0
203*4882a593Smuzhiyun #endif
204*4882a593Smuzhiyun #if defined(CONFIG_ARCH_OMAP3)
205*4882a593Smuzhiyun # define soc_is_omap34xx() is_omap34xx()
206*4882a593Smuzhiyun # define soc_is_omap343x() is_omap343x()
207*4882a593Smuzhiyun #else
208*4882a593Smuzhiyun # define soc_is_omap34xx() 0
209*4882a593Smuzhiyun # define soc_is_omap343x() 0
210*4882a593Smuzhiyun #endif
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun /*
213*4882a593Smuzhiyun * Macros to detect individual cpu types.
214*4882a593Smuzhiyun * These are only rarely needed.
215*4882a593Smuzhiyun * soc_is_omap2420(): True for OMAP2420
216*4882a593Smuzhiyun * soc_is_omap2422(): True for OMAP2422
217*4882a593Smuzhiyun * soc_is_omap2423(): True for OMAP2423
218*4882a593Smuzhiyun * soc_is_omap2430(): True for OMAP2430
219*4882a593Smuzhiyun * soc_is_omap3430(): True for OMAP3430
220*4882a593Smuzhiyun */
221*4882a593Smuzhiyun #define GET_OMAP_TYPE ((omap_rev() >> 16) & 0xffff)
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun #define IS_OMAP_TYPE(type, id) \
224*4882a593Smuzhiyun static inline int is_omap ##type (void) \
225*4882a593Smuzhiyun { \
226*4882a593Smuzhiyun return (GET_OMAP_TYPE == (id)) ? 1 : 0; \
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun IS_OMAP_TYPE(2420, 0x2420)
230*4882a593Smuzhiyun IS_OMAP_TYPE(2422, 0x2422)
231*4882a593Smuzhiyun IS_OMAP_TYPE(2423, 0x2423)
232*4882a593Smuzhiyun IS_OMAP_TYPE(2430, 0x2430)
233*4882a593Smuzhiyun IS_OMAP_TYPE(3430, 0x3430)
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun #define soc_is_omap2420() 0
236*4882a593Smuzhiyun #define soc_is_omap2422() 0
237*4882a593Smuzhiyun #define soc_is_omap2423() 0
238*4882a593Smuzhiyun #define soc_is_omap2430() 0
239*4882a593Smuzhiyun #define soc_is_omap3430() 0
240*4882a593Smuzhiyun #define soc_is_omap3630() 0
241*4882a593Smuzhiyun #define soc_is_omap5430() 0
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun /* These are needed for the common code */
244*4882a593Smuzhiyun #define soc_is_omap7xx() 0
245*4882a593Smuzhiyun #define soc_is_omap15xx() 0
246*4882a593Smuzhiyun #define soc_is_omap16xx() 0
247*4882a593Smuzhiyun #define soc_is_omap1510() 0
248*4882a593Smuzhiyun #define soc_is_omap1610() 0
249*4882a593Smuzhiyun #define soc_is_omap1611() 0
250*4882a593Smuzhiyun #define soc_is_omap1621() 0
251*4882a593Smuzhiyun #define soc_is_omap1710() 0
252*4882a593Smuzhiyun #define cpu_class_is_omap1() 0
253*4882a593Smuzhiyun #define cpu_class_is_omap2() 1
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun #if defined(CONFIG_ARCH_OMAP2)
256*4882a593Smuzhiyun # undef soc_is_omap2420
257*4882a593Smuzhiyun # undef soc_is_omap2422
258*4882a593Smuzhiyun # undef soc_is_omap2423
259*4882a593Smuzhiyun # undef soc_is_omap2430
260*4882a593Smuzhiyun # define soc_is_omap2420() is_omap2420()
261*4882a593Smuzhiyun # define soc_is_omap2422() is_omap2422()
262*4882a593Smuzhiyun # define soc_is_omap2423() is_omap2423()
263*4882a593Smuzhiyun # define soc_is_omap2430() is_omap2430()
264*4882a593Smuzhiyun #endif
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun #if defined(CONFIG_ARCH_OMAP3)
267*4882a593Smuzhiyun # undef soc_is_omap3430
268*4882a593Smuzhiyun # undef soc_is_ti81xx
269*4882a593Smuzhiyun # undef soc_is_ti816x
270*4882a593Smuzhiyun # undef soc_is_ti814x
271*4882a593Smuzhiyun # undef soc_is_am35xx
272*4882a593Smuzhiyun # define soc_is_omap3430() is_omap3430()
273*4882a593Smuzhiyun # undef soc_is_omap3630
274*4882a593Smuzhiyun # define soc_is_omap3630() is_omap363x()
275*4882a593Smuzhiyun # define soc_is_ti81xx() is_ti81xx()
276*4882a593Smuzhiyun # define soc_is_ti816x() is_ti816x()
277*4882a593Smuzhiyun # define soc_is_ti814x() is_ti814x()
278*4882a593Smuzhiyun # define soc_is_am35xx() is_am35xx()
279*4882a593Smuzhiyun #endif
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun # if defined(CONFIG_SOC_AM33XX)
282*4882a593Smuzhiyun # undef soc_is_am33xx
283*4882a593Smuzhiyun # undef soc_is_am335x
284*4882a593Smuzhiyun # define soc_is_am33xx() is_am33xx()
285*4882a593Smuzhiyun # define soc_is_am335x() is_am335x()
286*4882a593Smuzhiyun #endif
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun #ifdef CONFIG_SOC_AM43XX
289*4882a593Smuzhiyun # undef soc_is_am43xx
290*4882a593Smuzhiyun # undef soc_is_am437x
291*4882a593Smuzhiyun # define soc_is_am43xx() is_am43xx()
292*4882a593Smuzhiyun # define soc_is_am437x() is_am437x()
293*4882a593Smuzhiyun #endif
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun # if defined(CONFIG_ARCH_OMAP4)
296*4882a593Smuzhiyun # undef soc_is_omap44xx
297*4882a593Smuzhiyun # undef soc_is_omap443x
298*4882a593Smuzhiyun # undef soc_is_omap446x
299*4882a593Smuzhiyun # undef soc_is_omap447x
300*4882a593Smuzhiyun # define soc_is_omap44xx() is_omap44xx()
301*4882a593Smuzhiyun # define soc_is_omap443x() is_omap443x()
302*4882a593Smuzhiyun # define soc_is_omap446x() is_omap446x()
303*4882a593Smuzhiyun # define soc_is_omap447x() is_omap447x()
304*4882a593Smuzhiyun # endif
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun # if defined(CONFIG_SOC_OMAP5)
307*4882a593Smuzhiyun # undef soc_is_omap54xx
308*4882a593Smuzhiyun # undef soc_is_omap543x
309*4882a593Smuzhiyun # define soc_is_omap54xx() is_omap54xx()
310*4882a593Smuzhiyun # define soc_is_omap543x() is_omap543x()
311*4882a593Smuzhiyun #endif
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun #if defined(CONFIG_SOC_DRA7XX)
314*4882a593Smuzhiyun #undef soc_is_dra7xx
315*4882a593Smuzhiyun #undef soc_is_dra76x
316*4882a593Smuzhiyun #undef soc_is_dra76x_abz
317*4882a593Smuzhiyun #undef soc_is_dra76x_acd
318*4882a593Smuzhiyun #undef soc_is_dra74x
319*4882a593Smuzhiyun #undef soc_is_dra72x
320*4882a593Smuzhiyun #define soc_is_dra7xx() is_dra7xx()
321*4882a593Smuzhiyun #define soc_is_dra76x() is_dra76x()
322*4882a593Smuzhiyun #define soc_is_dra76x_abz() is_dra76x_abz()
323*4882a593Smuzhiyun #define soc_is_dra76x_acd() is_dra76x_acd()
324*4882a593Smuzhiyun #define soc_is_dra74x() is_dra75x()
325*4882a593Smuzhiyun #define soc_is_dra72x() is_dra72x()
326*4882a593Smuzhiyun #endif
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun /* Various silicon revisions for omap2 */
329*4882a593Smuzhiyun #define OMAP242X_CLASS 0x24200024
330*4882a593Smuzhiyun #define OMAP2420_REV_ES1_0 OMAP242X_CLASS
331*4882a593Smuzhiyun #define OMAP2420_REV_ES2_0 (OMAP242X_CLASS | (0x1 << 8))
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun #define OMAP243X_CLASS 0x24300024
334*4882a593Smuzhiyun #define OMAP2430_REV_ES1_0 OMAP243X_CLASS
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun #define OMAP343X_CLASS 0x34300034
337*4882a593Smuzhiyun #define OMAP3430_REV_ES1_0 OMAP343X_CLASS
338*4882a593Smuzhiyun #define OMAP3430_REV_ES2_0 (OMAP343X_CLASS | (0x1 << 8))
339*4882a593Smuzhiyun #define OMAP3430_REV_ES2_1 (OMAP343X_CLASS | (0x2 << 8))
340*4882a593Smuzhiyun #define OMAP3430_REV_ES3_0 (OMAP343X_CLASS | (0x3 << 8))
341*4882a593Smuzhiyun #define OMAP3430_REV_ES3_1 (OMAP343X_CLASS | (0x4 << 8))
342*4882a593Smuzhiyun #define OMAP3430_REV_ES3_1_2 (OMAP343X_CLASS | (0x5 << 8))
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun #define OMAP363X_CLASS 0x36300034
345*4882a593Smuzhiyun #define OMAP3630_REV_ES1_0 OMAP363X_CLASS
346*4882a593Smuzhiyun #define OMAP3630_REV_ES1_1 (OMAP363X_CLASS | (0x1 << 8))
347*4882a593Smuzhiyun #define OMAP3630_REV_ES1_2 (OMAP363X_CLASS | (0x2 << 8))
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun #define TI816X_CLASS 0x81600081
350*4882a593Smuzhiyun #define TI8168_REV_ES1_0 TI816X_CLASS
351*4882a593Smuzhiyun #define TI8168_REV_ES1_1 (TI816X_CLASS | (0x1 << 8))
352*4882a593Smuzhiyun #define TI8168_REV_ES2_0 (TI816X_CLASS | (0x2 << 8))
353*4882a593Smuzhiyun #define TI8168_REV_ES2_1 (TI816X_CLASS | (0x3 << 8))
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun #define TI814X_CLASS 0x81400081
356*4882a593Smuzhiyun #define TI8148_REV_ES1_0 TI814X_CLASS
357*4882a593Smuzhiyun #define TI8148_REV_ES2_0 (TI814X_CLASS | (0x1 << 8))
358*4882a593Smuzhiyun #define TI8148_REV_ES2_1 (TI814X_CLASS | (0x2 << 8))
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun #define AM35XX_CLASS 0x35170034
361*4882a593Smuzhiyun #define AM35XX_REV_ES1_0 AM35XX_CLASS
362*4882a593Smuzhiyun #define AM35XX_REV_ES1_1 (AM35XX_CLASS | (0x1 << 8))
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun #define AM335X_CLASS 0x33500033
365*4882a593Smuzhiyun #define AM335X_REV_ES1_0 AM335X_CLASS
366*4882a593Smuzhiyun #define AM335X_REV_ES2_0 (AM335X_CLASS | (0x1 << 8))
367*4882a593Smuzhiyun #define AM335X_REV_ES2_1 (AM335X_CLASS | (0x2 << 8))
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun #define AM437X_CLASS 0x43700000
370*4882a593Smuzhiyun #define AM437X_REV_ES1_0 (AM437X_CLASS | (0x10 << 8))
371*4882a593Smuzhiyun #define AM437X_REV_ES1_1 (AM437X_CLASS | (0x11 << 8))
372*4882a593Smuzhiyun #define AM437X_REV_ES1_2 (AM437X_CLASS | (0x12 << 8))
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun #define OMAP443X_CLASS 0x44300044
375*4882a593Smuzhiyun #define OMAP4430_REV_ES1_0 (OMAP443X_CLASS | (0x10 << 8))
376*4882a593Smuzhiyun #define OMAP4430_REV_ES2_0 (OMAP443X_CLASS | (0x20 << 8))
377*4882a593Smuzhiyun #define OMAP4430_REV_ES2_1 (OMAP443X_CLASS | (0x21 << 8))
378*4882a593Smuzhiyun #define OMAP4430_REV_ES2_2 (OMAP443X_CLASS | (0x22 << 8))
379*4882a593Smuzhiyun #define OMAP4430_REV_ES2_3 (OMAP443X_CLASS | (0x23 << 8))
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun #define OMAP446X_CLASS 0x44600044
382*4882a593Smuzhiyun #define OMAP4460_REV_ES1_0 (OMAP446X_CLASS | (0x10 << 8))
383*4882a593Smuzhiyun #define OMAP4460_REV_ES1_1 (OMAP446X_CLASS | (0x11 << 8))
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun #define OMAP447X_CLASS 0x44700044
386*4882a593Smuzhiyun #define OMAP4470_REV_ES1_0 (OMAP447X_CLASS | (0x10 << 8))
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun #define OMAP54XX_CLASS 0x54000054
389*4882a593Smuzhiyun #define OMAP5430_REV_ES2_0 (OMAP54XX_CLASS | (0x30 << 16) | (0x20 << 8))
390*4882a593Smuzhiyun #define OMAP5432_REV_ES2_0 (OMAP54XX_CLASS | (0x32 << 16) | (0x20 << 8))
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun #define DRA7XX_CLASS 0x07000000
393*4882a593Smuzhiyun #define DRA762_REV_ES1_0 (DRA7XX_CLASS | (0x62 << 16) | (0x10 << 8))
394*4882a593Smuzhiyun #define DRA762_ABZ_REV_ES1_0 (DRA762_REV_ES1_0 | (2 << 0))
395*4882a593Smuzhiyun #define DRA762_ACD_REV_ES1_0 (DRA762_REV_ES1_0 | (3 << 0))
396*4882a593Smuzhiyun #define DRA752_REV_ES1_0 (DRA7XX_CLASS | (0x52 << 16) | (0x10 << 8))
397*4882a593Smuzhiyun #define DRA752_REV_ES1_1 (DRA7XX_CLASS | (0x52 << 16) | (0x11 << 8))
398*4882a593Smuzhiyun #define DRA752_REV_ES2_0 (DRA7XX_CLASS | (0x52 << 16) | (0x20 << 8))
399*4882a593Smuzhiyun #define DRA722_REV_ES1_0 (DRA7XX_CLASS | (0x22 << 16) | (0x10 << 8))
400*4882a593Smuzhiyun #define DRA722_REV_ES2_0 (DRA7XX_CLASS | (0x22 << 16) | (0x20 << 8))
401*4882a593Smuzhiyun #define DRA722_REV_ES2_1 (DRA7XX_CLASS | (0x22 << 16) | (0x21 << 8))
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun void omap2xxx_check_revision(void);
404*4882a593Smuzhiyun void omap3xxx_check_revision(void);
405*4882a593Smuzhiyun void omap4xxx_check_revision(void);
406*4882a593Smuzhiyun void omap5xxx_check_revision(void);
407*4882a593Smuzhiyun void dra7xxx_check_revision(void);
408*4882a593Smuzhiyun void omap3xxx_check_features(void);
409*4882a593Smuzhiyun void ti81xx_check_features(void);
410*4882a593Smuzhiyun void am33xx_check_features(void);
411*4882a593Smuzhiyun void omap4xxx_check_features(void);
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun /*
414*4882a593Smuzhiyun * Runtime detection of OMAP3 features
415*4882a593Smuzhiyun *
416*4882a593Smuzhiyun * OMAP3_HAS_IO_CHAIN_CTRL: Some later members of the OMAP3 chip
417*4882a593Smuzhiyun * family have OS-level control over the I/O chain clock. This is
418*4882a593Smuzhiyun * to avoid a window during which wakeups could potentially be lost
419*4882a593Smuzhiyun * during powerdomain transitions. If this bit is set, it
420*4882a593Smuzhiyun * indicates that the chip does support OS-level control of this
421*4882a593Smuzhiyun * feature.
422*4882a593Smuzhiyun */
423*4882a593Smuzhiyun extern u32 omap_features;
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun #define OMAP3_HAS_L2CACHE BIT(0)
426*4882a593Smuzhiyun #define OMAP3_HAS_IVA BIT(1)
427*4882a593Smuzhiyun #define OMAP3_HAS_SGX BIT(2)
428*4882a593Smuzhiyun #define OMAP3_HAS_NEON BIT(3)
429*4882a593Smuzhiyun #define OMAP3_HAS_ISP BIT(4)
430*4882a593Smuzhiyun #define OMAP3_HAS_192MHZ_CLK BIT(5)
431*4882a593Smuzhiyun #define OMAP3_HAS_IO_WAKEUP BIT(6)
432*4882a593Smuzhiyun #define OMAP3_HAS_SDRC BIT(7)
433*4882a593Smuzhiyun #define OMAP3_HAS_IO_CHAIN_CTRL BIT(8)
434*4882a593Smuzhiyun #define OMAP4_HAS_PERF_SILICON BIT(9)
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun #define OMAP3_HAS_FEATURE(feat,flag) \
438*4882a593Smuzhiyun static inline unsigned int omap3_has_ ##feat(void) \
439*4882a593Smuzhiyun { \
440*4882a593Smuzhiyun return omap_features & OMAP3_HAS_ ##flag; \
441*4882a593Smuzhiyun } \
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun OMAP3_HAS_FEATURE(l2cache, L2CACHE)
444*4882a593Smuzhiyun OMAP3_HAS_FEATURE(sgx, SGX)
445*4882a593Smuzhiyun OMAP3_HAS_FEATURE(iva, IVA)
446*4882a593Smuzhiyun OMAP3_HAS_FEATURE(neon, NEON)
447*4882a593Smuzhiyun OMAP3_HAS_FEATURE(isp, ISP)
448*4882a593Smuzhiyun OMAP3_HAS_FEATURE(192mhz_clk, 192MHZ_CLK)
449*4882a593Smuzhiyun OMAP3_HAS_FEATURE(io_wakeup, IO_WAKEUP)
450*4882a593Smuzhiyun OMAP3_HAS_FEATURE(sdrc, SDRC)
451*4882a593Smuzhiyun OMAP3_HAS_FEATURE(io_chain_ctrl, IO_CHAIN_CTRL)
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun /*
454*4882a593Smuzhiyun * Runtime detection of OMAP4 features
455*4882a593Smuzhiyun */
456*4882a593Smuzhiyun #define OMAP4_HAS_FEATURE(feat, flag) \
457*4882a593Smuzhiyun static inline unsigned int omap4_has_ ##feat(void) \
458*4882a593Smuzhiyun { \
459*4882a593Smuzhiyun return omap_features & OMAP4_HAS_ ##flag; \
460*4882a593Smuzhiyun } \
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun OMAP4_HAS_FEATURE(perf_silicon, PERF_SILICON)
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun /*
465*4882a593Smuzhiyun * We need to make sure omap initcalls don't run when
466*4882a593Smuzhiyun * multiplatform kernels are booted on other SoCs.
467*4882a593Smuzhiyun */
468*4882a593Smuzhiyun #define omap_initcall(level, fn) \
469*4882a593Smuzhiyun static int __init __used __##fn(void) \
470*4882a593Smuzhiyun { \
471*4882a593Smuzhiyun if (!soc_is_omap()) \
472*4882a593Smuzhiyun return 0; \
473*4882a593Smuzhiyun return fn(); \
474*4882a593Smuzhiyun } \
475*4882a593Smuzhiyun level(__##fn);
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun #define omap_early_initcall(fn) omap_initcall(early_initcall, fn)
478*4882a593Smuzhiyun #define omap_core_initcall(fn) omap_initcall(core_initcall, fn)
479*4882a593Smuzhiyun #define omap_postcore_initcall(fn) omap_initcall(postcore_initcall, fn)
480*4882a593Smuzhiyun #define omap_arch_initcall(fn) omap_initcall(arch_initcall, fn)
481*4882a593Smuzhiyun #define omap_subsys_initcall(fn) omap_initcall(subsys_initcall, fn)
482*4882a593Smuzhiyun #define omap_device_initcall(fn) omap_initcall(device_initcall, fn)
483*4882a593Smuzhiyun #define omap_late_initcall(fn) omap_initcall(late_initcall, fn)
484*4882a593Smuzhiyun #define omap_late_initcall_sync(fn) omap_initcall(late_initcall_sync, fn)
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun /* Legacy defines, these can be removed when users are removed */
487*4882a593Smuzhiyun #define cpu_is_omap2420() soc_is_omap2420()
488*4882a593Smuzhiyun #define cpu_is_omap2422() soc_is_omap2422()
489*4882a593Smuzhiyun #define cpu_is_omap242x() soc_is_omap242x()
490*4882a593Smuzhiyun #define cpu_is_omap2430() soc_is_omap2430()
491*4882a593Smuzhiyun #define cpu_is_omap243x() soc_is_omap243x()
492*4882a593Smuzhiyun #define cpu_is_omap24xx() soc_is_omap24xx()
493*4882a593Smuzhiyun #define cpu_is_omap3430() soc_is_omap3430()
494*4882a593Smuzhiyun #define cpu_is_omap343x() soc_is_omap343x()
495*4882a593Smuzhiyun #define cpu_is_omap34xx() soc_is_omap34xx()
496*4882a593Smuzhiyun #define cpu_is_omap3630() soc_is_omap3630()
497*4882a593Smuzhiyun #define cpu_is_omap443x() soc_is_omap443x()
498*4882a593Smuzhiyun #define cpu_is_omap446x() soc_is_omap446x()
499*4882a593Smuzhiyun #define cpu_is_omap44xx() soc_is_omap44xx()
500*4882a593Smuzhiyun #define cpu_is_ti814x() soc_is_ti814x()
501*4882a593Smuzhiyun #define cpu_is_ti816x() soc_is_ti816x()
502*4882a593Smuzhiyun #define cpu_is_ti81xx() soc_is_ti81xx()
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */
505