• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/arch/arm/plat-omap/include/plat/
1/*
2 * arch/arm/plat-omap/include/mach/cpu.h
3 *
4 * OMAP cpu type detection
5 *
6 * Copyright (C) 2004, 2008 Nokia Corporation
7 *
8 * Copyright (C) 2009 Texas Instruments.
9 *
10 * Written by Tony Lindgren <tony.lindgren@nokia.com>
11 *
12 * Added OMAP4 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 *
28 */
29
30#ifndef __ASM_ARCH_OMAP_CPU_H
31#define __ASM_ARCH_OMAP_CPU_H
32
33#include <linux/bitops.h>
34#include <plat/multi.h>
35
36/*
37 * Omap device type i.e. EMU/HS/TST/GP/BAD
38 */
39#define OMAP2_DEVICE_TYPE_TEST		0
40#define OMAP2_DEVICE_TYPE_EMU		1
41#define OMAP2_DEVICE_TYPE_SEC		2
42#define OMAP2_DEVICE_TYPE_GP		3
43#define OMAP2_DEVICE_TYPE_BAD		4
44
45int omap_type(void);
46
47struct omap_chip_id {
48	u16 oc;
49	u8 type;
50};
51
52#define OMAP_CHIP_INIT(x)	{ .oc = x }
53
54/*
55 * omap_rev bits:
56 * CPU id bits	(0730, 1510, 1710, 2422...)	[31:16]
57 * CPU revision	(See _REV_ defined in cpu.h)	[15:08]
58 * CPU class bits (15xx, 16xx, 24xx, 34xx...)	[07:00]
59 */
60unsigned int omap_rev(void);
61
62/*
63 * Define CPU revision bits
64 *
65 * Verbose meaning of the revision bits may be different for a silicon
66 * family. This difference can be handled separately.
67 */
68#define OMAP_REVBITS_00		0x00
69#define OMAP_REVBITS_01		0x01
70#define OMAP_REVBITS_02		0x02
71#define OMAP_REVBITS_10		0x10
72#define OMAP_REVBITS_20		0x20
73#define OMAP_REVBITS_30		0x30
74#define OMAP_REVBITS_40		0x40
75
76/*
77 * Get the CPU revision for OMAP devices
78 */
79#define GET_OMAP_REVISION()	((omap_rev() >> 8) & 0xff)
80
81/*
82 * Macros to group OMAP into cpu classes.
83 * These can be used in most places.
84 * cpu_is_omap7xx():	True for OMAP730, OMAP850
85 * cpu_is_omap15xx():	True for OMAP1510, OMAP5910 and OMAP310
86 * cpu_is_omap16xx():	True for OMAP1610, OMAP5912 and OMAP1710
87 * cpu_is_omap24xx():	True for OMAP2420, OMAP2422, OMAP2423, OMAP2430
88 * cpu_is_omap242x():	True for OMAP2420, OMAP2422, OMAP2423
89 * cpu_is_omap243x():	True for OMAP2430
90 * cpu_is_omap343x():	True for OMAP3430
91 * cpu_is_omap443x():	True for OMAP4430
92 */
93#define GET_OMAP_CLASS	(omap_rev() & 0xff)
94
95#define IS_OMAP_CLASS(class, id)			\
96static inline int is_omap ##class (void)		\
97{							\
98	return (GET_OMAP_CLASS == (id)) ? 1 : 0;	\
99}
100
101#define GET_OMAP_SUBCLASS	((omap_rev() >> 20) & 0x0fff)
102
103#define IS_OMAP_SUBCLASS(subclass, id)			\
104static inline int is_omap ##subclass (void)		\
105{							\
106	return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0;	\
107}
108
109IS_OMAP_CLASS(7xx, 0x07)
110IS_OMAP_CLASS(15xx, 0x15)
111IS_OMAP_CLASS(16xx, 0x16)
112IS_OMAP_CLASS(24xx, 0x24)
113IS_OMAP_CLASS(34xx, 0x34)
114IS_OMAP_CLASS(44xx, 0x44)
115
116IS_OMAP_SUBCLASS(242x, 0x242)
117IS_OMAP_SUBCLASS(243x, 0x243)
118IS_OMAP_SUBCLASS(343x, 0x343)
119IS_OMAP_SUBCLASS(363x, 0x363)
120IS_OMAP_SUBCLASS(443x, 0x443)
121
122#define cpu_is_omap7xx()		0
123#define cpu_is_omap15xx()		0
124#define cpu_is_omap16xx()		0
125#define cpu_is_omap24xx()		0
126#define cpu_is_omap242x()		0
127#define cpu_is_omap243x()		0
128#define cpu_is_omap34xx()		0
129#define cpu_is_omap343x()		0
130#define cpu_is_omap44xx()		0
131#define cpu_is_omap443x()		0
132
133#if defined(MULTI_OMAP1)
134# if defined(CONFIG_ARCH_OMAP730)
135#  undef  cpu_is_omap7xx
136#  define cpu_is_omap7xx()		is_omap7xx()
137# endif
138# if defined(CONFIG_ARCH_OMAP850)
139#  undef  cpu_is_omap7xx
140#  define cpu_is_omap7xx()		is_omap7xx()
141# endif
142# if defined(CONFIG_ARCH_OMAP15XX)
143#  undef  cpu_is_omap15xx
144#  define cpu_is_omap15xx()		is_omap15xx()
145# endif
146# if defined(CONFIG_ARCH_OMAP16XX)
147#  undef  cpu_is_omap16xx
148#  define cpu_is_omap16xx()		is_omap16xx()
149# endif
150#else
151# if defined(CONFIG_ARCH_OMAP730)
152#  undef  cpu_is_omap7xx
153#  define cpu_is_omap7xx()		1
154# endif
155# if defined(CONFIG_ARCH_OMAP850)
156#  undef  cpu_is_omap7xx
157#  define cpu_is_omap7xx()		1
158# endif
159# if defined(CONFIG_ARCH_OMAP15XX)
160#  undef  cpu_is_omap15xx
161#  define cpu_is_omap15xx()		1
162# endif
163# if defined(CONFIG_ARCH_OMAP16XX)
164#  undef  cpu_is_omap16xx
165#  define cpu_is_omap16xx()		1
166# endif
167#endif
168
169#if defined(MULTI_OMAP2)
170# if defined(CONFIG_ARCH_OMAP2)
171#  undef  cpu_is_omap24xx
172#  define cpu_is_omap24xx()		is_omap24xx()
173# endif
174# if defined(CONFIG_ARCH_OMAP2420)
175#  undef  cpu_is_omap242x
176#  define cpu_is_omap242x()		is_omap242x()
177# endif
178# if defined(CONFIG_ARCH_OMAP2430)
179#  undef  cpu_is_omap243x
180#  define cpu_is_omap243x()		is_omap243x()
181# endif
182# if defined(CONFIG_ARCH_OMAP3)
183#  undef  cpu_is_omap34xx
184#  undef  cpu_is_omap343x
185#  define cpu_is_omap34xx()		is_omap34xx()
186#  define cpu_is_omap343x()		is_omap343x()
187# endif
188#else
189# if defined(CONFIG_ARCH_OMAP2)
190#  undef  cpu_is_omap24xx
191#  define cpu_is_omap24xx()		1
192# endif
193# if defined(CONFIG_ARCH_OMAP2420)
194#  undef  cpu_is_omap242x
195#  define cpu_is_omap242x()		1
196# endif
197# if defined(CONFIG_ARCH_OMAP2430)
198#  undef  cpu_is_omap243x
199#  define cpu_is_omap243x()		1
200# endif
201# if defined(CONFIG_ARCH_OMAP3)
202#  undef  cpu_is_omap34xx
203#  define cpu_is_omap34xx()		1
204# endif
205# if defined(CONFIG_ARCH_OMAP3430)
206#  undef  cpu_is_omap343x
207#  define cpu_is_omap343x()		1
208# endif
209#endif
210
211/*
212 * Macros to detect individual cpu types.
213 * These are only rarely needed.
214 * cpu_is_omap330():	True for OMAP330
215 * cpu_is_omap730():	True for OMAP730
216 * cpu_is_omap850():	True for OMAP850
217 * cpu_is_omap1510():	True for OMAP1510
218 * cpu_is_omap1610():	True for OMAP1610
219 * cpu_is_omap1611():	True for OMAP1611
220 * cpu_is_omap5912():	True for OMAP5912
221 * cpu_is_omap1621():	True for OMAP1621
222 * cpu_is_omap1710():	True for OMAP1710
223 * cpu_is_omap2420():	True for OMAP2420
224 * cpu_is_omap2422():	True for OMAP2422
225 * cpu_is_omap2423():	True for OMAP2423
226 * cpu_is_omap2430():	True for OMAP2430
227 * cpu_is_omap3430():	True for OMAP3430
228 * cpu_is_omap4430():	True for OMAP4430
229 * cpu_is_omap3505():	True for OMAP3505
230 * cpu_is_omap3517():	True for OMAP3517
231 */
232#define GET_OMAP_TYPE	((omap_rev() >> 16) & 0xffff)
233
234#define IS_OMAP_TYPE(type, id)				\
235static inline int is_omap ##type (void)			\
236{							\
237	return (GET_OMAP_TYPE == (id)) ? 1 : 0;		\
238}
239
240IS_OMAP_TYPE(310, 0x0310)
241IS_OMAP_TYPE(730, 0x0730)
242IS_OMAP_TYPE(850, 0x0850)
243IS_OMAP_TYPE(1510, 0x1510)
244IS_OMAP_TYPE(1610, 0x1610)
245IS_OMAP_TYPE(1611, 0x1611)
246IS_OMAP_TYPE(5912, 0x1611)
247IS_OMAP_TYPE(1621, 0x1621)
248IS_OMAP_TYPE(1710, 0x1710)
249IS_OMAP_TYPE(2420, 0x2420)
250IS_OMAP_TYPE(2422, 0x2422)
251IS_OMAP_TYPE(2423, 0x2423)
252IS_OMAP_TYPE(2430, 0x2430)
253IS_OMAP_TYPE(3430, 0x3430)
254IS_OMAP_TYPE(3505, 0x3505)
255IS_OMAP_TYPE(3517, 0x3517)
256
257#define cpu_is_omap310()		0
258#define cpu_is_omap730()		0
259#define cpu_is_omap850()		0
260#define cpu_is_omap1510()		0
261#define cpu_is_omap1610()		0
262#define cpu_is_omap5912()		0
263#define cpu_is_omap1611()		0
264#define cpu_is_omap1621()		0
265#define cpu_is_omap1710()		0
266#define cpu_is_omap2420()		0
267#define cpu_is_omap2422()		0
268#define cpu_is_omap2423()		0
269#define cpu_is_omap2430()		0
270#define cpu_is_omap3503()		0
271#define cpu_is_omap3515()		0
272#define cpu_is_omap3525()		0
273#define cpu_is_omap3530()		0
274#define cpu_is_omap3505()		0
275#define cpu_is_omap3517()		0
276#define cpu_is_omap3430()		0
277#define cpu_is_omap4430()		0
278#define cpu_is_omap3630()		0
279
280/*
281 * Whether we have MULTI_OMAP1 or not, we still need to distinguish
282 * between 730 vs 850, 330 vs. 1510 and 1611B/5912 vs. 1710.
283 */
284
285#if defined(CONFIG_ARCH_OMAP730)
286# undef  cpu_is_omap730
287# define cpu_is_omap730()		is_omap730()
288#endif
289
290#if defined(CONFIG_ARCH_OMAP850)
291# undef  cpu_is_omap850
292# define cpu_is_omap850()		is_omap850()
293#endif
294
295#if defined(CONFIG_ARCH_OMAP15XX)
296# undef  cpu_is_omap310
297# undef  cpu_is_omap1510
298# define cpu_is_omap310()		is_omap310()
299# define cpu_is_omap1510()		is_omap1510()
300#endif
301
302#if defined(CONFIG_ARCH_OMAP16XX)
303# undef  cpu_is_omap1610
304# undef  cpu_is_omap1611
305# undef  cpu_is_omap5912
306# undef  cpu_is_omap1621
307# undef  cpu_is_omap1710
308# define cpu_is_omap1610()		is_omap1610()
309# define cpu_is_omap1611()		is_omap1611()
310# define cpu_is_omap5912()		is_omap5912()
311# define cpu_is_omap1621()		is_omap1621()
312# define cpu_is_omap1710()		is_omap1710()
313#endif
314
315#if defined(CONFIG_ARCH_OMAP2)
316# undef  cpu_is_omap2420
317# undef  cpu_is_omap2422
318# undef  cpu_is_omap2423
319# undef  cpu_is_omap2430
320# define cpu_is_omap2420()		is_omap2420()
321# define cpu_is_omap2422()		is_omap2422()
322# define cpu_is_omap2423()		is_omap2423()
323# define cpu_is_omap2430()		is_omap2430()
324#endif
325
326#if defined(CONFIG_ARCH_OMAP3)
327# undef cpu_is_omap3430
328# undef cpu_is_omap3503
329# undef cpu_is_omap3515
330# undef cpu_is_omap3525
331# undef cpu_is_omap3530
332# undef cpu_is_omap3505
333# undef cpu_is_omap3517
334# define cpu_is_omap3430()		is_omap3430()
335# define cpu_is_omap3503()		(cpu_is_omap3430() &&		\
336						(!omap3_has_iva()) &&	\
337						(!omap3_has_sgx()))
338# define cpu_is_omap3515()		(cpu_is_omap3430() &&		\
339						(!omap3_has_iva()) &&	\
340						(omap3_has_sgx()))
341# define cpu_is_omap3525()		(cpu_is_omap3430() &&		\
342						(!omap3_has_sgx()) &&	\
343						(omap3_has_iva()))
344# define cpu_is_omap3530()		(cpu_is_omap3430())
345# define cpu_is_omap3505()		is_omap3505()
346# define cpu_is_omap3517()		is_omap3517()
347# undef cpu_is_omap3630
348# define cpu_is_omap3630()		is_omap363x()
349#endif
350
351# if defined(CONFIG_ARCH_OMAP4)
352# undef cpu_is_omap44xx
353# undef cpu_is_omap443x
354# define cpu_is_omap44xx()		is_omap44xx()
355# define cpu_is_omap443x()		is_omap443x()
356# endif
357
358/* Macros to detect if we have OMAP1 or OMAP2 */
359#define cpu_class_is_omap1()	(cpu_is_omap7xx() || cpu_is_omap15xx() || \
360				cpu_is_omap16xx())
361#define cpu_class_is_omap2()	(cpu_is_omap24xx() || cpu_is_omap34xx() || \
362				cpu_is_omap44xx())
363
364/* Various silicon revisions for omap2 */
365#define OMAP242X_CLASS		0x24200024
366#define OMAP2420_REV_ES1_0	0x24200024
367#define OMAP2420_REV_ES2_0	0x24201024
368
369#define OMAP243X_CLASS		0x24300024
370#define OMAP2430_REV_ES1_0	0x24300024
371
372#define OMAP343X_CLASS		0x34300034
373#define OMAP3430_REV_ES1_0	0x34300034
374#define OMAP3430_REV_ES2_0	0x34301034
375#define OMAP3430_REV_ES2_1	0x34302034
376#define OMAP3430_REV_ES3_0	0x34303034
377#define OMAP3430_REV_ES3_1	0x34304034
378#define OMAP3430_REV_ES3_1_2	0x34305034
379
380#define OMAP3630_REV_ES1_0	0x36300034
381#define OMAP3630_REV_ES1_1	0x36300134
382#define OMAP3630_REV_ES1_2	0x36300234
383
384#define OMAP35XX_CLASS		0x35000034
385#define OMAP3503_REV(v)		(OMAP35XX_CLASS | (0x3503 << 16) | (v << 8))
386#define OMAP3515_REV(v)		(OMAP35XX_CLASS | (0x3515 << 16) | (v << 8))
387#define OMAP3525_REV(v)		(OMAP35XX_CLASS | (0x3525 << 16) | (v << 8))
388#define OMAP3530_REV(v)		(OMAP35XX_CLASS | (0x3530 << 16) | (v << 8))
389#define OMAP3505_REV(v)		(OMAP35XX_CLASS | (0x3505 << 16) | (v << 8))
390#define OMAP3517_REV(v)		(OMAP35XX_CLASS | (0x3517 << 16) | (v << 8))
391
392#define OMAP443X_CLASS		0x44300044
393#define OMAP4430_REV_ES1_0	0x44300044
394
395/*
396 * omap_chip bits
397 *
398 * CHIP_IS_OMAP{2420,2430,3430} indicate that a particular structure is
399 * valid on all chips of that type.  CHIP_IS_OMAP3430ES{1,2} indicates
400 * something that is only valid on that particular ES revision.
401 *
402 * These bits may be ORed together to indicate structures that are
403 * available on multiple chip types.
404 *
405 * To test whether a particular structure matches the current OMAP chip type,
406 * use omap_chip_is().
407 *
408 */
409#define CHIP_IS_OMAP2420		(1 << 0)
410#define CHIP_IS_OMAP2430		(1 << 1)
411#define CHIP_IS_OMAP3430		(1 << 2)
412#define CHIP_IS_OMAP3430ES1		(1 << 3)
413#define CHIP_IS_OMAP3430ES2		(1 << 4)
414#define CHIP_IS_OMAP3430ES3_0		(1 << 5)
415#define CHIP_IS_OMAP3430ES3_1		(1 << 6)
416#define CHIP_IS_OMAP3630ES1		(1 << 7)
417#define CHIP_IS_OMAP4430ES1		(1 << 8)
418#define CHIP_IS_OMAP3630ES1_1           (1 << 9)
419#define CHIP_IS_OMAP3630ES1_2           (1 << 10)
420
421#define CHIP_IS_OMAP24XX		(CHIP_IS_OMAP2420 | CHIP_IS_OMAP2430)
422
423#define CHIP_IS_OMAP4430		(CHIP_IS_OMAP4430ES1)
424
425/*
426 * "GE" here represents "greater than or equal to" in terms of ES
427 * levels.  So CHIP_GE_OMAP3430ES2 is intended to match all OMAP3430
428 * chips at ES2 and beyond, but not, for example, any OMAP lines after
429 * OMAP3.
430 */
431#define CHIP_GE_OMAP3430ES2		(CHIP_IS_OMAP3430ES2 | \
432					 CHIP_IS_OMAP3430ES3_0 | \
433					 CHIP_GE_OMAP3430ES3_1)
434#define CHIP_GE_OMAP3430ES3_1		(CHIP_IS_OMAP3430ES3_1 | \
435					 CHIP_IS_OMAP3630ES1 | \
436					 CHIP_GE_OMAP3630ES1_1)
437#define CHIP_GE_OMAP3630ES1_1		(CHIP_IS_OMAP3630ES1_1 | \
438					 CHIP_IS_OMAP3630ES1_2)
439
440int omap_chip_is(struct omap_chip_id oci);
441void omap2_check_revision(void);
442
443/*
444 * Runtime detection of OMAP3 features
445 */
446extern u32 omap3_features;
447
448#define OMAP3_HAS_L2CACHE		BIT(0)
449#define OMAP3_HAS_IVA			BIT(1)
450#define OMAP3_HAS_SGX			BIT(2)
451#define OMAP3_HAS_NEON			BIT(3)
452#define OMAP3_HAS_ISP			BIT(4)
453#define OMAP3_HAS_192MHZ_CLK		BIT(5)
454#define OMAP3_HAS_IO_WAKEUP		BIT(6)
455
456#define OMAP3_HAS_FEATURE(feat,flag)			\
457static inline unsigned int omap3_has_ ##feat(void)	\
458{							\
459	return (omap3_features & OMAP3_HAS_ ##flag);	\
460}							\
461
462OMAP3_HAS_FEATURE(l2cache, L2CACHE)
463OMAP3_HAS_FEATURE(sgx, SGX)
464OMAP3_HAS_FEATURE(iva, IVA)
465OMAP3_HAS_FEATURE(neon, NEON)
466OMAP3_HAS_FEATURE(isp, ISP)
467OMAP3_HAS_FEATURE(192mhz_clk, 192MHZ_CLK)
468OMAP3_HAS_FEATURE(io_wakeup, IO_WAKEUP)
469
470#endif
471