xref: /OK3568_Linux_fs/kernel/arch/arm/mach-omap2/soc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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