id.c revision b0a1a6ce0597662c06f970643da60b8ebb5cdd1c
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
24ce491cf85466c3377228c5a852ea627ec5136956Tony Lindgren#include <plat/common.h>
25ce491cf85466c3377228c5a852ea627ec5136956Tony Lindgren#include <plat/control.h>
26ce491cf85466c3377228c5a852ea627ec5136956Tony Lindgren#include <plat/cpu.h>
2772d0f1c3cdc7c456e1e357359ec6f566d0a5f264Syed Mohammed Khasim
282e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen#include <mach/id.h>
292e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen
30097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleystatic struct omap_chip_id omap_chip;
3184a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunenstatic unsigned int omap_revision;
3284a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen
338384ce071365244332ea05c81112bfffcf48be87Sanjeev Premiu32 omap3_features;
3484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen
3584a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunenunsigned int omap_rev(void)
3684a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen{
3784a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	return omap_revision;
3884a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen}
3984a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri LeukkunenEXPORT_SYMBOL(omap_rev);
40097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
41097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley/**
42097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * omap_chip_is - test whether currently running OMAP matches a chip type
43097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * @oc: omap_chip_t to test against
44097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley *
45097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * Test whether the currently-running OMAP chip matches the supplied
46097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley * chip type 'oc'.  Returns 1 upon a match; 0 upon failure.
47097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley */
48097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsleyint omap_chip_is(struct omap_chip_id oci)
49097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley{
50097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	return (oci.oc & omap_chip.oc) ? 1 : 0;
51097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley}
52097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul WalmsleyEXPORT_SYMBOL(omap_chip_is);
53097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
548e25ad964aac0bf6b30dd013303750089f819679Kevin Hilmanint omap_type(void)
558e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman{
568e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	u32 val = 0;
578e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
58edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	if (cpu_is_omap24xx()) {
598e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman		val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS);
60edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else if (cpu_is_omap34xx()) {
618e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman		val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
62737daa036081ad3030268f658d8dff785b3e73cdSantosh Shilimkar	} else if (cpu_is_omap44xx()) {
63737daa036081ad3030268f658d8dff785b3e73cdSantosh Shilimkar		val = omap_ctrl_readl(OMAP44XX_CONTROL_STATUS);
64edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else {
658e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman		pr_err("Cannot detect omap type!\n");
668e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman		goto out;
678e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	}
688e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
698e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	val &= OMAP2_DEVICETYPE_MASK;
708e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	val >>= 8;
718e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
728e25ad964aac0bf6b30dd013303750089f819679Kevin Hilmanout:
738e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	return val;
748e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman}
758e25ad964aac0bf6b30dd013303750089f819679Kevin HilmanEXPORT_SYMBOL(omap_type);
768e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
778e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
78a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*----------------------------------------------------------------------------*/
79097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
80a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_IDCODE		0x0204
81a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_0	0x0218
82a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_1	0x021C
83a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_2	0x0220
84a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_3	0x0224
85097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
86a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define read_tap_reg(reg)	__raw_readl(tap_base  + (reg))
87097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
88a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstruct omap_id {
89a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u16	hawkeye;	/* Silicon type (Hawkeye id) */
90a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u8	dev;		/* Device type from production_id reg */
9184a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	u32	type;		/* Combined type id copied to omap_revision */
92a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren};
93097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
94a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/* Register values to detect the OMAP version */
95a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic struct omap_id omap_ids[] __initdata = {
96a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x0, .type = 0x24200024 },
97a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x1, .type = 0x24201024 },
98a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x2, .type = 0x24202024 },
99a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x4, .type = 0x24220024 },
100a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x8, .type = 0x24230024 },
101a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb68a, .dev = 0x0, .type = 0x24300024 },
102a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren};
103097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
104a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic void __iomem *tap_base;
105a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic u16 tap_prod_id;
1061dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
1072e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chenvoid omap_get_die_id(struct omap_die_id *odi)
1082e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen{
1092e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen	odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_0);
1102e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen	odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_1);
1112e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen	odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_2);
1122e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen	odi->id_3 = read_tap_reg(OMAP_TAP_DIE_ID_3);
1132e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen}
1142e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen
1155ebc0d526af51d84b3d6fbf27b69f8d44f277064Nishanth Menonstatic void __init omap24xx_check_revision(void)
1161dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren{
1171dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	int i, j;
118a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u32 idcode, prod_id;
1191dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	u16 hawkeye;
120a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u8  dev_type, rev;
121c46732bbf3477f319083161bfa2fba1fadae7a3eKan-Ru Chen	struct omap_die_id odi;
1221dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
1231dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	idcode = read_tap_reg(OMAP_TAP_IDCODE);
1240e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	prod_id = read_tap_reg(tap_prod_id);
1251dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	hawkeye = (idcode >> 12) & 0xffff;
1261dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	rev = (idcode >> 28) & 0x0f;
1271dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	dev_type = (prod_id >> 16) & 0x0f;
128c46732bbf3477f319083161bfa2fba1fadae7a3eKan-Ru Chen	omap_get_die_id(&odi);
1291dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
130097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_IDCODE 0x%08x REV %i HAWKEYE 0x%04x MANF %03x\n",
131097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 idcode, rev, hawkeye, (idcode >> 1) & 0x7ff);
132c46732bbf3477f319083161bfa2fba1fadae7a3eKan-Ru Chen	pr_debug("OMAP_TAP_DIE_ID_0: 0x%08x\n", odi.id_0);
133097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_DIE_ID_1: 0x%08x DEV_REV: %i\n",
134c46732bbf3477f319083161bfa2fba1fadae7a3eKan-Ru Chen		 odi.id_1, (odi.id_1 >> 28) & 0xf);
135c46732bbf3477f319083161bfa2fba1fadae7a3eKan-Ru Chen	pr_debug("OMAP_TAP_DIE_ID_2: 0x%08x\n", odi.id_2);
136c46732bbf3477f319083161bfa2fba1fadae7a3eKan-Ru Chen	pr_debug("OMAP_TAP_DIE_ID_3: 0x%08x\n", odi.id_3);
137097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_debug("OMAP_TAP_PROD_ID_0: 0x%08x DEV_TYPE: %i\n",
138097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley		 prod_id, dev_type);
139097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
1401dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	/* Check hawkeye ids */
1411dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
1421dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		if (hawkeye == omap_ids[i].hawkeye)
1431dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren			break;
1441dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
1451dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
1461dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	if (i == ARRAY_SIZE(omap_ids)) {
1471dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		printk(KERN_ERR "Unknown OMAP CPU id\n");
1481dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		return;
1491dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
1501dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
1511dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	for (j = i; j < ARRAY_SIZE(omap_ids); j++) {
1521dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		if (dev_type == omap_ids[j].dev)
1531dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren			break;
1541dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
1551dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
1561dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	if (j == ARRAY_SIZE(omap_ids)) {
1571dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		printk(KERN_ERR "Unknown OMAP device type. "
1581dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren				"Handling it as OMAP%04x\n",
1591dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren				omap_ids[i].type >> 16);
1601dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren		j = i;
1611dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren	}
1621dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
16384a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	pr_info("OMAP%04x", omap_rev() >> 16);
16484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	if ((omap_rev() >> 8) & 0x0f)
16584a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen		pr_info("ES%x", (omap_rev() >> 12) & 0xf);
166097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley	pr_info("\n");
167a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren}
168a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
1698384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi#define OMAP3_CHECK_FEATURE(status,feat)				\
1708384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	if (((status & OMAP3_ ##feat## _MASK) 				\
1718384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi		>> OMAP3_ ##feat## _SHIFT) != FEAT_ ##feat## _NONE) { 	\
1728384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi		omap3_features |= OMAP3_HAS_ ##feat;			\
1738384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	}
1748384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
1755ebc0d526af51d84b3d6fbf27b69f8d44f277064Nishanth Menonstatic void __init omap3_check_features(void)
1768384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi{
1778384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	u32 status;
1788384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
1798384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	omap3_features = 0;
1808384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
1818384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	status = omap_ctrl_readl(OMAP3_CONTROL_OMAP_STATUS);
1828384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
1838384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_CHECK_FEATURE(status, L2CACHE);
1848384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_CHECK_FEATURE(status, IVA);
1858384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_CHECK_FEATURE(status, SGX);
1868384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_CHECK_FEATURE(status, NEON);
1878384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_CHECK_FEATURE(status, ISP);
1887356f0b26b3176610b4de439e8c7bfe10c797347Vishwanath BS	if (cpu_is_omap3630())
1897356f0b26b3176610b4de439e8c7bfe10c797347Vishwanath BS		omap3_features |= OMAP3_HAS_192MHZ_CLK;
190ad0c63f1d623ea9d3e0c0521d5ce9cd522c4e1f0stanley.miao	if (!cpu_is_omap3505() && !cpu_is_omap3517())
191ad0c63f1d623ea9d3e0c0521d5ce9cd522c4e1f0stanley.miao		omap3_features |= OMAP3_HAS_IO_WAKEUP;
1928384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
1938384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	/*
1948384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	 * TODO: Get additional info (where applicable)
1958384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	 *       e.g. Size of L2 cache.
1968384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	 */
1978384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi}
1988384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
1995ebc0d526af51d84b3d6fbf27b69f8d44f277064Nishanth Menonstatic void __init omap3_check_revision(void)
200a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren{
201a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u32 cpuid, idcode;
202a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u16 hawkeye;
203a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u8 rev;
204a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
205e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren	omap_chip.oc = CHIP_IS_OMAP3430;
206e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren
207a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
208a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * We cannot access revision registers on ES1.0.
209a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * If the processor type is Cortex-A8 and the revision is 0x0
210a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * it means its Cortex r0p0 which is 3430 ES1.0.
211a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
212a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	cpuid = read_cpuid(CPUID_ID);
213a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) {
21484a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen		omap_revision = OMAP3430_REV_ES1_0;
215e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		omap_chip.oc |= CHIP_IS_OMAP3430ES1;
216048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		return;
217a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	}
218a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
219a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
220a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * Detection for 34xx ES2.0 and above can be done with just
221a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * hawkeye and rev. See TRM 1.5.2 Device Identification.
222a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * Note that rev does not map directly to our defined processor
223a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * revision numbers as ES1.0 uses value 0.
224a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
225a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	idcode = read_tap_reg(OMAP_TAP_IDCODE);
226a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	hawkeye = (idcode >> 12) & 0xffff;
227a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	rev = (idcode >> 28) & 0xff;
228097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
2292456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon	switch (hawkeye) {
2302456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon	case 0xb7ae:
2312456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon		/* Handle 34xx/35xx devices */
232a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		switch (rev) {
233048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		case 0: /* Take care of early samples */
234048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		case 1:
23584a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen			omap_revision = OMAP3430_REV_ES2_0;
236e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			omap_chip.oc |= CHIP_IS_OMAP3430ES2;
237a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			break;
238a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		case 2:
23984a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen			omap_revision = OMAP3430_REV_ES2_1;
240e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			omap_chip.oc |= CHIP_IS_OMAP3430ES2;
241a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			break;
242a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		case 3:
24384a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen			omap_revision = OMAP3430_REV_ES3_0;
244e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			omap_chip.oc |= CHIP_IS_OMAP3430ES3_0;
245a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			break;
246187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren		case 4:
247e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			omap_revision = OMAP3430_REV_ES3_1;
248e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
249e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			break;
250e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		case 7:
251edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi		/* FALLTHROUGH */
252a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		default:
253a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			/* Use the latest known revision as default */
254e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			omap_revision = OMAP3430_REV_ES3_1_2;
255e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren
256e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			/* REVISIT: Add CHIP_IS_OMAP3430ES3_1_2? */
257e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
258a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		}
2592456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon		break;
2604cac60180649b83e094d4ea5c440229814488431Sanjeev Premi	case 0xb868:
2614cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		/* Handle OMAP35xx/AM35xx devices
2624cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		 *
2634cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		 * Set the device to be OMAP3505 here. Actual device
2644cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		 * is identified later based on the features.
265e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		 *
266e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		 * REVISIT: AM3505/AM3517 should have their own CHIP_IS
2674cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		 */
2684cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		omap_revision = OMAP3505_REV(rev);
269e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
2704cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		break;
271edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	case 0xb891:
272b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		/* Handle 36xx devices */
273b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		omap_chip.oc |= CHIP_IS_OMAP3630ES1;
274b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar
275b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		switch(rev) {
276b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		case 0: /* Take care of early samples */
277b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			omap_revision = OMAP3630_REV_ES1_0;
278b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			break;
279b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		case 1:
280b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			omap_revision = OMAP3630_REV_ES1_1;
281b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			omap_chip.oc |= CHIP_IS_OMAP3630ES1_1;
282b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			break;
283b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		case 2:
284b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		default:
285b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			omap_revision =  OMAP3630_REV_ES1_2;
286b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			omap_chip.oc |= CHIP_IS_OMAP3630ES1_2;
287b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			break;
288b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		}
2892456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon	default:
2902456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon		/* Unknown default to latest silicon rev as default*/
291b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		omap_revision =  OMAP3630_REV_ES1_2;
292b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		omap_chip.oc |= CHIP_IS_OMAP3630ES1_2;
293a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	}
2941dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren}
2951dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
2965ebc0d526af51d84b3d6fbf27b69f8d44f277064Nishanth Menonstatic void __init omap4_check_revision(void)
297b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar{
298b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	u32 idcode;
299b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	u16 hawkeye;
300b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	u8 rev;
301b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	char *rev_name = "ES1.0";
302b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar
303b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	/*
304b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	 * The IC rev detection is done with hawkeye and rev.
305b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	 * Note that rev does not map directly to defined processor
306b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	 * revision numbers as ES1.0 uses value 0.
307b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	 */
308b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	idcode = read_tap_reg(OMAP_TAP_IDCODE);
309b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	hawkeye = (idcode >> 12) & 0xffff;
310b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	rev = (idcode >> 28) & 0xff;
311b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar
312b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	if ((hawkeye == 0xb852) && (rev == 0x0)) {
313b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar		omap_revision = OMAP4430_REV_ES1_0;
314c6a6e6e203ee9a34fa53f773272f21d48b4e3454Abhijit Pagare		omap_chip.oc |= CHIP_IS_OMAP4430ES1;
315b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar		pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name);
316b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar		return;
317b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	}
318b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar
319b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	pr_err("Unknown OMAP4 CPU id\n");
320b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar}
321b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar
3228384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi#define OMAP3_SHOW_FEATURE(feat)		\
323cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman	if (omap3_has_ ##feat())		\
324cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman		printk(#feat" ");
3258384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
3265ebc0d526af51d84b3d6fbf27b69f8d44f277064Nishanth Menonstatic void __init omap3_cpuinfo(void)
3278384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi{
328048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	u8 rev = GET_OMAP_REVISION();
329048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	char cpu_name[16], cpu_rev[16];
330048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi
331048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	/* OMAP3430 and OMAP3530 are assumed to be same.
332048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 *
333048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 * OMAP3525, OMAP3515 and OMAP3503 can be detected only based
334048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 * on available features. Upon detection, update the CPU id
335048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 * and CPU class bits.
336048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 */
337edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	if (cpu_is_omap3630()) {
3384cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		strcpy(cpu_name, "OMAP3630");
339edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else if (cpu_is_omap3505()) {
3404cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		/*
3414cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		 * AM35xx devices
3424cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		 */
3434cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		if (omap3_has_sgx()) {
3444cac60180649b83e094d4ea5c440229814488431Sanjeev Premi			omap_revision = OMAP3517_REV(rev);
3454cac60180649b83e094d4ea5c440229814488431Sanjeev Premi			strcpy(cpu_name, "AM3517");
346edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi		} else {
3474cac60180649b83e094d4ea5c440229814488431Sanjeev Premi			/* Already set in omap3_check_revision() */
3484cac60180649b83e094d4ea5c440229814488431Sanjeev Premi			strcpy(cpu_name, "AM3505");
3494cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		}
350edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else if (omap3_has_iva() && omap3_has_sgx()) {
351edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi		/* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */
3524cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		strcpy(cpu_name, "OMAP3430/3530");
3530712fb39d7ac045171f26b24b896d58adec04133Sergey Lapin	} else if (omap3_has_iva()) {
354048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		omap_revision = OMAP3525_REV(rev);
3554cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		strcpy(cpu_name, "OMAP3525");
3560712fb39d7ac045171f26b24b896d58adec04133Sergey Lapin	} else if (omap3_has_sgx()) {
357048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		omap_revision = OMAP3515_REV(rev);
3584cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		strcpy(cpu_name, "OMAP3515");
359edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else {
360048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		omap_revision = OMAP3503_REV(rev);
3614cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		strcpy(cpu_name, "OMAP3503");
362048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	}
363048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi
364048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	switch (rev) {
365048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	case OMAP_REVBITS_00:
366048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		strcpy(cpu_rev, "1.0");
367048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		break;
368b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar	case OMAP_REVBITS_01:
369b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		strcpy(cpu_rev, "1.1");
370b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		break;
371b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar	case OMAP_REVBITS_02:
372b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		strcpy(cpu_rev, "1.2");
373b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		break;
374048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	case OMAP_REVBITS_10:
375048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		strcpy(cpu_rev, "2.0");
376048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		break;
377048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	case OMAP_REVBITS_20:
378048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		strcpy(cpu_rev, "2.1");
379048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		break;
380048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	case OMAP_REVBITS_30:
381048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		strcpy(cpu_rev, "3.0");
382048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		break;
383048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	case OMAP_REVBITS_40:
384edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	/* FALLTHROUGH */
385048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	default:
386048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		/* Use the latest known revision as default */
387048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		strcpy(cpu_rev, "3.1");
388048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	}
389048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi
390edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	/* Print verbose information */
391cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman	pr_info("%s ES%s (", cpu_name, cpu_rev);
392048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi
3938384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(l2cache);
3948384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(iva);
3958384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(sgx);
3968384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(neon);
3978384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(isp);
3987356f0b26b3176610b4de439e8c7bfe10c797347Vishwanath BS	OMAP3_SHOW_FEATURE(192mhz_clk);
399cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman
400cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman	printk(")\n");
4018384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi}
4028384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
403a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*
404a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Try to detect the exact revision of the omap we're running on
405a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */
4065ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgrenvoid __init omap2_check_revision(void)
4075ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren{
408a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
409a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * At this point we have an idea about the processor revision set
410a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * earlier with omap2_set_globals_tap().
411a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
412edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	if (cpu_is_omap24xx()) {
413a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		omap24xx_check_revision();
414edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else if (cpu_is_omap34xx()) {
4158384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi		omap3_check_revision();
41605574bb27a8a46d354582e72691ff6cb40712da9Nishanth Menon		omap3_check_features();
4178384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi		omap3_cpuinfo();
418e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		return;
419edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else if (cpu_is_omap44xx()) {
420b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar		omap4_check_revision();
42144169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar		return;
422edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else {
423a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		pr_err("OMAP revision unknown, please fix!\n");
424edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	}
425a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
426a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
427a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * OK, now we know the exact revision. Initialize omap_chip bits
428a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * for powerdowmain and clockdomain code.
429a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
430a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if (cpu_is_omap243x()) {
431a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		/* Currently only supports 2430ES2.1 and 2430-all */
432a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		omap_chip.oc |= CHIP_IS_OMAP2430;
433e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		return;
434a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	} else if (cpu_is_omap242x()) {
435a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		/* Currently only supports 2420ES2.1.1 and 2420-all */
436a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		omap_chip.oc |= CHIP_IS_OMAP2420;
437e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		return;
438a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	}
439e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren
440e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren	pr_err("Uninitialized omap_chip, please fix!\n");
4415ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren}
4425ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren
443a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*
444a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Set up things for map_io and processor detection later on. Gets called
445a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * pretty much first thing from board init. For multi-omap, this gets
446a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * cpu_is_omapxxxx() working accurately enough for map_io. Then we'll try to
447a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * detect the exact revision later on in omap2_detect_revision() once map_io
448a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * is done.
449a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */
4500e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenvoid __init omap2_set_globals_tap(struct omap_globals *omap2_globals)
4510e564848693b06b037ec05e68c9e4b266250789eTony Lindgren{
45284a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	omap_revision = omap2_globals->class;
4530e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	tap_base = omap2_globals->tap;
4540e564848693b06b037ec05e68c9e4b266250789eTony Lindgren
455a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if (cpu_is_omap34xx())
4560e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		tap_prod_id = 0x0210;
4570e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	else
4580e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		tap_prod_id = 0x0208;
4590e564848693b06b037ec05e68c9e4b266250789eTony Lindgren}
460