id.c revision 55035c1524b5b48ac7d267167c4895f7831897ad
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 22901001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekarstatic void __init ti816x_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"; 3461e6cb146c39cdef1ffc340c13637fce2ba5575beAfzal Mohammed break; 3472456a10fb3a9b8c9e970b05e6c1370201675da0aNishanth Menon default: 34851ec811a292eba77c1df00d9d6416526b1ce7972Paul Walmsley /* Unknown default to latest silicon rev as default */ 3493b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley omap_revision = OMAP3630_REV_ES1_2; 3503b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley *cpu_rev = "1.2"; 35151ec811a292eba77c1df00d9d6416526b1ce7972Paul Walmsley pr_warn("Warning: unknown chip type; assuming OMAP3630ES1.2\n"); 352a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren } 3531dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren} 3541dbae815a724303b46ab4663b5fc23c13e9d9690Tony Lindgren 3555ebc0d526af51d84b3d6fbf27b69f8d44f277064Nishanth Menonstatic void __init omap4_check_revision(void) 356b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar{ 357b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar u32 idcode; 358b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar u16 hawkeye; 359b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar u8 rev; 360b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar 361b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar /* 362b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar * The IC rev detection is done with hawkeye and rev. 363b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar * Note that rev does not map directly to defined processor 364b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar * revision numbers as ES1.0 uses value 0. 365b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar */ 366b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar idcode = read_tap_reg(OMAP_TAP_IDCODE); 367b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar hawkeye = (idcode >> 12) & 0xffff; 368e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat rev = (idcode >> 28) & 0xf; 369b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar 370ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar /* 371fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V * Few initial 4430 ES2.0 samples IDCODE is same as ES1.0 372ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar * Use ARM register to detect the correct ES version 373ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar */ 374fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V if (!rev && (hawkeye != 0xb94e)) { 375ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar idcode = read_cpuid(CPUID_ID); 376ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar rev = (idcode & 0xf) - 1; 377ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar } 378ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar 379ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar switch (hawkeye) { 380ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar case 0xb852: 381ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar switch (rev) { 382ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar case 0: 383ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar omap_revision = OMAP4430_REV_ES1_0; 384ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar break; 385ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar case 1: 386e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat default: 387ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar omap_revision = OMAP4430_REV_ES2_0; 388e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat } 389e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat break; 390e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat case 0xb95c: 391e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat switch (rev) { 392e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat case 3: 393e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat omap_revision = OMAP4430_REV_ES2_1; 394ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar break; 395e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat case 4: 396e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat omap_revision = OMAP4430_REV_ES2_2; 39755035c1524b5b48ac7d267167c4895f7831897adDavid Anders break; 39855035c1524b5b48ac7d267167c4895f7831897adDavid Anders case 6: 39955035c1524b5b48ac7d267167c4895f7831897adDavid Anders default: 40055035c1524b5b48ac7d267167c4895f7831897adDavid Anders omap_revision = OMAP4430_REV_ES2_3; 401e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat } 402e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat break; 403fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V case 0xb94e: 404fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V switch (rev) { 405fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V case 0: 406fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V default: 407fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V omap_revision = OMAP4460_REV_ES1_0; 408fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V break; 409fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V } 410fa54dccddc8f4a53c223d53c56c54c61ea7d2623Aneesh V break; 411ed6be0bafc7781634a197ddd85b575ffcd7736b6Santosh Shilimkar default: 412e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat /* Unknown default to latest silicon rev as default */ 41355035c1524b5b48ac7d267167c4895f7831897adDavid Anders omap_revision = OMAP4430_REV_ES2_3; 414b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar } 415b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar 416e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat pr_info("OMAP%04x ES%d.%d\n", omap_rev() >> 16, 417e49c4d27ab5ffd0d8707685af9ca2866a95660e8Nishant Kamat ((omap_rev() >> 12) & 0xf), ((omap_rev() >> 8) & 0xf)); 418b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar} 419b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar 4208384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi#define OMAP3_SHOW_FEATURE(feat) \ 421cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman if (omap3_has_ ##feat()) \ 422cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman printk(#feat" "); 4238384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 4243b32b7d62e9800579e591553875e5ff60be15546Paul Walmsleystatic void __init omap3_cpuinfo(const char *cpu_rev) 4258384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi{ 4263b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley const char *cpu_name; 427048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi 42891d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley /* 42991d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley * OMAP3430 and OMAP3530 are assumed to be same. 430048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi * 431048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi * OMAP3525, OMAP3515 and OMAP3503 can be detected only based 432048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi * on available features. Upon detection, update the CPU id 433048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi * and CPU class bits. 434048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi */ 435edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi if (cpu_is_omap3630()) { 43691d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley cpu_name = "OMAP3630"; 4371f1b0353aa3ba5dfc35641452484ea4158ee3c9cPaul Walmsley } else if (cpu_is_omap3517()) { 43891d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley /* AM35xx devices */ 43991d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505"; 44001001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar } else if (cpu_is_ti816x()) { 44191d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley cpu_name = "TI816X"; 4421e6cb146c39cdef1ffc340c13637fce2ba5575beAfzal Mohammed } else if (cpu_is_am335x()) { 4431e6cb146c39cdef1ffc340c13637fce2ba5575beAfzal Mohammed cpu_name = "AM335X"; 444edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi } else if (omap3_has_iva() && omap3_has_sgx()) { 445edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi /* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */ 44691d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley cpu_name = "OMAP3430/3530"; 4470712fb39d7ac045171f26b24b896d58adec04133Sergey Lapin } else if (omap3_has_iva()) { 44891d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley cpu_name = "OMAP3525"; 4490712fb39d7ac045171f26b24b896d58adec04133Sergey Lapin } else if (omap3_has_sgx()) { 45091d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley cpu_name = "OMAP3515"; 451edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi } else { 45291d92d6cc86c9390b891a96e12a452a644c3ad76Paul Walmsley cpu_name = "OMAP3503"; 453048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi } 454048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi 455edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi /* Print verbose information */ 456cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman pr_info("%s ES%s (", cpu_name, cpu_rev); 457048f4bd7607eb714d4831f90dea6fd27eac9e494Sanjeev Premi 4588384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(l2cache); 4598384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(iva); 4608384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(sgx); 4618384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(neon); 4628384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi OMAP3_SHOW_FEATURE(isp); 4637356f0b26b3176610b4de439e8c7bfe10c797347Vishwanath BS OMAP3_SHOW_FEATURE(192mhz_clk); 464cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman 465cedf900d657e09f060b52f0598fc56aae9fbfba3Kevin Hilman printk(")\n"); 4668384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi} 4678384ce071365244332ea05c81112bfffcf48be87Sanjeev Premi 468a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/* 469a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Try to detect the exact revision of the omap we're running on 470a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */ 4715ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgrenvoid __init omap2_check_revision(void) 4725ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren{ 4733b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley const char *cpu_rev; 4743b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley 475a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren /* 476a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * At this point we have an idea about the processor revision set 477a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * earlier with omap2_set_globals_tap(). 478a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */ 479edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi if (cpu_is_omap24xx()) { 480a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren omap24xx_check_revision(); 481edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi } else if (cpu_is_omap34xx()) { 4823b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley omap3_check_revision(&cpu_rev); 48301001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar 48401001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar /* TI816X doesn't have feature register */ 48501001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar if (!cpu_is_ti816x()) 48601001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar omap3_check_features(); 48701001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar else 48801001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar ti816x_check_features(); 48901001712c96f82e6317b1e09729d8fc4bcc66957Hemant Pedanekar 4903b32b7d62e9800579e591553875e5ff60be15546Paul Walmsley omap3_cpuinfo(cpu_rev); 491e9acb9b64d7fb16c7f69efa85c5707cffd0c7275Tony Lindgren return; 492edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi } else if (cpu_is_omap44xx()) { 493b570e0ec25b371c2e01a1a558e852e2618526817Santosh Shilimkar omap4_check_revision(); 494cc0170b2d929b8a31fec3da66a132822a99f550bAneesh V omap4_check_features(); 49544169075e6eaa87bab6a296209d8d0610879b394Santosh Shilimkar return; 496edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi } else { 497a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren pr_err("OMAP revision unknown, please fix!\n"); 498edeae658b282f2d076efb3b3f39ccd8eb0c384faFelipe Balbi } 4995ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren} 5005ba02dcab945dc0bcde7df0c5958329f34bd04aeTony Lindgren 501a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren/* 502a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * Set up things for map_io and processor detection later on. Gets called 503a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * pretty much first thing from board init. For multi-omap, this gets 504a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * cpu_is_omapxxxx() working accurately enough for map_io. Then we'll try to 505a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * detect the exact revision later on in omap2_detect_revision() once map_io 506a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren * is done. 507a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren */ 5080e564848693b06b037ec05e68c9e4b266250789eTony Lindgrenvoid __init omap2_set_globals_tap(struct omap_globals *omap2_globals) 5090e564848693b06b037ec05e68c9e4b266250789eTony Lindgren{ 51084a34344ea1f2f313d84a9fb4cb685b65a6ec26dLauri Leukkunen omap_revision = omap2_globals->class; 5110e564848693b06b037ec05e68c9e4b266250789eTony Lindgren tap_base = omap2_globals->tap; 5120e564848693b06b037ec05e68c9e4b266250789eTony Lindgren 513a88231430384f49bebf8a6ec607a9eb4f2254e34Tony Lindgren if (cpu_is_omap34xx()) 5140e564848693b06b037ec05e68c9e4b266250789eTony Lindgren tap_prod_id = 0x0210; 5150e564848693b06b037ec05e68c9e4b266250789eTony Lindgren else 5160e564848693b06b037ec05e68c9e4b266250789eTony Lindgren tap_prod_id = 0x0208; 5170e564848693b06b037ec05e68c9e4b266250789eTony Lindgren} 518