1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * OMAP cpu type detection
4 *
5 * Copyright (C) 2004, 2008 Nokia Corporation
6 *
7 * Copyright (C) 2009-11 Texas Instruments.
8 *
9 * Written by Tony Lindgren <tony.lindgren@nokia.com>
10 *
11 * Added OMAP4/5 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com>
12 */
13
14#ifndef __ASM_ARCH_OMAP_CPU_H
15#define __ASM_ARCH_OMAP_CPU_H
16
17/*
18 * Test if multicore OMAP support is needed
19 */
20#undef MULTI_OMAP1
21#undef OMAP_NAME
22
23#ifdef CONFIG_ARCH_OMAP15XX
24# ifdef OMAP_NAME
25#  undef  MULTI_OMAP1
26#  define MULTI_OMAP1
27# else
28#  define OMAP_NAME omap1510
29# endif
30#endif
31#ifdef CONFIG_ARCH_OMAP16XX
32# ifdef OMAP_NAME
33#  undef  MULTI_OMAP1
34#  define MULTI_OMAP1
35# else
36#  define OMAP_NAME omap16xx
37# endif
38#endif
39
40/*
41 * omap_rev bits:
42 * CPU id bits	(0730, 1510, 1710, 2422...)	[31:16]
43 * CPU revision	(See _REV_ defined in cpu.h)	[15:08]
44 * CPU class bits (15xx, 16xx, 24xx, 34xx...)	[07:00]
45 */
46unsigned int omap_rev(void);
47
48/*
49 * Get the CPU revision for OMAP devices
50 */
51#define GET_OMAP_REVISION()	((omap_rev() >> 8) & 0xff)
52
53/*
54 * Macros to group OMAP into cpu classes.
55 * These can be used in most places.
56 * cpu_is_omap15xx():	True for OMAP1510, OMAP5910 and OMAP310
57 * cpu_is_omap16xx():	True for OMAP1610, OMAP5912 and OMAP1710
58 */
59#define GET_OMAP_CLASS	(omap_rev() & 0xff)
60
61#define IS_OMAP_CLASS(class, id)			\
62static inline int is_omap ##class (void)		\
63{							\
64	return (GET_OMAP_CLASS == (id)) ? 1 : 0;	\
65}
66
67#define GET_OMAP_SUBCLASS	((omap_rev() >> 20) & 0x0fff)
68
69#define IS_OMAP_SUBCLASS(subclass, id)			\
70static inline int is_omap ##subclass (void)		\
71{							\
72	return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0;	\
73}
74
75IS_OMAP_CLASS(15xx, 0x15)
76IS_OMAP_CLASS(16xx, 0x16)
77
78#define cpu_is_omap15xx()		0
79#define cpu_is_omap16xx()		0
80
81#if defined(MULTI_OMAP1)
82# if defined(CONFIG_ARCH_OMAP15XX)
83#  undef  cpu_is_omap15xx
84#  define cpu_is_omap15xx()		is_omap15xx()
85# endif
86# if defined(CONFIG_ARCH_OMAP16XX)
87#  undef  cpu_is_omap16xx
88#  define cpu_is_omap16xx()		is_omap16xx()
89# endif
90#else
91# if defined(CONFIG_ARCH_OMAP15XX)
92#  undef  cpu_is_omap15xx
93#  define cpu_is_omap15xx()		1
94# endif
95# if defined(CONFIG_ARCH_OMAP16XX)
96#  undef  cpu_is_omap16xx
97#  define cpu_is_omap16xx()		1
98# endif
99#endif
100
101/*
102 * Macros to detect individual cpu types.
103 * These are only rarely needed.
104 * cpu_is_omap310():	True for OMAP310
105 * cpu_is_omap1510():	True for OMAP1510
106 * cpu_is_omap1610():	True for OMAP1610
107 * cpu_is_omap1611():	True for OMAP1611
108 * cpu_is_omap5912():	True for OMAP5912
109 * cpu_is_omap1621():	True for OMAP1621
110 * cpu_is_omap1710():	True for OMAP1710
111 */
112#define GET_OMAP_TYPE	((omap_rev() >> 16) & 0xffff)
113
114#define IS_OMAP_TYPE(type, id)				\
115static inline int is_omap ##type (void)			\
116{							\
117	return (GET_OMAP_TYPE == (id)) ? 1 : 0;		\
118}
119
120IS_OMAP_TYPE(310, 0x0310)
121IS_OMAP_TYPE(1510, 0x1510)
122IS_OMAP_TYPE(1610, 0x1610)
123IS_OMAP_TYPE(1611, 0x1611)
124IS_OMAP_TYPE(5912, 0x1611)
125IS_OMAP_TYPE(1621, 0x1621)
126IS_OMAP_TYPE(1710, 0x1710)
127
128#define cpu_is_omap310()		0
129#define cpu_is_omap1510()		0
130#define cpu_is_omap1610()		0
131#define cpu_is_omap5912()		0
132#define cpu_is_omap1611()		0
133#define cpu_is_omap1621()		0
134#define cpu_is_omap1710()		0
135
136#define cpu_class_is_omap1()		1
137
138/*
139 * Whether we have MULTI_OMAP1 or not, we still need to distinguish
140 * between 310 vs. 1510 and 1611B/5912 vs. 1710.
141 */
142
143#if defined(CONFIG_ARCH_OMAP15XX)
144# undef  cpu_is_omap310
145# undef  cpu_is_omap1510
146# define cpu_is_omap310()		is_omap310()
147# define cpu_is_omap1510()		is_omap1510()
148#endif
149
150#if defined(CONFIG_ARCH_OMAP16XX)
151# undef  cpu_is_omap1610
152# undef  cpu_is_omap1611
153# undef  cpu_is_omap5912
154# undef  cpu_is_omap1621
155# undef  cpu_is_omap1710
156# define cpu_is_omap1610()		is_omap1610()
157# define cpu_is_omap1611()		is_omap1611()
158# define cpu_is_omap5912()		is_omap5912()
159# define cpu_is_omap1621()		is_omap1621()
160# define cpu_is_omap1710()		is_omap1710()
161#endif
162
163#endif
164