id.c revision 44169075e6eaa87bab6a296209d8d0610879b394
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 *
944169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar * Copyright (C) 2009 Texas Instruments
1044169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
1144169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar *
121dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * This program is free software; you can redistribute it and/or modify
131dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * it under the terms of the GNU General Public License version 2 as
141dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren * published by the Free Software Foundation.
151dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren */
161dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
171dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#include <linux/module.h>
181dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#include <linux/kernel.h>
191dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren#include <linux/init.h>
20fced80c735941fa518ac67c0b61bbe153fb8c050Russell King#include <linux/io.h>
211dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
220ba8b9b273c45dd23f60ff700e265a0069b33758Russell King#include <asm/cputype.h>
231dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
240e564848693b06b037ec05e68c9e4b266250789eTony Lindgren#include <mach/common.h>
25a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/control.h>
26a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/cpu.h>
2772d0f1c3cdc7c456e1e357359ec6f566d0a5f264Syed Mohammed Khasim
28097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleystatic struct omap_chip_id omap_chip;
2984a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunenstatic unsigned int omap_revision;
3084a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen
3184a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen
3284a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunenunsigned int omap_rev(void)
3384a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen{
3484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	return omap_revision;
3584a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen}
3684a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri LeukkunenEXPORT_SYMBOL(omap_rev);
37097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
38097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley/**
39097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * omap_chip_is - test whether currently running OMAP matches a chip type
40097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * @oc: omap_chip_t to test against
41097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley *
42097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * Test whether the currently-running OMAP chip matches the supplied
43097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * chip type 'oc'.  Returns 1 upon a match; 0 upon failure.
44097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley */
45097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleyint omap_chip_is(struct omap_chip_id oci)
46097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley{
47097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	return (oci.oc & omap_chip.oc) ? 1 : 0;
48097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley}
49097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul WalmsleyEXPORT_SYMBOL(omap_chip_is);
50097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
51a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*----------------------------------------------------------------------------*/
52097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
53a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_IDCODE		0x0204
54a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_0	0x0218
55a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_1	0x021C
56a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_2	0x0220
57a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_3	0x0224
58097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
59a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define read_tap_reg(reg)	__raw_readl(tap_base  + (reg))
60097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
61a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstruct omap_id {
62a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u16	hawkeye;	/* Silicon type (Hawkeye id) */
63a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u8	dev;		/* Device type from production_id reg */
6484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	u32	type;		/* Combined type id copied to omap_revision */
65a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren};
66097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
67a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/* Register values to detect the OMAP version */
68a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic struct omap_id omap_ids[] __initdata = {
69a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x0, .type = 0x24200024 },
70a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x1, .type = 0x24201024 },
71a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x2, .type = 0x24202024 },
72a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x4, .type = 0x24220024 },
73a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x8, .type = 0x24230024 },
74a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb68a, .dev = 0x0, .type = 0x24300024 },
75a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren};
76097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
77a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic void __iomem *tap_base;
78a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic u16 tap_prod_id;
791dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
805ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgrenvoid __init omap24xx_check_revision(void)
811dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren{
821dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	int i, j;
83a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u32 idcode, prod_id;
841dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u16 hawkeye;
85a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u8  dev_type, rev;
861dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
871dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	idcode = read_tap_reg(OMAP_TAP_IDCODE);
880e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	prod_id = read_tap_reg(tap_prod_id);
891dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	hawkeye = (idcode >> 12) & 0xffff;
901dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	rev = (idcode >> 28) & 0x0f;
911dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	dev_type = (prod_id >> 16) & 0x0f;
921dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
93097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_IDCODE 0x%08x REV %i HAWKEYE 0x%04x MANF %03x\n",
94097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 idcode, rev, hawkeye, (idcode >> 1) & 0x7ff);
95097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_DIE_ID_0: 0x%08x\n",
96097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 read_tap_reg(OMAP_TAP_DIE_ID_0));
97097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_DIE_ID_1: 0x%08x DEV_REV: %i\n",
98097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 read_tap_reg(OMAP_TAP_DIE_ID_1),
99097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 (read_tap_reg(OMAP_TAP_DIE_ID_1) >> 28) & 0xf);
100097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_DIE_ID_2: 0x%08x\n",
101097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 read_tap_reg(OMAP_TAP_DIE_ID_2));
102097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_DIE_ID_3: 0x%08x\n",
103097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 read_tap_reg(OMAP_TAP_DIE_ID_3));
104097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_PROD_ID_0: 0x%08x DEV_TYPE: %i\n",
105097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 prod_id, dev_type);
106097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
1071dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	/* Check hawkeye ids */
1081dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
1091dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		if (hawkeye == omap_ids[i].hawkeye)
1101dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren			break;
1111dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
1121dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
1131dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	if (i == ARRAY_SIZE(omap_ids)) {
1141dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		printk(KERN_ERR "Unknown OMAP CPU id\n");
1151dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		return;
1161dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
1171dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
1181dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	for (j = i; j < ARRAY_SIZE(omap_ids); j++) {
1191dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		if (dev_type == omap_ids[j].dev)
1201dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren			break;
1211dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
1221dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
1231dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	if (j == ARRAY_SIZE(omap_ids)) {
1241dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		printk(KERN_ERR "Unknown OMAP device type. "
1251dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren				"Handling it as OMAP%04x\n",
1261dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren				omap_ids[i].type >> 16);
1271dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		j = i;
1281dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
1291dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
13084a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	pr_info("OMAP%04x", omap_rev() >> 16);
13184a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	if ((omap_rev() >> 8) & 0x0f)
13284a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen		pr_info("ES%x", (omap_rev() >> 12) & 0xf);
133097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_info("\n");
134a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren}
135a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
136a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenvoid __init omap34xx_check_revision(void)
137a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren{
138a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u32 cpuid, idcode;
139a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u16 hawkeye;
140a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u8 rev;
141a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	char *rev_name = "ES1.0";
142a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
143a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
144a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * We cannot access revision registers on ES1.0.
145a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * If the processor type is Cortex-A8 and the revision is 0x0
146a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * it means its Cortex r0p0 which is 3430 ES1.0.
147a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
148a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	cpuid = read_cpuid(CPUID_ID);
149a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) {
15084a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen		omap_revision = OMAP3430_REV_ES1_0;
151a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		goto out;
152a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	}
153a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
154a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
155a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * Detection for 34xx ES2.0 and above can be done with just
156a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * hawkeye and rev. See TRM 1.5.2 Device Identification.
157a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * Note that rev does not map directly to our defined processor
158a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * revision numbers as ES1.0 uses value 0.
159a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
160a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	idcode = read_tap_reg(OMAP_TAP_IDCODE);
161a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	hawkeye = (idcode >> 12) & 0xffff;
162a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	rev = (idcode >> 28) & 0xff;
163097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
164a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if (hawkeye == 0xb7ae) {
165a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		switch (rev) {
166a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		case 0:
16784a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen			omap_revision = OMAP3430_REV_ES2_0;
168a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			rev_name = "ES2.0";
169a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			break;
170a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		case 2:
17184a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen			omap_revision = OMAP3430_REV_ES2_1;
172a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			rev_name = "ES2.1";
173a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			break;
174a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		case 3:
17584a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen			omap_revision = OMAP3430_REV_ES3_0;
176a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			rev_name = "ES3.0";
177a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			break;
178187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren		case 4:
179187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren			omap_revision = OMAP3430_REV_ES3_1;
180187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren			rev_name = "ES3.1";
181187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren			break;
182a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		default:
183a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			/* Use the latest known revision as default */
184187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren			omap_revision = OMAP3430_REV_ES3_1;
185a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			rev_name = "Unknown revision\n";
186a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		}
187a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	}
188a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
189a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenout:
19084a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name);
1911dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren}
1921dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
193a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*
194a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Try to detect the exact revision of the omap we're running on
195a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */
1965ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgrenvoid __init omap2_check_revision(void)
1975ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren{
198a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
199a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * At this point we have an idea about the processor revision set
200a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * earlier with omap2_set_globals_tap().
201a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
202a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if (cpu_is_omap24xx())
203a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		omap24xx_check_revision();
204a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	else if (cpu_is_omap34xx())
205a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		omap34xx_check_revision();
20644169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar	else if (cpu_is_omap44xx()) {
20744169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar		printk(KERN_INFO "FIXME: CPU revision = OMAP4430\n");
20844169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar		return;
20944169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar	} else
210a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		pr_err("OMAP revision unknown, please fix!\n");
211a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
212a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
213a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * OK, now we know the exact revision. Initialize omap_chip bits
214a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * for powerdowmain and clockdomain code.
215a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
216a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if (cpu_is_omap243x()) {
217a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		/* Currently only supports 2430ES2.1 and 2430-all */
218a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		omap_chip.oc |= CHIP_IS_OMAP2430;
219a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	} else if (cpu_is_omap242x()) {
220a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		/* Currently only supports 2420ES2.1.1 and 2420-all */
221a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		omap_chip.oc |= CHIP_IS_OMAP2420;
222a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	} else if (cpu_is_omap343x()) {
223a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		omap_chip.oc = CHIP_IS_OMAP3430;
22484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen		if (omap_rev() == OMAP3430_REV_ES1_0)
225a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			omap_chip.oc |= CHIP_IS_OMAP3430ES1;
226d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley		else if (omap_rev() >= OMAP3430_REV_ES2_0 &&
227d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley			 omap_rev() <= OMAP3430_REV_ES2_1)
228a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			omap_chip.oc |= CHIP_IS_OMAP3430ES2;
229d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley		else if (omap_rev() == OMAP3430_REV_ES3_0)
230d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley			omap_chip.oc |= CHIP_IS_OMAP3430ES3_0;
231d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley		else if (omap_rev() == OMAP3430_REV_ES3_1)
232d41ad52040dee5043ce6b1d49a1c8864706d2bfdPaul Walmsley			omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
233a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	} else {
234a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		pr_err("Uninitialized omap_chip, please fix!\n");
235a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	}
2365ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren}
2375ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren
238a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*
239a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Set up things for map_io and processor detection later on. Gets called
240a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * pretty much first thing from board init. For multi-omap, this gets
241a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * cpu_is_omapxxxx() working accurately enough for map_io. Then we'll try to
242a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * detect the exact revision later on in omap2_detect_revision() once map_io
243a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * is done.
244a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */
2450e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenvoid __init omap2_set_globals_tap(struct omap_globals *omap2_globals)
2460e564848693b06b037ec05e68c9e4b266250789eTony Lindgren{
24784a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	omap_revision = omap2_globals->class;
2480e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	tap_base = omap2_globals->tap;
2490e564848693b06b037ec05e68c9e4b266250789eTony Lindgren
250a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if (cpu_is_omap34xx())
2510e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		tap_prod_id = 0x0210;
2520e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	else
2530e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		tap_prod_id = 0x0208;
2540e564848693b06b037ec05e68c9e4b266250789eTony Lindgren}
255