arm: tegra: fuse: add function to get chipid
Luke Huang [Fri, 20 May 2011 21:20:42 +0000 (14:20 -0700)]
1. Add the function to return chipid.
2. Remove the if-def for A01 for tegra2 and add kernel panic if tegra2-A01 is
detected.
3. Clean up errors/warnings reported by checkpatch.pl.

Original-Change-Id: I0aa4ed2c4fd77e8e5ae83feceee94372b1506446
Reviewed-on: http://git-master/r/32450
Reviewed-by: Chih-Lung Huang <lhuang@nvidia.com>
Tested-by: Chih-Lung Huang <lhuang@nvidia.com>
Reviewed-by: Scott Williams <scwilliams@nvidia.com>
Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com>

Rebase-Id: R7e4adad9e8127d725ebae51bc308ace382bebc3e

arch/arm/mach-tegra/fuse.c
arch/arm/mach-tegra/fuse.h

index 5b2499a..8005066 100644 (file)
 #define FUSE_SPARE_BIT         0x244
 #endif
 
+struct tegra_id {
+       enum tegra_revision chipid;
+       unsigned int major, minor, netlist, patch;
+       enum tegra_revision revision;
+       char *priv;
+};
+
+static struct tegra_id tegra_id;
+
 static const char *tegra_revision_name[TEGRA_REVISION_MAX] = {
        [TEGRA_REVISION_UNKNOWN] = "unknown",
-#if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
        [TEGRA_REVISION_A01] = "A01",
-#endif
        [TEGRA_REVISION_A02] = "A02",
 #if defined(CONFIG_ARCH_TEGRA_2x_SOC)
        [TEGRA_REVISION_A03] = "A03",
@@ -123,7 +130,7 @@ unsigned long long tegra_chip_uid(void)
           various fields is <fieldname:size_in_bits> with the UID composed
           thusly:
 
-            <CID:4><VENDOR:4><FAB:6><LOT:26><WAFER:6><X:9><Y:9>
+          <CID:4><VENDOR:4><FAB:6><LOT:26><WAFER:6><X:9><Y:9>
 
           Where:
 
@@ -133,7 +140,7 @@ unsigned long long tegra_chip_uid(void)
                VENDOR     4     56     Vendor code
                FAB        6     50     FAB code
                LOT       26     24     Lot code (5-digit base-36-coded-decimal,
-                                           re-encoded to 26 bits binary)
+                                       re-encoded to 26 bits binary)
                WAFER      6     18     Wafer id
                X          9      9     Wafer X-coordinate
                Y          9      0     Wafer Y-coordinate
@@ -146,7 +153,7 @@ unsigned long long tegra_chip_uid(void)
        reg = (reg & 0xFF00) >> 8;
 
        switch (reg) {
-       case 0x30:
+       case TEGRA_CHIPID_TEGRA3:
                cid = 0;
                break;
 
@@ -200,16 +207,14 @@ int tegra_sku_id(void)
        return sku_id;
 }
 
