aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/id.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/id.c')
-rw-r--r--arch/arm/mach-omap2/id.c172
1 files changed, 136 insertions, 36 deletions
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index 9a879f959509..2537090aa33a 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -6,7 +6,7 @@
6 * Copyright (C) 2005 Nokia Corporation 6 * Copyright (C) 2005 Nokia Corporation
7 * Written by Tony Lindgren <tony@atomide.com> 7 * Written by Tony Lindgren <tony@atomide.com>
8 * 8 *
9 * Copyright (C) 2009 Texas Instruments 9 * Copyright (C) 2009-11 Texas Instruments
10 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> 10 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
11 * 11 *
12 * This program is free software; you can redistribute it and/or modify 12 * This program is free software; you can redistribute it and/or modify
@@ -22,11 +22,12 @@
22#include <asm/cputype.h> 22#include <asm/cputype.h>
23 23
24#include <plat/common.h> 24#include <plat/common.h>
25#include <plat/control.h>
26#include <plat/cpu.h> 25#include <plat/cpu.h>
27 26
28#include <mach/id.h> 27#include <mach/id.h>
29 28
29#include "control.h"
30
30static struct omap_chip_id omap_chip; 31static struct omap_chip_id omap_chip;
31static unsigned int omap_revision; 32static unsigned int omap_revision;
32 33
@@ -60,7 +61,7 @@ int omap_type(void)
60 } else if (cpu_is_omap34xx()) { 61 } else if (cpu_is_omap34xx()) {
61 val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS); 62 val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
62 } else if (cpu_is_omap44xx()) { 63 } else if (cpu_is_omap44xx()) {
63 val = omap_ctrl_readl(OMAP44XX_CONTROL_STATUS); 64 val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS);
64 } else { 65 } else {
65 pr_err("Cannot detect omap type!\n"); 66 pr_err("Cannot detect omap type!\n");
66 goto out; 67 goto out;
@@ -83,6 +84,11 @@ EXPORT_SYMBOL(omap_type);
83#define OMAP_TAP_DIE_ID_2 0x0220 84#define OMAP_TAP_DIE_ID_2 0x0220
84#define OMAP_TAP_DIE_ID_3 0x0224 85#define OMAP_TAP_DIE_ID_3 0x0224
85 86
87#define OMAP_TAP_DIE_ID_44XX_0 0x0200
88#define OMAP_TAP_DIE_ID_44XX_1 0x0208
89#define OMAP_TAP_DIE_ID_44XX_2 0x020c
90#define OMAP_TAP_DIE_ID_44XX_3 0x0210
91
86#define read_tap_reg(reg) __raw_readl(tap_base + (reg)) 92#define read_tap_reg(reg) __raw_readl(tap_base + (reg))
87 93
88struct omap_id { 94struct omap_id {
@@ -106,6 +112,14 @@ static u16 tap_prod_id;
106 112
107void omap_get_die_id(struct omap_die_id *odi) 113void omap_get_die_id(struct omap_die_id *odi)
108{ 114{
115 if (cpu_is_omap44xx()) {
116 odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_0);
117 odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_1);
118 odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_2);
119 odi->id_3 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_3);
120
121 return;
122 }
109 odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_0); 123 odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_0);
110 odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_1); 124 odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_1);
111 odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_2); 125 odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_2);
@@ -190,12 +204,19 @@ static void __init omap3_check_features(void)
190 if (!cpu_is_omap3505() && !cpu_is_omap3517()) 204 if (!cpu_is_omap3505() && !cpu_is_omap3517())
191 omap3_features |= OMAP3_HAS_IO_WAKEUP; 205 omap3_features |= OMAP3_HAS_IO_WAKEUP;
192 206
207 omap3_features |= OMAP3_HAS_SDRC;
208
193 /* 209 /*
194 * TODO: Get additional info (where applicable) 210 * TODO: Get additional info (where applicable)
195 * e.g. Size of L2 cache. 211 * e.g. Size of L2 cache.
196 */ 212 */
197} 213}
198 214
215static void __init ti816x_check_features(void)
216{
217 omap3_features = OMAP3_HAS_NEON;
218}
219
199static void __init omap3_check_revision(void) 220static void __init omap3_check_revision(void)
200{ 221{
201 u32 cpuid, idcode; 222 u32 cpuid, idcode;
@@ -286,6 +307,20 @@ static void __init omap3_check_revision(void)
286 omap_chip.oc |= CHIP_IS_OMAP3630ES1_2; 307 omap_chip.oc |= CHIP_IS_OMAP3630ES1_2;
287 } 308 }
288 break; 309 break;
310 case 0xb81e:
311 omap_chip.oc = CHIP_IS_TI816X;
312
313 switch (rev) {
314 case 0:
315 omap_revision = TI8168_REV_ES1_0;
316 break;
317 case 1:
318 omap_revision = TI8168_REV_ES1_1;
319 break;
320 default:
321 omap_revision = TI8168_REV_ES1_1;
322 }
323 break;
289 default: 324 default:
290 /* Unknown default to latest silicon rev as default*/ 325 /* Unknown default to latest silicon rev as default*/
291 omap_revision = OMAP3630_REV_ES1_2; 326 omap_revision = OMAP3630_REV_ES1_2;
@@ -298,7 +333,6 @@ static void __init omap4_check_revision(void)
298 u32 idcode; 333 u32 idcode;
299 u16 hawkeye; 334 u16 hawkeye;
300 u8 rev; 335 u8 rev;
301 char *rev_name = "ES1.0";
302 336
303 /* 337 /*
304 * The IC rev detection is done with hawkeye and rev. 338 * The IC rev detection is done with hawkeye and rev.
@@ -307,16 +341,50 @@ static void __init omap4_check_revision(void)
307 */ 341 */
308 idcode = read_tap_reg(OMAP_TAP_IDCODE); 342 idcode = read_tap_reg(OMAP_TAP_IDCODE);
309 hawkeye = (idcode >> 12) & 0xffff; 343 hawkeye = (idcode >> 12) & 0xffff;
310 rev = (idcode >> 28) & 0xff; 344 rev = (idcode >> 28) & 0xf;
311 345
312 if ((hawkeye == 0xb852) && (rev == 0x0)) { 346 /*
313 omap_revision = OMAP4430_REV_ES1_0; 347 * Few initial ES2.0 samples IDCODE is same as ES1.0
314 omap_chip.oc |= CHIP_IS_OMAP4430ES1; 348 * Use ARM register to detect the correct ES version
315 pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name); 349 */
316 return; 350 if (!rev) {
351 idcode = read_cpuid(CPUID_ID);
352 rev = (idcode & 0xf) - 1;
353 }
354
355 switch (hawkeye) {
356 case 0xb852:
357 switch (rev) {
358 case 0:
359 omap_revision = OMAP4430_REV_ES1_0;
360 omap_chip.oc |= CHIP_IS_OMAP4430ES1;
361 break;
362 case 1:
363 default:
364 omap_revision = OMAP4430_REV_ES2_0;
365 omap_chip.oc |= CHIP_IS_OMAP4430ES2;
366 }
367 break;
368 case 0xb95c:
369 switch (rev) {
370 case 3:
371 omap_revision = OMAP4430_REV_ES2_1;
372 omap_chip.oc |= CHIP_IS_OMAP4430ES2_1;
373 break;
374 case 4:
375 default:
376 omap_revision = OMAP4430_REV_ES2_2;
377 omap_chip.oc |= CHIP_IS_OMAP4430ES2_2;
378 }
379 break;
380 default:
381 /* Unknown default to latest silicon rev as default */
382 omap_revision = OMAP4430_REV_ES2_2;
383 omap_chip.oc |= CHIP_IS_OMAP4430ES2_2;
317 } 384 }
318 385
319 pr_err("Unknown OMAP4 CPU id\n"); 386 pr_info("OMAP%04x ES%d.%d\n", omap_rev() >> 16,
387 ((omap_rev() >> 12) & 0xf), ((omap_rev() >> 8) & 0xf));
320} 388}
321 389
322#define OMAP3_SHOW_FEATURE(feat) \ 390#define OMAP3_SHOW_FEATURE(feat) \
@@ -347,6 +415,8 @@ static void __init omap3_cpuinfo(void)
347 /* Already set in omap3_check_revision() */ 415 /* Already set in omap3_check_revision() */
348 strcpy(cpu_name, "AM3505"); 416 strcpy(cpu_name, "AM3505");
349 } 417 }
418 } else if (cpu_is_ti816x()) {
419 strcpy(cpu_name, "TI816X");
350 } else if (omap3_has_iva() && omap3_has_sgx()) { 420 } else if (omap3_has_iva() && omap3_has_sgx()) {
351 /* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */ 421 /* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */
352 strcpy(cpu_name, "OMAP3430/3530"); 422 strcpy(cpu_name, "OMAP3430/3530");
@@ -361,30 +431,54 @@ static void __init omap3_cpuinfo(void)
361 strcpy(cpu_name, "OMAP3503"); 431 strcpy(cpu_name, "OMAP3503");
362 } 432 }
363 433
364 switch (rev) { 434 if (cpu_is_omap3630() || cpu_is_ti816x()) {
365 case OMAP_REVBITS_00: 435 switch (rev) {
366 strcpy(cpu_rev, "1.0"); 436 case OMAP_REVBITS_00:
367 break; 437 strcpy(cpu_rev, "1.0");
368 case OMAP_REVBITS_01: 438 break;
369 strcpy(cpu_rev, "1.1"); 439 case OMAP_REVBITS_01:
370 break; 440 strcpy(cpu_rev, "1.1");
371 case OMAP_REVBITS_02: 441 break;
372 strcpy(cpu_rev, "1.2"); 442 case OMAP_REVBITS_02:
373 break; 443 /* FALLTHROUGH */
374 case OMAP_REVBITS_10: 444 default:
375 strcpy(cpu_rev, "2.0"); 445 /* Use the latest known revision as default */
376 break; 446 strcpy(cpu_rev, "1.2");
377 case OMAP_REVBITS_20: 447 }
378 strcpy(cpu_rev, "2.1"); 448 } else if (cpu_is_omap3505() || cpu_is_omap3517()) {
379 break; 449 switch (rev) {
380 case OMAP_REVBITS_30: 450 case OMAP_REVBITS_00:
381 strcpy(cpu_rev, "3.0"); 451 strcpy(cpu_rev, "1.0");
382 break; 452 break;
383 case OMAP_REVBITS_40: 453 case OMAP_REVBITS_01:
384 /* FALLTHROUGH */ 454 /* FALLTHROUGH */
385 default: 455 default:
386 /* Use the latest known revision as default */ 456 /* Use the latest known revision as default */
387 strcpy(cpu_rev, "3.1"); 457 strcpy(cpu_rev, "1.1");
458 }
459 } else {
460 switch (rev) {
461 case OMAP_REVBITS_00:
462 strcpy(cpu_rev, "1.0");
463 break;
464 case OMAP_REVBITS_01:
465 strcpy(cpu_rev, "2.0");
466 break;
467 case OMAP_REVBITS_02:
468 strcpy(cpu_rev, "2.1");
469 break;
470 case OMAP_REVBITS_03:
471 strcpy(cpu_rev, "3.0");
472 break;
473 case OMAP_REVBITS_04:
474 strcpy(cpu_rev, "3.1");
475 break;
476 case OMAP_REVBITS_05:
477 /* FALLTHROUGH */
478 default:
479 /* Use the latest known revision as default */
480 strcpy(cpu_rev, "3.1.2");
481 }
388 } 482 }
389 483
390 /* Print verbose information */ 484 /* Print verbose information */
@@ -413,7 +507,13 @@ void __init omap2_check_revision(void)
413 omap24xx_check_revision(); 507 omap24xx_check_revision();
414 } else if (cpu_is_omap34xx()) { 508 } else if (cpu_is_omap34xx()) {
415 omap3_check_revision(); 509 omap3_check_revision();
416 omap3_check_features(); 510
511 /* TI816X doesn't have feature register */
512 if (!cpu_is_ti816x())
513 omap3_check_features();
514 else
515 ti816x_check_features();
516
417 omap3_cpuinfo(); 517 omap3_cpuinfo();
418 return; 518 return;
419 } else if (cpu_is_omap44xx()) { 519 } else if (cpu_is_omap44xx()) {