id.c revision 5ba02dcab945dc0bcde7df0c5958329f34bd04ae
11dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren/*
21dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * linux/arch/arm/mach-omap2/id.c
31dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren *
41dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * OMAP2 CPU identification code
51dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren *
61dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * Copyright (C) 2005 Nokia Corporation
71dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * Written by Tony Lindgren <tony@atomide.com>
81dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren *
91dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * This program is free software; you can redistribute it and/or modify
101dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * it under the terms of the GNU General Public License version 2 as
111dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * published by the Free Software Foundation.
121dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren */
131dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
141dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#include <linux/module.h>
151dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#include <linux/kernel.h>
161dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#include <linux/init.h>
17fced80c735941fa518ac67c0b61bbe153fb8c050Russell King#include <linux/io.h>
181dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
190ba8b9b273c45dd23f60ff700e265a0069b33758Russell King#include <asm/cputype.h>
201dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
210e564848693b06b037ec05e68c9e4b266250789eTony Lindgren#include <mach/common.h>
22a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/control.h>
23a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/cpu.h>
2472d0f1c3cdc7c456e1e357359ec6f566d0a5f264Syed Mohammed Khasim
250e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenstatic u32 class;
260e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenstatic void __iomem *tap_base;
270e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenstatic u16 tap_prod_id;
281dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
291dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#define OMAP_TAP_IDCODE		0x0204
301dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#define OMAP_TAP_DIE_ID_0	0x0218
311dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#define OMAP_TAP_DIE_ID_1	0x021C
321dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#define OMAP_TAP_DIE_ID_2	0x0220
331dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#define OMAP_TAP_DIE_ID_3	0x0224
341dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
351dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren/* system_rev fields for OMAP2 processors:
361dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren *   CPU id bits     [31:16],
371dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren *   CPU device type [15:12], (unprg,normal,POP)
381dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren *   CPU revision    [11:08]
391dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren *   CPU class bits  [07:00]
401dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren */
411dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
421dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgrenstruct omap_id {
431dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u16	hawkeye;	/* Silicon type (Hawkeye id) */
441dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u8	dev;		/* Device type from production_id reg */
451dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u32	type;		/* combined type id copied to system_rev */
461dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren};
471dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
481dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren/* Register values to detect the OMAP version */
491dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgrenstatic struct omap_id omap_ids[] __initdata = {
501dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x0, .type = 0x24200000 },
511dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x1, .type = 0x24201000 },
521dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x2, .type = 0x24202000 },
531dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x4, .type = 0x24220000 },
541dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x8, .type = 0x24230000 },
551dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	{ .hawkeye = 0xb68a, .dev = 0x0, .type = 0x24300000 },
561dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren};
571dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
58097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleystatic struct omap_chip_id omap_chip;
59097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
60097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley/**
61097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * omap_chip_is - test whether currently running OMAP matches a chip type
62097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * @oc: omap_chip_t to test against
63097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley *
64097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * Test whether the currently-running OMAP chip matches the supplied
65097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * chip type 'oc'.  Returns 1 upon a match; 0 upon failure.
66097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley */
67097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleyint omap_chip_is(struct omap_chip_id oci)
68097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley{
69097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	return (oci.oc & omap_chip.oc) ? 1 : 0;
70097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley}
71097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul WalmsleyEXPORT_SYMBOL(omap_chip_is);
72097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
731dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgrenstatic u32 __init read_tap_reg(int reg)
741dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren{
75097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	unsigned int regval = 0;
76097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	u32 cpuid;
77097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
78097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	/* Reading the IDCODE register on 3430 ES1 results in a
79097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * data abort as the register is not exposed on the OCP
80097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * Hence reading the Cortex Rev
81097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 */
82097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	cpuid = read_cpuid(CPUID_ID);
83097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
84097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	/* If the processor type is Cortex-A8 and the revision is 0x0
85097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * it means its Cortex r0p0 which is 3430 ES1
86097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 */
87097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	if ((((cpuid >> 4) & 0xFFF) == 0xC08) && ((cpuid & 0xF) == 0x0)) {
880e564848693b06b037ec05e68c9e4b266250789eTony Lindgren
890e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		if (reg == tap_prod_id) {
900e564848693b06b037ec05e68c9e4b266250789eTony Lindgren			regval = 0x000F00F0;
910e564848693b06b037ec05e68c9e4b266250789eTony Lindgren			goto out;
920e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		}
930e564848693b06b037ec05e68c9e4b266250789eTony Lindgren
94097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		switch (reg) {
95097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		case OMAP_TAP_IDCODE  : regval = 0x0B7AE02F; break;
96097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		/* Making DevType as 0xF in ES1 to differ from ES2 */
97097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		case OMAP_TAP_DIE_ID_0: regval = 0x01000000; break;
98097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		case OMAP_TAP_DIE_ID_1: regval = 0x1012d687; break;
99097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		case OMAP_TAP_DIE_ID_2:	regval = 0x00000000; break;
100097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		case OMAP_TAP_DIE_ID_3:	regval = 0x2d2c0000; break;
101097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		}
102097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	} else
1030e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		regval = __raw_readl(tap_base + reg);
104097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
1050e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenout:
106097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	return regval;
107097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
108097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley}
109097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
110097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley/*
111097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * _set_system_rev - set the system_rev global based on current OMAP chip type
112097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley *
113097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * Set the system_rev global.  This is primarily used by the cpu_is_omapxxxx()
114097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * macros.
115097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley */
116097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleystatic void __init _set_system_rev(u32 type, u8 rev)
117097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley{
118097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	u32 i, ctrl_status;
119097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
120097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	/*
121097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * system_rev encoding is as follows
122097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * system_rev & 0xff000000 -> Omap Class (24xx/34xx)
123097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * system_rev & 0xfff00000 -> Omap Sub Class (242x/343x)
124097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * system_rev & 0xffff0000 -> Omap type (2420/2422/2423/2430/3430)
125097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * system_rev & 0x0000f000 -> Silicon revision (ES1, ES2 )
126097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * system_rev & 0x00000700 -> Device Type ( EMU/HS/GP/BAD )
127097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * system_rev & 0x000000c0 -> IDCODE revision[6:7]
128097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * system_rev & 0x0000003f -> sys_boot[0:5]
129097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 */
130097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	/* Embedding the ES revision info in type field */
131097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	system_rev = type;
132097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	/* Also add IDCODE revision info only two lower bits */
133097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	system_rev |= ((rev & 0x3) << 6);
134097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
135097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	/* Add in the device type and sys_boot fields (see above) */
136097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	if (cpu_is_omap24xx()) {
137097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		i = OMAP24XX_CONTROL_STATUS;
138097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	} else if (cpu_is_omap343x()) {
139097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		i = OMAP343X_CONTROL_STATUS;
140097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	} else {
141097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		printk(KERN_ERR "id: unknown CPU type\n");
142097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		BUG();
143097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	}
144097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	ctrl_status = omap_ctrl_readl(i);
145097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	system_rev |= (ctrl_status & (OMAP2_SYSBOOT_5_MASK |
146097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley				      OMAP2_SYSBOOT_4_MASK |
147097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley				      OMAP2_SYSBOOT_3_MASK |
148097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley				      OMAP2_SYSBOOT_2_MASK |
149097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley				      OMAP2_SYSBOOT_1_MASK |
150097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley				      OMAP2_SYSBOOT_0_MASK));
151097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	system_rev |= (ctrl_status & OMAP2_DEVICETYPE_MASK);
152097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley}
153097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
154097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
155097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley/*
156097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * _set_omap_chip - set the omap_chip global based on OMAP chip type
157097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley *
158097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * Build the omap_chip bits.  This variable is used by powerdomain and
159097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * clockdomain code to indicate whether structures are applicable for
160097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * the current OMAP chip type by ANDing it against a 'platform' bitfield
161097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * in the structure.
162097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley */
163097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleystatic void __init _set_omap_chip(void)
164097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley{
165097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	if (cpu_is_omap343x()) {
166097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
167097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		omap_chip.oc = CHIP_IS_OMAP3430;
168097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		if (is_sil_rev_equal_to(OMAP3430_REV_ES1_0))
169097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley			omap_chip.oc |= CHIP_IS_OMAP3430ES1;
170097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		else if (is_sil_rev_greater_than(OMAP3430_REV_ES1_0))
171097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley			omap_chip.oc |= CHIP_IS_OMAP3430ES2;
172097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
173097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	} else if (cpu_is_omap243x()) {
174097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
175097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		/* Currently only supports 2430ES2.1 and 2430-all */
176097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		omap_chip.oc |= CHIP_IS_OMAP2430;
177097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
178097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	} else if (cpu_is_omap242x()) {
179097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
180097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		/* Currently only supports 2420ES2.1.1 and 2420-all */
181097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		omap_chip.oc |= CHIP_IS_OMAP2420;
182097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
183097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	} else {
184097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
185097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		/* Current CPU not supported by this code. */
186097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		printk(KERN_WARNING "OMAP chip type code does not yet support "
187097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		       "this CPU type.\n");
188097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		WARN_ON(1);
189097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
190097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	}
191097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
1921dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren}
1931dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
1945ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgrenvoid __init omap24xx_check_revision(void)
1951dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren{
1961dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	int i, j;
1971dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u32 idcode;
1981dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u32 prod_id;
1991dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u16 hawkeye;
2001dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u8  dev_type;
2011dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u8  rev;
2021dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
2031dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	idcode = read_tap_reg(OMAP_TAP_IDCODE);
2040e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	prod_id = read_tap_reg(tap_prod_id);
2051dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	hawkeye = (idcode >> 12) & 0xffff;
2061dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	rev = (idcode >> 28) & 0x0f;
2071dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	dev_type = (prod_id >> 16) & 0x0f;
2081dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
209097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_IDCODE 0x%08x REV %i HAWKEYE 0x%04x MANF %03x\n",
210097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 idcode, rev, hawkeye, (idcode >> 1) & 0x7ff);
211097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_DIE_ID_0: 0x%08x\n",
212097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 read_tap_reg(OMAP_TAP_DIE_ID_0));
213097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_DIE_ID_1: 0x%08x DEV_REV: %i\n",
214097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 read_tap_reg(OMAP_TAP_DIE_ID_1),
215097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 (read_tap_reg(OMAP_TAP_DIE_ID_1) >> 28) & 0xf);
216097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_DIE_ID_2: 0x%08x\n",
217097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 read_tap_reg(OMAP_TAP_DIE_ID_2));
218097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_DIE_ID_3: 0x%08x\n",
219097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 read_tap_reg(OMAP_TAP_DIE_ID_3));
220097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_PROD_ID_0: 0x%08x DEV_TYPE: %i\n",
221097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 prod_id, dev_type);
222097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
223097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	/*
224097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * Detection for 34xx ES2.0 and above can be done with just
225097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * hawkeye and rev. See TRM 1.5.2 Device Identification.
226097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 * Note that rev cannot be used directly as ES1.0 uses value 0.
227097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	 */
228097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	if (hawkeye == 0xb7ae) {
229097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		system_rev = 0x34300000 | ((1 + rev) << 12);
230097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		pr_info("OMAP%04x ES2.%i\n", system_rev >> 16, rev);
231097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		_set_omap_chip();
232097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		return;
233097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	}
2341dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
2351dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	/* Check hawkeye ids */
2361dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
2371dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		if (hawkeye == omap_ids[i].hawkeye)
2381dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren			break;
2391dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
2401dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
2411dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	if (i == ARRAY_SIZE(omap_ids)) {
2421dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		printk(KERN_ERR "Unknown OMAP CPU id\n");
2431dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		return;
2441dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
2451dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
2461dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	for (j = i; j < ARRAY_SIZE(omap_ids); j++) {
2471dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		if (dev_type == omap_ids[j].dev)
2481dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren			break;
2491dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
2501dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
2511dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	if (j == ARRAY_SIZE(omap_ids)) {
2521dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		printk(KERN_ERR "Unknown OMAP device type. "
2531dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren				"Handling it as OMAP%04x\n",
2541dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren				omap_ids[i].type >> 16);
2551dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		j = i;
2561dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
2571dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
258097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	_set_system_rev(omap_ids[j].type, rev);
2591dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
260097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	_set_omap_chip();
2611dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
2621dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	pr_info("OMAP%04x", system_rev >> 16);
2631dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	if ((system_rev >> 8) & 0x0f)
264097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		pr_info("ES%x", (system_rev >> 12) & 0xf);
265097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_info("\n");
266097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
2671dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren}
2681dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
2695ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgrenvoid __init omap2_check_revision(void)
2705ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren{
2715ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren	omap24xx_check_revision();
2725ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren}
2735ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren
2740e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenvoid __init omap2_set_globals_tap(struct omap_globals *omap2_globals)
2750e564848693b06b037ec05e68c9e4b266250789eTony Lindgren{
2760e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	class = omap2_globals->class;
2770e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	tap_base = omap2_globals->tap;
2780e564848693b06b037ec05e68c9e4b266250789eTony Lindgren
2790e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	if (class == 0x3430)
2800e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		tap_prod_id = 0x0210;
2810e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	else
2820e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		tap_prod_id = 0x0208;
2830e564848693b06b037ec05e68c9e4b266250789eTony Lindgren}
284