-struct tegra_id tegra_id;
-
 static enum tegra_revision tegra_decode_revision(const struct tegra_id *id)
 {
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
-       if ((id->chipid & 0xf0) != 0x20)
+       if ((id->chipid & 0xf0) != TEGRA_CHIPID_TEGRA2)
                return TEGRA_REVISION_UNKNOWN;
 #endif
 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
-       if ((id->chipid & 0xf0) != 0x30)
+       if ((id->chipid & 0xf0) != TEGRA_CHIPID_TEGRA3)
                return TEGRA_REVISION_UNKNOWN;
 
        switch (id->major) {
@@ -232,10 +237,9 @@ static enum tegra_revision tegra_decode_revision(const struct tegra_id *id)
 #endif
 
        switch (id->minor) {
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
        case 1:
+               BUG_ON((id->chipid & 0xf0) == TEGRA_CHIPID_TEGRA2);
                return TEGRA_REVISION_A01;
-#endif
        case 2:
                return TEGRA_REVISION_A02;
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
@@ -248,42 +252,59 @@ static enum tegra_revision tegra_decode_revision(const struct tegra_id *id)
        }
 }
 
-static enum tegra_revision tegra_set_revision(u32 chipid,
+static void tegra_set_tegraid(u32 chipid,
                                        u32 major, u32 minor,
                                        u32 nlist, u32 patch, const char *priv)
 {
-       tegra_id.chipid  = chipid;
+       tegra_id.chipid  = (enum tegra_chipid) chipid;
        tegra_id.major   = major;
        tegra_id.minor   = minor;
        tegra_id.netlist = nlist;
        tegra_id.patch   = patch;
        tegra_id.priv    = (char *)priv;
        tegra_id.revision = tegra_decode_revision(&tegra_id);
-       return tegra_id.revision;
 }
 
-enum tegra_revision tegra_get_revision(void)
+static void tegra_get_tegraid_from_hw()
 {
-       if (tegra_id.chipid)
-               return tegra_id.revision;
-       else {/* Boot loader did not pass a valid chip ID */
-               void __iomem *chip_id = IO_ADDRESS(TEGRA_APB_MISC_BASE) + 0x804;
-               void __iomem *netlist = IO_ADDRESS(TEGRA_APB_MISC_BASE) + 0x860;
-               u32 cid = readl(chip_id);
-               u32 nlist = readl(netlist);
-               char *priv = NULL;
+       void __iomem *chip_id = IO_ADDRESS(TEGRA_APB_MISC_BASE) + 0x804;
+       void __iomem *netlist = IO_ADDRESS(TEGRA_APB_MISC_BASE) + 0x860;
+       u32 cid = readl(chip_id);
+       u32 nlist = readl(netlist);
+       char *priv = NULL;
 
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
-               if (get_spare_fuse(18) || get_spare_fuse(19))
-                       priv = "p";
+       if (get_spare_fuse(18) || get_spare_fuse(19))
+               priv = "p";
 #endif
-               return tegra_set_revision((cid >> 8) & 0xff,
-                                       (cid >> 4) & 0xf,
-                                       (cid >> 16) & 0xf,
-                                       (nlist >> 0) & 0xffff,
-                                       (nlist >> 16) & 0xffff,
-                                       priv);
+       tegra_set_tegraid((cid >> 8) & 0xff,
+                         (cid >> 4) & 0xf,
+                         (cid >> 16) & 0xf,
+                         (nlist >> 0) & 0xffff,
+                         (nlist >> 16) & 0xffff,
+                         priv);
+}
+
+enum tegra_chipid tegra_get_chipid(void)
+{
+       if (tegra_id.chipid == TEGRA_CHIPID_UNKNOWN) {
+               /* Boot loader did not pass a valid chip ID.
+                * Get it from hardware */
+               tegra_get_tegraid_from_hw();
+       }
+
+       return tegra_id.chipid;
+}
+
+enum tegra_revision tegra_get_revision(void)
+{
+       if (tegra_id.chipid == TEGRA_CHIPID_UNKNOWN) {
+               /* Boot loader did not pass a valid chip ID.
+                * Get it from hardware */
+               tegra_get_tegraid_from_hw();
        }
+
+       return tegra_id.revision;
 }
 
 static char chippriv[16]; /* Permanent buffer for private string */
@@ -307,7 +328,7 @@ static int __init tegra_bootloader_tegraid(char *str)
        while (i < ARRAY_SIZE(id))
                id[i++] = 0;
 
-       (void)tegra_set_revision(id[0], id[1], id[2], id[3], id[4], priv);
+       tegra_set_tegraid(id[0], id[1], id[2], id[3], id[4], priv);
        return 0;
 }
 
index 80c6082..ee383f6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * arch/arm/mach-tegra/fuse.c
+ * arch/arm/mach-tegra/fuse.h
  *
  * Copyright (C) 2010 Google, Inc.
  * Copyright (C) 2010-2011 NVIDIA Corp.
  *
  */
 
+enum tegra_chipid {
+       TEGRA_CHIPID_UNKNOWN = 0,
+       TEGRA_CHIPID_TEGRA2 = 0x20,
+       TEGRA_CHIPID_TEGRA3 = 0x30,
+};
+
 enum tegra_revision {
        TEGRA_REVISION_UNKNOWN = 0,
-#if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
        TEGRA_REVISION_A01,
-#endif
        TEGRA_REVISION_A02,
 #if defined(CONFIG_ARCH_TEGRA_2x_SOC)
        TEGRA_REVISION_A03,
@@ -31,15 +35,7 @@ enum tegra_revision {
        TEGRA_REVISION_MAX,
 };
 
-struct tegra_id {
-       unsigned int chipid, major, minor, netlist, patch;
-       enum tegra_revision revision;
-       char *priv;
-};
-
-#define INVALID_PROCESS_ID     99 // don't expect to have 100 process id's
-
-extern struct tegra_id tegra_id;
+#define INVALID_PROCESS_ID     99 /* don't expect to have 100 process id's */
 
 unsigned long long tegra_chip_uid(void);
 unsigned int tegra_spare_fuse(int bit);
@@ -47,6 +43,7 @@ int tegra_sku_id(void);
 void tegra_init_fuse(void);
 u32 tegra_fuse_readl(unsigned long offset);
 void tegra_fuse_writel(u32 value, unsigned long offset);
+enum tegra_chipid tegra_get_chipid(void);
 enum tegra_revision tegra_get_revision(void);
 const char *tegra_get_revision_name(void);
 
@@ -57,11 +54,11 @@ int tegra_core_process_id(void);
 int tegra_soc_speedo_id(void);
 void tegra_init_speedo_data(void);
 
-#else // CONFIG_TEGRA_FPGA_PLATFORM
+#else /* CONFIG_TEGRA_FPGA_PLATFORM */
 
 static inline int tegra_cpu_process_id(void) { return 0; }
 static inline int tegra_core_process_id(void) { return 0; }
 static inline int tegra_soc_speedo_id(void) { return 0; }
 static inline void tegra_init_speedo_data(void) { }
 
-#endif// CONFIG_TEGRA_FPGA_PLATFORM
+#endif /* CONFIG_TEGRA_FPGA_PLATFORM */