linux/arch/arm/mach-omap2/id.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * linux/arch/arm/mach-omap2/id.c
   4 *
   5 * OMAP2 CPU identification code
   6 *
   7 * Copyright (C) 2005 Nokia Corporation
   8 * Written by Tony Lindgren <tony@atomide.com>
   9 *
  10 * Copyright (C) 2009-11 Texas Instruments
  11 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
  12 */
  13
  14#include <linux/module.h>
  15#include <linux/kernel.h>
  16#include <linux/init.h>
  17#include <linux/io.h>
  18#include <linux/random.h>
  19#include <linux/slab.h>
  20
  21#ifdef CONFIG_SOC_BUS
  22#include <linux/sys_soc.h>
  23#endif
  24
  25#include <asm/cputype.h>
  26
  27#include "common.h"
  28
  29#include "id.h"
  30
  31#include "soc.h"
  32#include "control.h"
  33
  34#define OMAP4_SILICON_TYPE_STANDARD             0x01
  35#define OMAP4_SILICON_TYPE_PERFORMANCE          0x02
  36
  37#define OMAP_SOC_MAX_NAME_LENGTH                16
  38
  39static unsigned int omap_revision;
  40static char soc_name[OMAP_SOC_MAX_NAME_LENGTH];
  41static char soc_rev[OMAP_SOC_MAX_NAME_LENGTH];
  42u32 omap_features;
  43
  44unsigned int omap_rev(void)
  45{
  46        return omap_revision;
  47}
  48EXPORT_SYMBOL(omap_rev);
  49
  50int omap_type(void)
  51{
  52        static u32 val = OMAP2_DEVICETYPE_MASK;
  53
  54        if (val < OMAP2_DEVICETYPE_MASK)
  55                return val;
  56
  57        if (soc_is_omap24xx()) {
  58                val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS);
  59        } else if (soc_is_ti81xx()) {
  60                val = omap_ctrl_readl(TI81XX_CONTROL_STATUS);
  61        } else if (soc_is_am33xx() || soc_is_am43xx()) {
  62                val = omap_ctrl_readl(AM33XX_CONTROL_STATUS);
  63        } else if (soc_is_omap34xx()) {
  64                val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
  65        } else if (soc_is_omap44xx()) {
  66                val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS);
  67        } else if (soc_is_omap54xx() || soc_is_dra7xx()) {
  68                val = omap_ctrl_readl(OMAP5XXX_CONTROL_STATUS);
  69                val &= OMAP5_DEVICETYPE_MASK;
  70                val >>= 6;
  71                goto out;
  72        } else {
  73                pr_err("Cannot detect omap type!\n");
  74                goto out;
  75        }
  76
  77        val &= OMAP2_DEVICETYPE_MASK;
  78        val >>= 8;
  79
  80out:
  81        return val;
  82}
  83EXPORT_SYMBOL(omap_type);
  84
  85
  86/*----------------------------------------------------------------------------*/
  87
  88#define OMAP_TAP_IDCODE         0x0204
  89#define OMAP_TAP_DIE_ID_0       0x0218
  90#define OMAP_TAP_DIE_ID_1       0x021C
  91#define OMAP_TAP_DIE_ID_2       0x0220
  92#define OMAP_TAP_DIE_ID_3       0x0224
  93
  94#define OMAP_TAP_DIE_ID_44XX_0  0x0200
  95#define OMAP_TAP_DIE_ID_44XX_1  0x0208
  96#define OMAP_TAP_DIE_ID_44XX_2  0x020c
  97#define OMAP_TAP_DIE_ID_44XX_3  0x0210
  98
  99#define read_tap_reg(reg)       readl_relaxed(tap_base  + (reg))
 100
 101struct omap_id {
 102        u16     hawkeye;        /* Silicon type (Hawkeye id) */
 103        u8      dev;            /* Device type from production_id reg */
 104        u32     type;           /* Combined type id copied to omap_revision */
 105};
 106
 107/* Register values to detect the OMAP version */
 108static struct omap_id omap_ids[] __initdata = {
 109        { .hawkeye = 0xb5d9, .dev = 0x0, .type = 0x24200024 },
 110        { .hawkeye = 0xb5d9, .dev = 0x1, .type = 0x24201024 },
 111        { .hawkeye = 0xb5d9, .dev = 0x2, .type = 0x24202024 },
 112        { .hawkeye = 0xb5d9, .dev = 0x4, .type = 0x24220024 },
 113        { .hawkeye = 0xb5d9, .dev = 0x8, .type = 0x24230024 },
 114        { .hawkeye = 0xb68a, .dev = 0x0, .type = 0x24300024 },
 115};
 116
 117static void __iomem *tap_base;
 118static u16 tap_prod_id;
 119
 120void omap_get_die_id(struct omap_die_id *odi)
 121{
 122        if (soc_is_omap44xx() || soc_is_omap54xx() || soc_is_dra7xx()) {
 123                odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_0);
 124                odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_1);
 125                odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_2);
 126                odi->id_3 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_3);
 127
 128                return;
 129        }
 130        odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_0);
 131        odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_1);
 132        odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_2);
 133        odi->id_3 = read_tap_reg(OMAP_TAP_DIE_ID_3);
 134}
 135
 136static int __init omap_feed_randpool(void)
 137{
 138        struct omap_die_id odi;
 139
 140        /* Throw the die ID into the entropy pool at boot */
 141        omap_get_die_id(&odi);
 142        add_device_randomness(&odi, sizeof(odi));
 143        return 0;
 144}
 145omap_device_initcall(omap_feed_randpool);
 146
 147void __init omap2xxx_check_revision(void)
 148{
 149        int i, j;
 150        u32 idcode, prod_id;
 151        u16 hawkeye;
 152        u8  dev_type, rev;
 153        struct omap_die_id odi;
 154
 155        idcode = read_tap_reg(OMAP_TAP_IDCODE);
 156        prod_id = read_tap_reg(tap_prod_id);
 157        hawkeye = (idcode >> 12) & 0xffff;
 158        rev = (idcode >> 28) & 0x0f;
 159        dev_type = (prod_id >> 16) & 0x0f;
 160        omap_get_die_id(&odi);
 161
 162        pr_debug("OMAP_TAP_IDCODE 0x%08x REV %i HAWKEYE 0x%04x MANF %03x\n",
 163                 idcode, rev, hawkeye, (idcode >> 1) & 0x7ff);
 164        pr_debug("OMAP_TAP_DIE_ID_0: 0x%08x\n", odi.id_0);
 165        pr_debug("OMAP_TAP_DIE_ID_1: 0x%08x DEV_REV: %i\n",
 166                 odi.id_1, (odi.id_1 >> 28) & 0xf);
 167        pr_debug("OMAP_TAP_DIE_ID_2: 0x%08x\n", odi.id_2);
 168        pr_debug("OMAP_TAP_DIE_ID_3: 0x%08x\n", odi.id_3);
 169        pr_debug("OMAP_TAP_PROD_ID_0: 0x%08x DEV_TYPE: %i\n",
 170                 prod_id, dev_type);
 171
 172        /* Check hawkeye ids */
 173        for (i = 0; i < ARRAY_SIZE(omap_ids); i++) {
 174                if (hawkeye == omap_ids[i].hawkeye)
 175                        break;
 176        }
 177
 178        if (i == ARRAY_SIZE(omap_ids)) {
 179                printk(KERN_ERR "Unknown OMAP CPU id\n");
 180                return;
 181        }
 182
 183        for (j = i; j < ARRAY_SIZE(omap_ids); j++) {
 184                if (dev_type == omap_ids[j].dev)
 185                        break;
 186        }
 187
 188        if (j == ARRAY_SIZE(omap_ids)) {
 189                pr_err("Unknown OMAP device type. Handling it as OMAP%04x\n",
 190                       omap_ids[i].type >> 16);
 191                j = i;
 192        }
 193
 194        sprintf(soc_name, "OMAP%04x", omap_rev() >> 16);
 195        sprintf(soc_rev, "ES%x", (omap_rev() >> 12) & 0xf);
 196
 197        pr_info("%s", soc_name);
 198        if ((omap_rev() >> 8) & 0x0f)
 199                pr_cont("%s", soc_rev);
 200        pr_cont("\n");
 201}
 202
 203#define OMAP3_SHOW_FEATURE(feat)                \
 204        if (omap3_has_ ##feat())                \
 205                n += scnprintf(buf + n, sizeof(buf) - n, #feat " ");
 206
 207static void __init omap3_cpuinfo(void)
 208{
 209        const char *cpu_name;
 210        char buf[64];
 211        int n = 0;
 212
 213        memset(buf, 0, sizeof(buf));
 214
 215        /*
 216         * OMAP3430 and OMAP3530 are assumed to be same.
 217         *
 218         * OMAP3525, OMAP3515 and OMAP3503 can be detected only based
 219         * on available features. Upon detection, update the CPU id
 220         * and CPU class bits.
 221         */
 222        if (soc_is_omap3630()) {
 223                if (omap3_has_iva() && omap3_has_sgx()) {
 224                        cpu_name = (omap3_has_isp()) ? "OMAP3630/DM3730" : "OMAP3621";
 225                } else if (omap3_has_iva()) {
 226                        cpu_name = "DM3725";
 227                } else if (omap3_has_sgx()) {
 228                        cpu_name = "OMAP3615/AM3715";
 229                } else {
 230                        cpu_name = (omap3_has_isp()) ? "AM3703" : "OMAP3611";
 231                }
 232        } else if (soc_is_am35xx()) {
 233                cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505";
 234        } else if (soc_is_ti816x()) {
 235                cpu_name = "TI816X";
 236        } else if (soc_is_am335x()) {
 237                cpu_name =  "AM335X";
 238        } else if (soc_is_am437x()) {
 239                cpu_name =  "AM437x";
 240        } else if (soc_is_ti814x()) {
 241                cpu_name = "TI814X";
 242        } else if (omap3_has_iva() && omap3_has_sgx()) {
 243                /* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */
 244                cpu_name = "OMAP3430/3530";
 245        } else if (omap3_has_iva()) {
 246                cpu_name = "OMAP3525";
 247        } else if (omap3_has_sgx()) {
 248                cpu_name = "OMAP3515";
 249        } else {
 250                cpu_name = "OMAP3503";
 251        }
 252
 253        scnprintf(soc_name, sizeof(soc_name), "%s", cpu_name);
 254
 255        /* Print verbose information */
 256        n += scnprintf(buf, sizeof(buf) - n, "%s %s (", soc_name, soc_rev);
 257
 258        OMAP3_SHOW_FEATURE(l2cache);
 259        OMAP3_SHOW_FEATURE(iva);
 260        OMAP3_SHOW_FEATURE(sgx);
 261        OMAP3_SHOW_FEATURE(neon);
 262        OMAP3_SHOW_FEATURE(isp);
 263        OMAP3_SHOW_FEATURE(192mhz_clk);
 264        if (*(buf + n - 1) == ' ')
 265                n--;
 266        n += scnprintf(buf + n, sizeof(buf) - n, ")\n");
 267        pr_info("%s", buf);
 268}
 269
 270#define OMAP3_CHECK_FEATURE(status,feat)                                \
 271        if (((status & OMAP3_ ##feat## _MASK)                           \
 272                >> OMAP3_ ##feat## _SHIFT) != FEAT_ ##feat## _NONE) {   \
 273                omap_features |= OMAP3_HAS_ ##feat;                     \
 274        }
 275
 276void __init omap3xxx_check_features(void)
 277{
 278        u32 status;
 279
 280        omap_features = 0;
 281
 282        status = omap_ctrl_readl(OMAP3_CONTROL_OMAP_STATUS);
 283
 284        OMAP3_CHECK_FEATURE(status, L2CACHE);
 285        OMAP3_CHECK_FEATURE(status, IVA);
 286        OMAP3_CHECK_FEATURE(status, SGX);
 287        OMAP3_CHECK_FEATURE(status, NEON);
 288        OMAP3_CHECK_FEATURE(status, ISP);
 289        if (soc_is_omap3630())
 290                omap_features |= OMAP3_HAS_192MHZ_CLK;
 291        if (soc_is_omap3430() || soc_is_omap3630())
 292                omap_features |= OMAP3_HAS_IO_WAKEUP;
 293        if (soc_is_omap3630() || omap_rev() == OMAP3430_REV_ES3_1 ||
 294            omap_rev() == OMAP3430_REV_ES3_1_2)
 295                omap_features |= OMAP3_HAS_IO_CHAIN_CTRL;
 296
 297        omap_features |= OMAP3_HAS_SDRC;
 298
 299        /*
 300         * am35x fixups:
 301         * - The am35x Chip ID register has bits 12, 7:5, and 3:2 marked as
 302         *   reserved and therefore return 0 when read.  Unfortunately,
 303         *   OMAP3_CHECK_FEATURE() will interpret some of those zeroes to
 304         *   mean that a feature is present even though it isn't so clear
 305         *   the incorrectly set feature bits.
 306         */
 307        if (soc_is_am35xx())
 308                omap_features &= ~(OMAP3_HAS_IVA | OMAP3_HAS_ISP);
 309
 310        /*
 311         * TODO: Get additional info (where applicable)
 312         *       e.g. Size of L2 cache.
 313         */
 314
 315        omap3_cpuinfo();
 316}
 317
 318void __init omap4xxx_check_features(void)
 319{
 320        u32 si_type;
 321
 322        si_type =
 323        (read_tap_reg(OMAP4_CTRL_MODULE_CORE_STD_FUSE_PROD_ID_1) >> 16) & 0x03;
 324
 325        if (si_type == OMAP4_SILICON_TYPE_PERFORMANCE)
 326                omap_features = OMAP4_HAS_PERF_SILICON;
 327}
 328
 329void __init ti81xx_check_features(void)
 330{
 331        omap_features = OMAP3_HAS_NEON;
 332        omap3_cpuinfo();
 333}
 334
 335void __init am33xx_check_features(void)
 336{
 337        u32 status;
 338
 339        omap_features = OMAP3_HAS_NEON;
 340
 341        status = omap_ctrl_readl(AM33XX_DEV_FEATURE);
 342        if (status & AM33XX_SGX_MASK)
 343                omap_features |= OMAP3_HAS_SGX;
 344
 345        omap3_cpuinfo();
 346}
 347
 348void __init omap3xxx_check_revision(void)
 349{
 350        const char *cpu_rev;
 351        u32 cpuid, idcode;
 352        u16 hawkeye;
 353        u8 rev;
 354
 355        /*
 356         * We cannot access revision registers on ES1.0.
 357         * If the processor type is Cortex-A8 and the revision is 0x0
 358         * it means its Cortex r0p0 which is 3430 ES1.0.
 359         */
 360        cpuid = read_cpuid_id();
 361        if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) {
 362                omap_revision = OMAP3430_REV_ES1_0;
 363                cpu_rev = "1.0";
 364                return;
 365        }
 366
 367        /*
 368         * Detection for 34xx ES2.0 and above can be done with just
 369         * hawkeye and rev. See TRM 1.5.2 Device Identification.
 370         * Note that rev does not map directly to our defined processor
 371         * revision numbers as ES1.0 uses value 0.
 372         */
 373        idcode = read_tap_reg(OMAP_TAP_IDCODE);
 374        hawkeye = (idcode >> 12) & 0xffff;
 375        rev = (idcode >> 28) & 0xff;
 376
 377        switch (hawkeye) {
 378        case 0xb7ae:
 379                /* Handle 34xx/35xx devices */
 380                switch (rev) {
 381                case 0: /* Take care of early samples */
 382                case 1:
 383                        omap_revision = OMAP3430_REV_ES2_0;
 384                        cpu_rev = "2.0";
 385                        break;
 386                case 2:
 387                        omap_revision = OMAP3430_REV_ES2_1;
 388                        cpu_rev = "2.1";
 389                        break;
 390                case 3:
 391                        omap_revision = OMAP3430_REV_ES3_0;
 392                        cpu_rev = "3.0";
 393                        break;
 394                case 4:
 395                        omap_revision = OMAP3430_REV_ES3_1;
 396                        cpu_rev = "3.1";
 397                        break;
 398                case 7:
 399                default:
 400                        /* Use the latest known revision as default */
 401                        omap_revision = OMAP3430_REV_ES3_1_2;
 402                        cpu_rev = "3.1.2";
 403                }
 404                break;
 405        case 0xb868:
 406                /*
 407                 * Handle OMAP/AM 3505/3517 devices
 408                 *
 409                 * Set the device to be OMAP3517 here. Actual device
 410                 * is identified later based on the features.
 411                 */
 412                switch (rev) {
 413                case 0:
 414                        omap_revision = AM35XX_REV_ES1_0;
 415                        cpu_rev = "1.0";
 416                        break;
 417                case 1:
 418                default:
 419                        omap_revision = AM35XX_REV_ES1_1;
 420                        cpu_rev = "1.1";
 421                }
 422                break;
 423        case 0xb891:
 424                /* Handle 36xx devices */
 425
 426                switch(rev) {
 427                case 0: /* Take care of early samples */
 428                        omap_revision = OMAP3630_REV_ES1_0;
 429                        cpu_rev = "1.0";
 430                        break;
 431                case 1:
 432                        omap_revision = OMAP3630_REV_ES1_1;
 433                        cpu_rev = "1.1";
 434                        break;
 435                case 2:
 436                default:
 437                        omap_revision = OMAP3630_REV_ES1_2;
 438                        cpu_rev = "1.2";
 439                }
 440                break;
 441        case 0xb81e:
 442                switch (rev) {
 443                case 0:
 444                        omap_revision = TI8168_REV_ES1_0;
 445                        cpu_rev = "1.0";
 446                        break;
 447                case 1:
 448                        omap_revision = TI8168_REV_ES1_1;
 449                        cpu_rev = "1.1";
 450                        break;
 451                case 2:
 452                        omap_revision = TI8168_REV_ES2_0;
 453                        cpu_rev = "2.0";
 454                        break;
 455                case 3:
 456                default:
 457                        omap_revision = TI8168_REV_ES2_1;
 458                        cpu_rev = "2.1";
 459                }
 460                break;
 461        case 0xb944:
 462                switch (rev) {
 463                case 0:
 464                        omap_revision = AM335X_REV_ES1_0;
 465                        cpu_rev = "1.0";
 466                        break;
 467                case 1:
 468                        omap_revision = AM335X_REV_ES2_0;
 469                        cpu_rev = "2.0";
 470                        break;
 471                case 2:
 472                default:
 473                        omap_revision = AM335X_REV_ES2_1;
 474                        cpu_rev = "2.1";
 475                        break;
 476                }
 477                break;
 478        case 0xb98c:
 479                switch (rev) {
 480                case 0:
 481                        omap_revision = AM437X_REV_ES1_0;
 482                        cpu_rev = "1.0";
 483                        break;
 484                case 1:
 485                        omap_revision = AM437X_REV_ES1_1;
 486                        cpu_rev = "1.1";
 487                        break;
 488                case 2:
 489                default:
 490                        omap_revision = AM437X_REV_ES1_2;
 491                        cpu_rev = "1.2";
 492                        break;
 493                }
 494                break;
 495        case 0xb8f2:
 496        case 0xb968:
 497                switch (rev) {
 498                case 0:
 499                case 1:
 500                        omap_revision = TI8148_REV_ES1_0;
 501                        cpu_rev = "1.0";
 502                        break;
 503                case 2:
 504                        omap_revision = TI8148_REV_ES2_0;
 505                        cpu_rev = "2.0";
 506                        break;
 507                case 3:
 508                default:
 509                        omap_revision = TI8148_REV_ES2_1;
 510                        cpu_rev = "2.1";
 511                        break;
 512                }
 513                break;
 514        default:
 515                /* Unknown default to latest silicon rev as default */
 516                omap_revision = OMAP3630_REV_ES1_2;
 517                cpu_rev = "1.2";
 518                pr_warn("Warning: unknown chip type: hawkeye %04x, assuming OMAP3630ES1.2\n",
 519                        hawkeye);
 520        }
 521        sprintf(soc_rev, "ES%s", cpu_rev);
 522}
 523
 524void __init omap4xxx_check_revision(void)
 525{
 526        u32 idcode;
 527        u16 hawkeye;
 528        u8 rev;
 529
 530        /*
 531         * The IC rev detection is done with hawkeye and rev.
 532         * Note that rev does not map directly to defined processor
 533         * revision numbers as ES1.0 uses value 0.
 534         */
 535        idcode = read_tap_reg(OMAP_TAP_IDCODE);
 536        hawkeye = (idcode >> 12) & 0xffff;
 537        rev = (idcode >> 28) & 0xf;
 538
 539        /*
 540         * Few initial 4430 ES2.0 samples IDCODE is same as ES1.0
 541         * Use ARM register to detect the correct ES version
 542         */
 543        if (!rev && (hawkeye != 0xb94e) && (hawkeye != 0xb975)) {
 544                idcode = read_cpuid_id();
 545                rev = (idcode & 0xf) - 1;
 546        }
 547
 548        switch (hawkeye) {
 549        case 0xb852:
 550                switch (rev) {
 551                case 0:
 552                        omap_revision = OMAP4430_REV_ES1_0;
 553                        break;
 554                case 1:
 555                default:
 556                        omap_revision = OMAP4430_REV_ES2_0;
 557                }
 558                break;
 559        case 0xb95c:
 560                switch (rev) {
 561                case 3:
 562                        omap_revision = OMAP4430_REV_ES2_1;
 563                        break;
 564                case 4:
 565                        omap_revision = OMAP4430_REV_ES2_2;
 566                        break;
 567                case 6:
 568                default:
 569                        omap_revision = OMAP4430_REV_ES2_3;
 570                }
 571                break;
 572        case 0xb94e:
 573                switch (rev) {
 574                case 0:
 575                        omap_revision = OMAP4460_REV_ES1_0;
 576                        break;
 577                case 2:
 578                default:
 579                        omap_revision = OMAP4460_REV_ES1_1;
 580                        break;
 581                }
 582                break;
 583        case 0xb975:
 584                switch (rev) {
 585                case 0:
 586                default:
 587                        omap_revision = OMAP4470_REV_ES1_0;
 588                        break;
 589                }
 590                break;
 591        default:
 592                /* Unknown default to latest silicon rev as default */
 593                omap_revision = OMAP4430_REV_ES2_3;
 594        }
 595
 596        sprintf(soc_name, "OMAP%04x", omap_rev() >> 16);
 597        sprintf(soc_rev, "ES%d.%d", (omap_rev() >> 12) & 0xf,
 598                                                (omap_rev() >> 8) & 0xf);
 599        pr_info("%s %s\n", soc_name, soc_rev);
 600}
 601
 602void __init omap5xxx_check_revision(void)
 603{
 604        u32 idcode;
 605        u16 hawkeye;
 606        u8 rev;
 607
 608        idcode = read_tap_reg(OMAP_TAP_IDCODE);
 609        hawkeye = (idcode >> 12) & 0xffff;
 610        rev = (idcode >> 28) & 0xff;
 611        switch (hawkeye) {
 612        case 0xb942:
 613                switch (rev) {
 614                case 0:
 615                        /* No support for ES1.0 Test chip */
 616                        BUG();
 617                case 1:
 618                default:
 619                        omap_revision = OMAP5430_REV_ES2_0;
 620                }
 621                break;
 622
 623        case 0xb998:
 624                switch (rev) {
 625                case 0:
 626                        /* No support for ES1.0 Test chip */
 627                        BUG();
 628                case 1:
 629                default:
 630                        omap_revision = OMAP5432_REV_ES2_0;
 631                }
 632                break;
 633
 634        default:
 635                /* Unknown default to latest silicon rev as default*/
 636                omap_revision = OMAP5430_REV_ES2_0;
 637        }
 638
 639        sprintf(soc_name, "OMAP%04x", omap_rev() >> 16);
 640        sprintf(soc_rev, "ES%d.0", (omap_rev() >> 12) & 0xf);
 641
 642        pr_info("%s %s\n", soc_name, soc_rev);
 643}
 644
 645void __init dra7xxx_check_revision(void)
 646{
 647        u32 idcode;
 648        u16 hawkeye;
 649        u8 rev, package;
 650        struct omap_die_id odi;
 651
 652        omap_get_die_id(&odi);
 653        package = (odi.id_2 >> 16) & 0x3;
 654        idcode = read_tap_reg(OMAP_TAP_IDCODE);
 655        hawkeye = (idcode >> 12) & 0xffff;
 656        rev = (idcode >> 28) & 0xff;
 657        switch (hawkeye) {
 658        case 0xbb50:
 659                switch (rev) {
 660                case 0:
 661                default:
 662                        switch (package) {
 663                        case 0x2:
 664                                omap_revision = DRA762_ABZ_REV_ES1_0;
 665                                break;
 666                        case 0x3:
 667                                omap_revision = DRA762_ACD_REV_ES1_0;
 668                                break;
 669                        default:
 670                                omap_revision = DRA762_REV_ES1_0;
 671                                break;
 672                        }
 673                        break;
 674                }
 675                break;
 676
 677        case 0xb990:
 678                switch (rev) {
 679                case 0:
 680                        omap_revision = DRA752_REV_ES1_0;
 681                        break;
 682                case 1:
 683                        omap_revision = DRA752_REV_ES1_1;
 684                        break;
 685                case 2:
 686                default:
 687                        omap_revision = DRA752_REV_ES2_0;
 688                        break;
 689                }
 690                break;
 691
 692        case 0xb9bc:
 693                switch (rev) {
 694                case 0:
 695                        omap_revision = DRA722_REV_ES1_0;
 696                        break;
 697                case 1:
 698                        omap_revision = DRA722_REV_ES2_0;
 699                        break;
 700                case 2:
 701                default:
 702                        omap_revision = DRA722_REV_ES2_1;
 703                        break;
 704                }
 705                break;
 706
 707        default:
 708                /* Unknown default to latest silicon rev as default*/
 709                pr_warn("%s: unknown idcode=0x%08x (hawkeye=0x%08x,rev=0x%x)\n",
 710                        __func__, idcode, hawkeye, rev);
 711                omap_revision = DRA752_REV_ES2_0;
 712        }
 713
 714        sprintf(soc_name, "DRA%03x", omap_rev() >> 16);
 715        sprintf(soc_rev, "ES%d.%d", (omap_rev() >> 12) & 0xf,
 716                (omap_rev() >> 8) & 0xf);
 717
 718        pr_info("%s %s\n", soc_name, soc_rev);
 719}
 720
 721/*
 722 * Set up things for map_io and processor detection later on. Gets called
 723 * pretty much first thing from board init. For multi-omap, this gets
 724 * cpu_is_omapxxxx() working accurately enough for map_io. Then we'll try to
 725 * detect the exact revision later on in omap2_detect_revision() once map_io
 726 * is done.
 727 */
 728void __init omap2_set_globals_tap(u32 class, void __iomem *tap)
 729{
 730        omap_revision = class;
 731        tap_base = tap;
 732
 733        /* XXX What is this intended to do? */
 734        if (soc_is_omap34xx())
 735                tap_prod_id = 0x0210;
 736        else
 737                tap_prod_id = 0x0208;
 738}
 739
 740#ifdef CONFIG_SOC_BUS
 741
 742static const char * const omap_types[] = {
 743        [OMAP2_DEVICE_TYPE_TEST]        = "TST",
 744        [OMAP2_DEVICE_TYPE_EMU]         = "EMU",
 745        [OMAP2_DEVICE_TYPE_SEC]         = "HS",
 746        [OMAP2_DEVICE_TYPE_GP]          = "GP",
 747        [OMAP2_DEVICE_TYPE_BAD]         = "BAD",
 748};
 749
 750static const char * __init omap_get_family(void)
 751{
 752        if (soc_is_omap24xx())
 753                return kasprintf(GFP_KERNEL, "OMAP2");
 754        else if (soc_is_omap34xx())
 755                return kasprintf(GFP_KERNEL, "OMAP3");
 756        else if (soc_is_omap44xx())
 757                return kasprintf(GFP_KERNEL, "OMAP4");
 758        else if (soc_is_omap54xx())
 759                return kasprintf(GFP_KERNEL, "OMAP5");
 760        else if (soc_is_am33xx() || soc_is_am335x())
 761                return kasprintf(GFP_KERNEL, "AM33xx");
 762        else if (soc_is_am43xx())
 763                return kasprintf(GFP_KERNEL, "AM43xx");
 764        else if (soc_is_dra7xx())
 765                return kasprintf(GFP_KERNEL, "DRA7");
 766        else
 767                return kasprintf(GFP_KERNEL, "Unknown");
 768}
 769
 770static ssize_t
 771type_show(struct device *dev, struct device_attribute *attr, char *buf)
 772{
 773        return sprintf(buf, "%s\n", omap_types[omap_type()]);
 774}
 775
 776static DEVICE_ATTR_RO(type);
 777
 778static struct attribute *omap_soc_attrs[] = {
 779        &dev_attr_type.attr,
 780        NULL
 781};
 782
 783ATTRIBUTE_GROUPS(omap_soc);
 784
 785void __init omap_soc_device_init(void)
 786{
 787        struct soc_device *soc_dev;
 788        struct soc_device_attribute *soc_dev_attr;
 789
 790        soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
 791        if (!soc_dev_attr)
 792                return;
 793
 794        soc_dev_attr->machine  = soc_name;
 795        soc_dev_attr->family   = omap_get_family();
 796        soc_dev_attr->revision = soc_rev;
 797        soc_dev_attr->custom_attr_group = omap_soc_groups[0];
 798
 799        soc_dev = soc_device_register(soc_dev_attr);
 800        if (IS_ERR(soc_dev)) {
 801                kfree(soc_dev_attr);
 802                return;
 803        }
 804}
 805#endif /* CONFIG_SOC_BUS */
 806