Update copyrights
[linux-2.6.git] / arch / arm / mach-tegra / fuse.c
index dad92e4..21224c2 100644 (file)
@@ -2,6 +2,7 @@
  * arch/arm/mach-tegra/fuse.c
  *
  * Copyright (C) 2010 Google, Inc.
+ * Copyright (C) 2010-2011 NVIDIA, Corp.
  *
  * Author:
  *     Colin Cross <ccross@android.com>
 
 static const char *tegra_revision_name[TEGRA_REVISION_MAX] = {
        [TEGRA_REVISION_UNKNOWN] = "unknown",
+#if defined(CONFIG_ARCH_TEGRA_2x_SOC)
        [TEGRA_REVISION_A02] = "A02",
        [TEGRA_REVISION_A03] = "A03",
        [TEGRA_REVISION_A03p] = "A03 prime",
+#elif defined(CONFIG_ARCH_TEGRA_3x_SOC)
+       [TEGRA_REVISION_A01] = "A01",
+#endif
 };
 
 u32 tegra_fuse_readl(unsigned long offset)
@@ -91,7 +96,6 @@ unsigned long long tegra_chip_uid(void)
        return (hi << 32ull) | lo;
 #else
        u64 uid = 0ull;
-#if 0 // !!!FIXME!!! FOR SOME REASON THIS IS GENERATING BAD CODE .......................................
        u32 reg;
        u32 cid;
        u32 vendor;
@@ -130,7 +134,7 @@ unsigned long long tegra_chip_uid(void)
 
        /* Get the chip id and encode each chip variant as a unique value. */
        reg = readl(IO_TO_VIRT(TEGRA_APB_MISC_BASE + 0x804));
-       reg = (reg >> 8) && 0xFF;
+       reg = (reg & 0xFF00) >> 8;
 
        switch (reg) {
        case 0x30:
@@ -142,13 +146,13 @@ unsigned long long tegra_chip_uid(void)
                break;
        }
 
-       vendor = fuse_readl(FUSE_VENDOR_CODE) & FUSE_VENDOR_CODE_MASK;
-       fab = fuse_readl(FUSE_FAB_CODE) & FUSE_FAB_CODE_MASK;
+       vendor = tegra_fuse_readl(FUSE_VENDOR_CODE) & FUSE_VENDOR_CODE_MASK;
+       fab = tegra_fuse_readl(FUSE_FAB_CODE) & FUSE_FAB_CODE_MASK;
 
        /* Lot code must be re-encoded from a 5 digit base-36 'BCD' number
           to a binary number. */
        lot = 0;
-       reg = fuse_readl(FUSE_LOT_CODE_1) << 2;
+       reg = tegra_fuse_readl(FUSE_LOT_CODE_1) << 2;
 
        for (i = 0; i < 5; ++i) {
                u32 digit = (reg & 0xFC000000) >> 26;
@@ -158,9 +162,9 @@ unsigned long long tegra_chip_uid(void)
                reg <<= 6;
        }
 
-       wafer = fuse_readl(FUSE_WAFER_ID) & FUSE_WAFER_ID_MASK;
-       x = fuse_readl(FUSE_X_COORDINATE) & FUSE_X_COORDINATE_MASK;
-       y = fuse_readl(FUSE_Y_COORDINATE) & FUSE_Y_COORDINATE_MASK;
+       wafer = tegra_fuse_readl(FUSE_WAFER_ID) & FUSE_WAFER_ID_MASK;
+       x = tegra_fuse_readl(FUSE_X_COORDINATE) & FUSE_X_COORDINATE_MASK;
+       y = tegra_fuse_readl(FUSE_Y_COORDINATE) & FUSE_Y_COORDINATE_MASK;
 
        uid = ((unsigned long long)cid  << 60ull)
            | ((unsigned long long)vendor << 56ull)
@@ -169,7 +173,6 @@ unsigned long long tegra_chip_uid(void)
            | ((unsigned long long)wafer << 18ull)
            | ((unsigned long long)x << 9ull)
            | ((unsigned long long)y << 0ull);
-#endif
        return uid;
 #endif
 }
@@ -194,13 +197,19 @@ enum tegra_revision tegra_get_revision(void)
        u32 id = readl(chip_id);
 
        switch ((id >> 16) & 0xf) {
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+       case 1:
+               return TEGRA_REVISION_A01;
+#endif
        case 2:
                return TEGRA_REVISION_A02;
+#ifdef CONFIG_ARCH_TEGRA_2x_SOC
        case 3:
                if (get_spare_fuse(18) || get_spare_fuse(19))
                        return TEGRA_REVISION_A03p;
                else
                        return TEGRA_REVISION_A03;
+#endif
        default:
                return TEGRA_REVISION_UNKNOWN;
        }