id.c revision 4390f5b2cb1f568c1d4b3e5bbf57158f6809627a
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 *
9e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat * Copyright (C) 2009-11 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
244e65331c6bb4a777bd61a4dac0daa9fc47777b63Tony Lindgren#include "common.h"
25ce491cf85466c3377228c5a852ea627ec5136956Tony Lindgren#include <plat/cpu.h>
2672d0f1c3cdc7c456e1e357359ec6f566d0a5f264Syed Mohammed Khasim
272e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen#include <mach/id.h>
282e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen
294814ced5116e3b73dc4f63eec84999739fc8ed11Paul Walmsley#include "control.h"
304814ced5116e3b73dc4f63eec84999739fc8ed11Paul Walmsley
3184a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunenstatic unsigned int omap_revision;
3284a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen
33cc0170b2d929b8a31fec3da66a132822a99f550bAneesh Vu32 omap_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
418e25ad964aac0bf6b30dd013303750089f819679Kevin Hilmanint omap_type(void)
428e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman{
438e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	u32 val = 0;
448e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
45edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	if (cpu_is_omap24xx()) {
468e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman		val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS);
47edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else if (cpu_is_omap34xx()) {
488e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman		val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
49737daa036081ad3030268f658d8dff785b3e73cdSantosh Shilimkar	} else if (cpu_is_omap44xx()) {
50dcf5ef3f42fbc0c62043b4c466d679fca32f1b9fSantosh Shilimkar		val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS);
51edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else {
528e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman		pr_err("Cannot detect omap type!\n");
538e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman		goto out;
548e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	}
558e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
568e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	val &= OMAP2_DEVICETYPE_MASK;
578e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	val >>= 8;
588e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
598e25ad964aac0bf6b30dd013303750089f819679Kevin Hilmanout:
608e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman	return val;
618e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman}
628e25ad964aac0bf6b30dd013303750089f819679Kevin HilmanEXPORT_SYMBOL(omap_type);
638e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
648e25ad964aac0bf6b30dd013303750089f819679Kevin Hilman
65a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*----------------------------------------------------------------------------*/
66097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
67a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_IDCODE		0x0204
68a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_0	0x0218
69a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_1	0x021C
70a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_2	0x0220
71a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define OMAP_TAP_DIE_ID_3	0x0224
72097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
73b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green#define OMAP_TAP_DIE_ID_44XX_0	0x0200
74b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green#define OMAP_TAP_DIE_ID_44XX_1	0x0208
75b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green#define OMAP_TAP_DIE_ID_44XX_2	0x020c
76b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green#define OMAP_TAP_DIE_ID_44XX_3	0x0210
77b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green
78a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren#define read_tap_reg(reg)	__raw_readl(tap_base  + (reg))
79097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
80a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstruct omap_id {
81a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u16	hawkeye;	/* Silicon type (Hawkeye id) */
82a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u8	dev;		/* Device type from production_id reg */
8384a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	u32	type;		/* Combined type id copied to omap_revision */
84a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren};
85097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
86a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/* Register values to detect the OMAP version */
87a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic struct omap_id omap_ids[] __initdata = {
88a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x0, .type = 0x24200024 },
89a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x1, .type = 0x24201024 },
90a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x2, .type = 0x24202024 },
91a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x4, .type = 0x24220024 },
92a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb5d9, .dev = 0x8, .type = 0x24230024 },
93a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	{ .hawkeye = 0xb68a, .dev = 0x0, .type = 0x24300024 },
94a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren};
95097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
96a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic void __iomem *tap_base;
97a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgrenstatic u16 tap_prod_id;
981dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
992e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chenvoid omap_get_die_id(struct omap_die_id *odi)
1002e130fc3d4fd5b38ee5d3c0a5c7f9fb85bce698eKan-Ru Chen{
101b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green	if (cpu_is_omap44xx()) {
102b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green		odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_0);
103b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green		odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_1);
104b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green		odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_2);
105b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green		odi->id_3 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_3);
106b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green
107b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green		return;
108b235e007831dbf57710e59cd4a120e2f374eecb9Andy Green	}
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) { 	\
172cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		omap_features |= OMAP3_HAS_ ##feat;			\
1738384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	}
1748384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
1755ebc0d526af51d84b3d6fbf27b69f8d44f277064Nishanth Menonstatic void __init omap3_check_features(void)
1768384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi{
1778384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	u32 status;
1788384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
179cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V	omap_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())
189cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		omap_features |= OMAP3_HAS_192MHZ_CLK;
190b02b917211d50ad5dc13e49c933ef916b10e0d00Paul Walmsley	if (cpu_is_omap3430() || cpu_is_omap3630())
191cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		omap_features |= OMAP3_HAS_IO_WAKEUP;
192b02b917211d50ad5dc13e49c933ef916b10e0d00Paul Walmsley	if (cpu_is_omap3630() || omap_rev() == OMAP3430_REV_ES3_1 ||
193b02b917211d50ad5dc13e49c933ef916b10e0d00Paul Walmsley	    omap_rev() == OMAP3430_REV_ES3_1_2)
194b02b917211d50ad5dc13e49c933ef916b10e0d00Paul Walmsley		omap_features |= OMAP3_HAS_IO_CHAIN_CTRL;
1958384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
196cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V	omap_features |= OMAP3_HAS_SDRC;
19701001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar
1988384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	/*
1998384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	 * TODO: Get additional info (where applicable)
2008384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	 *       e.g. Size of L2 cache.
2018384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	 */
2028384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi}
2038384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
204cc0170b2d929b8a31fec3da66a132822a99f550bAneesh Vstatic void __init omap4_check_features(void)
205cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V{
206cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V	u32 si_type;
207cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V
208cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V	if (cpu_is_omap443x())
209cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		omap_features |= OMAP4_HAS_MPU_1GHZ;
210cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V
211cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V
212cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V	if (cpu_is_omap446x()) {
213cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		si_type =
214cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V			read_tap_reg(OMAP4_CTRL_MODULE_CORE_STD_FUSE_PROD_ID_1);
215cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		switch ((si_type & (3 << 16)) >> 16) {
216cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		case 2:
217cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V			/* High performance device */
218cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V			omap_features |= OMAP4_HAS_MPU_1_5GHZ;
219cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V			break;
220cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		case 1:
221cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		default:
222cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V			/* Standard device */
223cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V			omap_features |= OMAP4_HAS_MPU_1_2GHZ;
224cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V			break;
225cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		}
226cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V	}
227cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V}
228cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V
229a920360f038e976e7a86b002e209402da20e9147Hemant Pedanekarstatic void __init ti81xx_check_features(void)
23001001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar{
231cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V	omap_features = OMAP3_HAS_NEON;
23201001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar}
23301001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar
2343b32b7d62e9800579e591553875e5ff60be15546Paul Walmsleystatic void __init omap3_check_revision(const char **cpu_rev)
235a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren{
236a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u32 cpuid, idcode;
237a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u16 hawkeye;
238a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	u8 rev;
239a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
240a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
241a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * We cannot access revision registers on ES1.0.
242a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * If the processor type is Cortex-A8 and the revision is 0x0
243a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * it means its Cortex r0p0 which is 3430 ES1.0.
244a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
245a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	cpuid = read_cpuid(CPUID_ID);
246a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) {
24784a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen		omap_revision = OMAP3430_REV_ES1_0;
2483b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley		*cpu_rev = "1.0";
249048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		return;
250a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	}
251a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren
252a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
253a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * Detection for 34xx ES2.0 and above can be done with just
254a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * hawkeye and rev. See TRM 1.5.2 Device Identification.
255a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * Note that rev does not map directly to our defined processor
256a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * revision numbers as ES1.0 uses value 0.
257a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
258a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	idcode = read_tap_reg(OMAP_TAP_IDCODE);
259a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	hawkeye = (idcode >> 12) & 0xffff;
260a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	rev = (idcode >> 28) & 0xff;
261097c584cd48844d9ef8402bdc6ab49e7e2135f31Paul Walmsley
2622456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon	switch (hawkeye) {
2632456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon	case 0xb7ae:
2642456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon		/* Handle 34xx/35xx devices */
265a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		switch (rev) {
266048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		case 0: /* Take care of early samples */
267048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi		case 1:
26884a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen			omap_revision = OMAP3430_REV_ES2_0;
2693b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "2.0";
270a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			break;
271a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		case 2:
27284a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen			omap_revision = OMAP3430_REV_ES2_1;
2733b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "2.1";
274a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			break;
275a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		case 3:
27684a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen			omap_revision = OMAP3430_REV_ES3_0;
2773b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "3.0";
278a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			break;
279187e688d237a6df11a2d32e8ac480b6d1fbd40b9Tony Lindgren		case 4:
280e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			omap_revision = OMAP3430_REV_ES3_1;
2813b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "3.1";
282e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			break;
283e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		case 7:
284edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi		/* FALLTHROUGH */
285a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		default:
286a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren			/* Use the latest known revision as default */
287e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren			omap_revision = OMAP3430_REV_ES3_1_2;
2883b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "3.1.2";
289a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		}
2902456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon		break;
2914cac60180649b83e094d4ea5c440229814488431Sanjeev Premi	case 0xb868:
2921f1b0353aa3ba5dfc35641452484ea4158ee3c9cPaul Walmsley		/*
2931f1b0353aa3ba5dfc35641452484ea4158ee3c9cPaul Walmsley		 * Handle OMAP/AM 3505/3517 devices
2944cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		 *
2951f1b0353aa3ba5dfc35641452484ea4158ee3c9cPaul Walmsley		 * Set the device to be OMAP3517 here. Actual device
2964cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		 * is identified later based on the features.
2974cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		 */
2989ed2ba7aa78ee35dda2cfc9a49b5cd4b2ae88500Paul Walmsley		switch (rev) {
2999ed2ba7aa78ee35dda2cfc9a49b5cd4b2ae88500Paul Walmsley		case 0:
3009ed2ba7aa78ee35dda2cfc9a49b5cd4b2ae88500Paul Walmsley			omap_revision = OMAP3517_REV_ES1_0;
3013b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "1.0";
3029ed2ba7aa78ee35dda2cfc9a49b5cd4b2ae88500Paul Walmsley			break;
3039ed2ba7aa78ee35dda2cfc9a49b5cd4b2ae88500Paul Walmsley		case 1:
3049ed2ba7aa78ee35dda2cfc9a49b5cd4b2ae88500Paul Walmsley		/* FALLTHROUGH */
3059ed2ba7aa78ee35dda2cfc9a49b5cd4b2ae88500Paul Walmsley		default:
3069ed2ba7aa78ee35dda2cfc9a49b5cd4b2ae88500Paul Walmsley			omap_revision = OMAP3517_REV_ES1_1;
3073b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "1.1";
3089ed2ba7aa78ee35dda2cfc9a49b5cd4b2ae88500Paul Walmsley		}
3094cac60180649b83e094d4ea5c440229814488431Sanjeev Premi		break;
310edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	case 0xb891:
311b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		/* Handle 36xx devices */
312b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar
313b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		switch(rev) {
314b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		case 0: /* Take care of early samples */
315b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			omap_revision = OMAP3630_REV_ES1_0;
3163b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "1.0";
317b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			break;
318b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		case 1:
319b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			omap_revision = OMAP3630_REV_ES1_1;
3203b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "1.1";
321b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar			break;
322b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		case 2:
32351ec811a292eba77c1df00d9d6416526b1ce7972Paul Walmsley		/* FALLTHROUGH */
324b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		default:
32551ec811a292eba77c1df00d9d6416526b1ce7972Paul Walmsley			omap_revision = OMAP3630_REV_ES1_2;
3263b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "1.2";
327b0a1a6ce0597662c06f970643da60b8ebb5cdd1cAnand Gadiyar		}
32877c0870ca515667b77750b397008d68a17fad9d8Nishanth Menon		break;
32901001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar	case 0xb81e:
33001001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar		switch (rev) {
33101001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar		case 0:
33201001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar			omap_revision = TI8168_REV_ES1_0;
3333b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "1.0";
33401001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar			break;
33501001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar		case 1:
33651ec811a292eba77c1df00d9d6416526b1ce7972Paul Walmsley		/* FALLTHROUGH */
33701001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar		default:
33851ec811a292eba77c1df00d9d6416526b1ce7972Paul Walmsley			omap_revision = TI8168_REV_ES1_1;
3393b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			*cpu_rev = "1.1";
3403b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley			break;
34101001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar		}
34201001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar		break;
3431e6cb146c39cdef1ffc340c13637fce2ba5575beAfzal Mohammed	case 0xb944:
3441e6cb146c39cdef1ffc340c13637fce2ba5575beAfzal Mohammed		omap_revision = AM335X_REV_ES1_0;
3451e6cb146c39cdef1ffc340c13637fce2ba5575beAfzal Mohammed		*cpu_rev = "1.0";
3464390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar	case 0xb8f2:
3474390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		switch (rev) {
3484390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		case 0:
3494390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		/* FALLTHROUGH */
3504390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		case 1:
3514390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar			omap_revision = TI8148_REV_ES1_0;
3524390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar			*cpu_rev = "1.0";
3534390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar			break;
3544390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		case 2:
3554390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar			omap_revision = TI8148_REV_ES2_0;
3564390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar			*cpu_rev = "2.0";
3574390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar			break;
3584390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		case 3:
3594390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		/* FALLTHROUGH */
3604390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		default:
3614390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar			omap_revision = TI8148_REV_ES2_1;
3624390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar			*cpu_rev = "2.1";
3634390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar			break;
3644390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		}
3651e6cb146c39cdef1ffc340c13637fce2ba5575beAfzal Mohammed		break;
3662456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon	default:
36751ec811a292eba77c1df00d9d6416526b1ce7972Paul Walmsley		/* Unknown default to latest silicon rev as default */
3683b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley		omap_revision = OMAP3630_REV_ES1_2;
3693b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley		*cpu_rev = "1.2";
37051ec811a292eba77c1df00d9d6416526b1ce7972Paul Walmsley		pr_warn("Warning: unknown chip type; assuming OMAP3630ES1.2\n");
371a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	}
3721dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren}
3731dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren
3745ebc0d526af51d84b3d6fbf27b69f8d44f277064Nishanth Menonstatic void __init omap4_check_revision(void)
375b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar{
376b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	u32 idcode;
377b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	u16 hawkeye;
378b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	u8 rev;
379b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar
380b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	/*
381b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	 * The IC rev detection is done with hawkeye and rev.
382b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	 * Note that rev does not map directly to defined processor
383b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	 * revision numbers as ES1.0 uses value 0.
384b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	 */
385b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	idcode = read_tap_reg(OMAP_TAP_IDCODE);
386b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	hawkeye = (idcode >> 12) & 0xffff;
387e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat	rev = (idcode >> 28) & 0xf;
388b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar
389ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar	/*
390fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V	 * Few initial 4430 ES2.0 samples IDCODE is same as ES1.0
391ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar	 * Use ARM register to detect the correct ES version
392ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar	 */
393ec023e46f7e86acb04fef5bdd1e9465f5fc39894Leonid Iziumtsev	if (!rev && (hawkeye != 0xb94e) && (hawkeye != 0xb975)) {
394ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar		idcode = read_cpuid(CPUID_ID);
395ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar		rev = (idcode & 0xf) - 1;
396ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar	}
397ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar
398ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar	switch (hawkeye) {
399ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar	case 0xb852:
400ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar		switch (rev) {
401ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar		case 0:
402ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar			omap_revision = OMAP4430_REV_ES1_0;
403ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar			break;
404ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar		case 1:
405e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		default:
406ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar			omap_revision = OMAP4430_REV_ES2_0;
407e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		}
408e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		break;
409e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat	case 0xb95c:
410e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		switch (rev) {
411e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		case 3:
412e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat			omap_revision = OMAP4430_REV_ES2_1;
413ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar			break;
414e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		case 4:
415e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat			omap_revision = OMAP4430_REV_ES2_2;
41655035c1524b5b48ac7d267167c4895f7831897adDavid Anders			break;
41755035c1524b5b48ac7d267167c4895f7831897adDavid Anders		case 6:
41855035c1524b5b48ac7d267167c4895f7831897adDavid Anders		default:
41955035c1524b5b48ac7d267167c4895f7831897adDavid Anders			omap_revision = OMAP4430_REV_ES2_3;
420e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		}
421e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		break;
422fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V	case 0xb94e:
423fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V		switch (rev) {
424fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V		case 0:
425fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V		default:
426fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V			omap_revision = OMAP4460_REV_ES1_0;
427fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V			break;
428fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V		}
429fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V		break;
430ec023e46f7e86acb04fef5bdd1e9465f5fc39894Leonid Iziumtsev	case 0xb975:
431ec023e46f7e86acb04fef5bdd1e9465f5fc39894Leonid Iziumtsev		switch (rev) {
432ec023e46f7e86acb04fef5bdd1e9465f5fc39894Leonid Iziumtsev		case 0:
433ec023e46f7e86acb04fef5bdd1e9465f5fc39894Leonid Iziumtsev		default:
434ec023e46f7e86acb04fef5bdd1e9465f5fc39894Leonid Iziumtsev			omap_revision = OMAP4470_REV_ES1_0;
435ec023e46f7e86acb04fef5bdd1e9465f5fc39894Leonid Iziumtsev			break;
436ec023e46f7e86acb04fef5bdd1e9465f5fc39894Leonid Iziumtsev		}
437ec023e46f7e86acb04fef5bdd1e9465f5fc39894Leonid Iziumtsev		break;
438ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar	default:
439e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		/* Unknown default to latest silicon rev as default */
44055035c1524b5b48ac7d267167c4895f7831897adDavid Anders		omap_revision = OMAP4430_REV_ES2_3;
441b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar	}
442b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar
443e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat	pr_info("OMAP%04x ES%d.%d\n", omap_rev() >> 16,
444e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat		((omap_rev() >> 12) & 0xf), ((omap_rev() >> 8) & 0xf));
445b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar}
446b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar
4478384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi#define OMAP3_SHOW_FEATURE(feat)		\
448cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman	if (omap3_has_ ##feat())		\
449cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman		printk(#feat" ");
4508384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
4513b32b7d62e9800579e591553875e5ff60be15546Paul Walmsleystatic void __init omap3_cpuinfo(const char *cpu_rev)
4528384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi{
4533b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley	const char *cpu_name;
454048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi
45591d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley	/*
45691d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley	 * OMAP3430 and OMAP3530 are assumed to be same.
457048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 *
458048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 * OMAP3525, OMAP3515 and OMAP3503 can be detected only based
459048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 * on available features. Upon detection, update the CPU id
460048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 * and CPU class bits.
461048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	 */
462edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	if (cpu_is_omap3630()) {
46391d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley		cpu_name = "OMAP3630";
4641f1b0353aa3ba5dfc35641452484ea4158ee3c9cPaul Walmsley	} else if (cpu_is_omap3517()) {
46591d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley		/* AM35xx devices */
46691d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley		cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505";
46701001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar	} else if (cpu_is_ti816x()) {
46891d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley		cpu_name = "TI816X";
4691e6cb146c39cdef1ffc340c13637fce2ba5575beAfzal Mohammed	} else if (cpu_is_am335x()) {
4701e6cb146c39cdef1ffc340c13637fce2ba5575beAfzal Mohammed		cpu_name =  "AM335X";
4714390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar	} else if (cpu_is_ti814x()) {
4724390f5b2cb1f568c1d4b3e5bbf57158f6809627aHemant Pedanekar		cpu_name = "TI814X";
473edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else if (omap3_has_iva() && omap3_has_sgx()) {
474edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi		/* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */
47591d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley		cpu_name = "OMAP3430/3530";
4760712fb39d7ac045171f26b24b896d58adec04133Sergey Lapin	} else if (omap3_has_iva()) {
47791d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley		cpu_name = "OMAP3525";
4780712fb39d7ac045171f26b24b896d58adec04133Sergey Lapin	} else if (omap3_has_sgx()) {
47991d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley		cpu_name = "OMAP3515";
480edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else {
48191d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley		cpu_name = "OMAP3503";
482048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi	}
483048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi
484edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	/* Print verbose information */
485cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman	pr_info("%s ES%s (", cpu_name, cpu_rev);
486048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi
4878384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(l2cache);
4888384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(iva);
4898384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(sgx);
4908384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(neon);
4918384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi	OMAP3_SHOW_FEATURE(isp);
4927356f0b26b3176610b4de439e8c7bfe10c797347Vishwanath BS	OMAP3_SHOW_FEATURE(192mhz_clk);
493cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman
494cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman	printk(")\n");
4958384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi}
4968384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi
497a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*
498a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Try to detect the exact revision of the omap we're running on
499a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */
5005ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgrenvoid __init omap2_check_revision(void)
5015ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren{
5023b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley	const char *cpu_rev;
5033b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley
504a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	/*
505a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * At this point we have an idea about the processor revision set
506a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 * earlier with omap2_set_globals_tap().
507a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	 */
508edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	if (cpu_is_omap24xx()) {
509a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		omap24xx_check_revision();
510edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else if (cpu_is_omap34xx()) {
5113b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley		omap3_check_revision(&cpu_rev);
51201001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar
513a920360f038e976e7a86b002e209402da20e9147Hemant Pedanekar		/* TI81XX doesn't have feature register */
514a920360f038e976e7a86b002e209402da20e9147Hemant Pedanekar		if (!cpu_is_ti81xx())
51501001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar			omap3_check_features();
51601001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar		else
517a920360f038e976e7a86b002e209402da20e9147Hemant Pedanekar			ti81xx_check_features();
51801001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar
5193b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley		omap3_cpuinfo(cpu_rev);
520e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren		return;
521edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else if (cpu_is_omap44xx()) {
522b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar		omap4_check_revision();
523cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V		omap4_check_features();
52444169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar		return;
525edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	} else {
526a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren		pr_err("OMAP revision unknown, please fix!\n");
527edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi	}
5285ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren}
5295ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren
530a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/*
531a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Set up things for map_io and processor detection later on. Gets called
532a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * pretty much first thing from board init. For multi-omap, this gets
533a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * cpu_is_omapxxxx() working accurately enough for map_io. Then we'll try to
534a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * detect the exact revision later on in omap2_detect_revision() once map_io
535a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * is done.
536a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */
5370e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenvoid __init omap2_set_globals_tap(struct omap_globals *omap2_globals)
5380e564848693b06b037ec05e68c9e4b266250789eTony Lindgren{
53984a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen	omap_revision = omap2_globals->class;
5400e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	tap_base = omap2_globals->tap;
5410e564848693b06b037ec05e68c9e4b266250789eTony Lindgren
542a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren	if (cpu_is_omap34xx())
5430e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		tap_prod_id = 0x0210;
5440e564848693b06b037ec05e68c9e4b266250789eTony Lindgren	else
5450e564848693b06b037ec05e68c9e4b266250789eTony Lindgren		tap_prod_id = 0x0208;
5460e564848693b06b037ec05e68c9e4b266250789eTony Lindgren}
547