diff options
Diffstat (limited to 'arch/arm/mach-omap2/id.c')
-rw-r--r-- | arch/arm/mach-omap2/id.c | 172 |
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 | |||
30 | static struct omap_chip_id omap_chip; | 31 | static struct omap_chip_id omap_chip; |
31 | static unsigned int omap_revision; | 32 | static 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 | ||
88 | struct omap_id { | 94 | struct omap_id { |
@@ -106,6 +112,14 @@ static u16 tap_prod_id; | |||
106 | 112 | ||
107 | void omap_get_die_id(struct omap_die_id *odi) | 113 | void 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 | ||
215 | static void __init ti816x_check_features(void) | ||
216 | { | ||
217 | omap3_features = OMAP3_HAS_NEON; | ||
218 | } | ||
219 | |||
199 | static void __init omap3_check_revision(void) | 220 | static 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()) { |