ARM: tegra: loki: fix build error due to warning
[linux-3.10.git] / arch / arm / mach-tegra / tegra12x_fuse_offsets.h
index 112367a..e76d992 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, nvidia corporation.
+ * Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
  *
  * this program is free software; you can redistribute it and/or modify
  * it under the terms of the gnu general public license as published by
  * 51 franklin street, fifth floor, boston, ma  02110-1301, usa.
  */
 
+#include <linux/tegra-soc.h>
+
 #include <mach/tegra_fuse.h>
-#include <mach/hardware.h>
 
 #include "apbio.h"
 #include "fuse.h"
 #include "iomap.h"
 
-#ifndef __TEGRA11x_FUSE_OFFSETS_H
-#define __TEGRA11x_FUSE_OFFSETS_H
+#ifndef __TEGRA12x_FUSE_OFFSETS_H
+#define __TEGRA12x_FUSE_OFFSETS_H
 
 /* private_key4 */
-#define DEVKEY_START_OFFSET            0x2C
-#define DEVKEY_START_BIT               7
+#define DEVKEY_START_OFFSET            0x2A
+#define DEVKEY_START_BIT               12
 
 /* arm_debug_dis */
 #define JTAG_START_OFFSET              0x0
 
 /* security_mode */
 #define ODM_PROD_START_OFFSET          0x0
-#define ODM_PROD_START_BIT             7
+#define ODM_PROD_START_BIT             11
 
 /* boot_device_info */
-#define SB_DEVCFG_START_OFFSET         0x2E
-#define SB_DEVCFG_START_BIT            7
+#define SB_DEVCFG_START_OFFSET         0x2C
+#define SB_DEVCFG_START_BIT            12
 
 /* reserved_sw[2:0] */
-#define SB_DEVSEL_START_OFFSET         0x2E
-#define SB_DEVSEL_START_BIT            23
+#define SB_DEVSEL_START_OFFSET         0x2C
+#define SB_DEVSEL_START_BIT            28
 
 /* private_key0 -> private_key3 (SBK) */
-#define SBK_START_OFFSET               0x24
-#define SBK_START_BIT                  7
+#define SBK_START_OFFSET               0x22
+#define SBK_START_BIT                  12
 
 /* reserved_sw[7:4] */
 #define SW_RESERVED_START_OFFSET       0x2E
-#define SW_RESERVED_START_BIT          27
+#define SW_RESERVED_START_BIT          0
 
 /* reserved_sw[3] */
-#define IGNORE_DEVSEL_START_OFFSET     0x2E
-#define IGNORE_DEVSEL_START_BIT                26
+#define IGNORE_DEVSEL_START_OFFSET     0x2C
+#define IGNORE_DEVSEL_START_BIT                31
 
 /* public key */
-#define        PUBLIC_KEY_START_OFFSET         0x0A
-#define PUBLIC_KEY_START_BIT           25
+#define PUBLIC_KEY_START_OFFSET                0x0A
+#define PUBLIC_KEY_START_BIT           30
 
 /* pkc_disable */
-#define PKC_DISABLE_START_OFFSET       0x5A
-#define PKC_DISABLE_START_BIT          22
+#define PKC_DISABLE_START_OFFSET        0x5A
+#define PKC_DISABLE_START_BIT           9
 
 /* video vp8 enable */
 #define VP8_ENABLE_START_OFFSET                0x2E
-#define VP8_ENABLE_START_BIT           31
+#define VP8_ENABLE_START_BIT           4
 
 /* odm lock */
-#define ODM_LOCK_START_OFFSET          0x02
-#define ODM_LOCK_START_BIT             0
+#define ODM_LOCK_START_OFFSET          0x0
+#define ODM_LOCK_START_BIT             6
 
 /* reserved_odm0 -> reserved_odm7 */
-#define ODM_RESERVED_DEVSEL_START_OFFSET       0x30
-#define ODM_RESERVED_START_BIT                 0
+#define ODM_RESERVED_DEVSEL_START_OFFSET       0x2E
+#define ODM_RESERVED_START_BIT                 5
 
 #define FUSE_VENDOR_CODE       0x200
 #define FUSE_VENDOR_CODE_MASK  0xf
 #define FUSE_Y_COORDINATE_MASK 0x1ff
 #define FUSE_GPU_INFO          0x390
 #define FUSE_GPU_INFO_MASK     (1<<2)
-#define FUSE_SPARE_BIT         0x244
+#define FUSE_SPARE_BIT         0x300
 /* fuse registers used in public fuse data read API */
-#define FUSE_TEST_PROGRAM_REVISION_0   0x128
+#define FUSE_FT_REV            0x128
+#define FUSE_CP_REV            0x190
 /* fuse spare bits are used to get Tj-ADT values */
 #define NUM_TSENSOR_SPARE_BITS 28
 /* tsensor calibration register */
 #define FUSE_TSENSOR_CALIB_0   0x198
-#define FUSE_VSENSOR_CALIB_0   0x18c
+/* sparse realignment register */
+#define FUSE_SPARE_REALIGNMENT_REG_0 0x2fc
+/* tsensor8_calib */
+#define FUSE_TSENSOR_CALIB_8 0x280
+
+#define FUSE_BASE_CP_SHIFT     0
+#define FUSE_BASE_CP_MASK      0x3ff
+#define FUSE_BASE_FT_SHIFT     10
+#define FUSE_BASE_FT_MASK      0x7ff
+#define FUSE_SHIFT_CP_SHIFT    0
+#define FUSE_SHIFT_CP_MASK     0x3f
+#define FUSE_SHIFT_CP_BITS     6
+#define FUSE_SHIFT_FT_SHIFT    21
+#define FUSE_SHIFT_FT_MASK     0x1f
+#define FUSE_SHIFT_FT_BITS     5
 
 #define TEGRA_FUSE_SUPPLY      "vpp_fuse"
 
-int fuse_pgm_cycles[] = {130, 168, 0, 0, 192, 384, 0, 0, 120, 480, 0, 0, 260};
+#define PGM_TIME_US 12
 
 #define CHK_ERR(x) \
 { \
@@ -113,22 +129,36 @@ int fuse_pgm_cycles[] = {130, 168, 0, 0, 192, 384, 0, 0, 120, 480, 0, 0, 260};
        } \
 }
 
-static struct kobj_attribute public_key_attr =
-       __ATTR(public_key, 0440, tegra_fuse_show, tegra_fuse_store);
+DEVICE_ATTR(public_key, 0440, tegra_fuse_show, tegra_fuse_store);
+DEVICE_ATTR(pkc_disable, 0440, tegra_fuse_show, tegra_fuse_store);
+DEVICE_ATTR(vp8_enable, 0440, tegra_fuse_show, tegra_fuse_store);
+DEVICE_ATTR(odm_lock, 0440, tegra_fuse_show, tegra_fuse_store);
 
-static struct kobj_attribute pkc_disable_attr =
-       __ATTR(pkc_disable, 0440, tegra_fuse_show, tegra_fuse_store);
+static inline int fuse_cp_rev_check(void)
+{
+       u32 rev, rev_major, rev_minor;
 
-static struct kobj_attribute vp8_enable_attr =
-       __ATTR(vp8_enable, 0440, tegra_fuse_show, tegra_fuse_store);
+       rev = tegra_fuse_readl(FUSE_CP_REV);
+       rev_minor = rev & 0x1f;
+       rev_major = (rev >> 5) & 0x3f;
+       /* CP rev < 00.4 is unsupported */
+       if ((rev_major == 0) && (rev_minor < 4))
+               return -EINVAL;
 
-static struct kobj_attribute odm_lock_attr =
-       __ATTR(odm_lock, 0440, tegra_fuse_show, tegra_fuse_store);
+       return 0;
+}
 
-int tegra_fuse_get_revision(u32 *rev)
+static inline int fuse_ft_rev_check(void)
 {
-       /* fuse revision */
-       *rev = tegra_fuse_readl(FUSE_TEST_PROGRAM_REVISION_0);
+       u32 rev, rev_major, rev_minor;
+
+       rev = tegra_fuse_readl(FUSE_FT_REV);
+       rev_minor = rev & 0x1f;
+       rev_major = (rev >> 5) & 0x3f;
+       /* FT rev < 00.5 is unsupported */
+       if ((rev_major == 0) && (rev_minor < 5))
+               return -EINVAL;
+
        return 0;
 }
 
@@ -198,8 +228,8 @@ unsigned long long tegra_chip_uid(void)
                Total     64
        */
 
-       /* chip id is 1 for tegra 11x */
-       cid = 1;
+       /* chip id is 3 for tegra 12x */
+       cid = 3;
 
        vendor = tegra_fuse_readl(FUSE_VENDOR_CODE) & FUSE_VENDOR_CODE_MASK;
        fab = tegra_fuse_readl(FUSE_FAB_CODE) & FUSE_FAB_CODE_MASK;
@@ -231,12 +261,6 @@ unsigned long long tegra_chip_uid(void)
        return uid;
 }
 
-int tegra_fuse_get_vsensor_calib(u32 *calib)
-{
-       *calib = tegra_fuse_readl(FUSE_VSENSOR_CALIB_0);
-       return 0;
-}
-
 static int tsensor_calib_offset[] = {
        [0] = 0x198,
        [1] = 0x184,
@@ -250,49 +274,98 @@ static int tsensor_calib_offset[] = {
 
 int tegra_fuse_get_tsensor_calib(int index, u32 *calib)
 {
-       if (index < 0 || index > 7)
+       if (index < 0 || index >= ARRAY_SIZE(tsensor_calib_offset))
                return -EINVAL;
        *calib = tegra_fuse_readl(tsensor_calib_offset[index]);
        return 0;
 }
 
+int tegra_fuse_calib_base_get_cp(u32 *base_cp, s32 *shifted_cp)
+{
+       s32 cp;
+       u32 val = tegra_fuse_readl(FUSE_TSENSOR_CALIB_8);
+
+       if (fuse_cp_rev_check() || !val)
+               return -EINVAL;
+
+       if (base_cp && shifted_cp) {
+               *base_cp = (((val) & (FUSE_BASE_CP_MASK
+                               << FUSE_BASE_CP_SHIFT))
+                               >> FUSE_BASE_CP_SHIFT);
+
+               val = tegra_fuse_readl(FUSE_SPARE_REALIGNMENT_REG_0);
+               cp = (((val) & (FUSE_SHIFT_CP_MASK
+                               << FUSE_SHIFT_CP_SHIFT))
+                               >> FUSE_SHIFT_CP_SHIFT);
+
+               *shifted_cp = ((s32)(cp)
+                               << (32 - FUSE_SHIFT_CP_BITS)
+                               >> (32 - FUSE_SHIFT_CP_BITS));
+       }
+       return 0;
+}
+
+int tegra_fuse_calib_base_get_ft(u32 *base_ft, s32 *shifted_ft)
+{
+       s32 ft;
+       u32 val = tegra_fuse_readl(FUSE_TSENSOR_CALIB_8);
+
+       if (fuse_ft_rev_check() || !val)
+               return -EINVAL;
+
+       if (base_ft && shifted_ft) {
+               *base_ft = (((val) & (FUSE_BASE_FT_MASK
+                               << FUSE_BASE_FT_SHIFT))
+                               >> FUSE_BASE_FT_SHIFT);
+
+               ft = (((val) & (FUSE_SHIFT_FT_MASK
+                               << FUSE_SHIFT_FT_SHIFT))
+                               >> FUSE_SHIFT_FT_SHIFT);
+
+               *shifted_ft = ((s32)(ft)
+                               << (32 - FUSE_SHIFT_FT_BITS)
+                               >> (32 - FUSE_SHIFT_FT_BITS));
+       }
+       return 0;
+}
+
 int tegra_fuse_add_sysfs_variables(struct platform_device *pdev,
                                        bool odm_security_mode)
 {
-       odm_lock_attr.attr.mode = 0640;
+       dev_attr_odm_lock.attr.mode = 0640;
        if (odm_security_mode) {
-               public_key_attr.attr.mode =  0440;
-               pkc_disable_attr.attr.mode = 0440;
-               vp8_enable_attr.attr.mode = 0440;
+               dev_attr_public_key.attr.mode =  0440;
+               dev_attr_pkc_disable.attr.mode = 0440;
+               dev_attr_vp8_enable.attr.mode = 0440;
        } else {
-               public_key_attr.attr.mode =  0640;
-               pkc_disable_attr.attr.mode = 0640;
-               vp8_enable_attr.attr.mode = 0640;
+               dev_attr_public_key.attr.mode =  0640;
+               dev_attr_pkc_disable.attr.mode = 0640;
+               dev_attr_vp8_enable.attr.mode = 0640;
        }
-       CHK_ERR(sysfs_create_file(&pdev->dev.kobj, &public_key_attr.attr));
-       CHK_ERR(sysfs_create_file(&pdev->dev.kobj, &pkc_disable_attr.attr));
-       CHK_ERR(sysfs_create_file(&pdev->dev.kobj, &vp8_enable_attr.attr));
-       CHK_ERR(sysfs_create_file(&pdev->dev.kobj, &odm_lock_attr.attr));
+       CHK_ERR(sysfs_create_file(&pdev->dev.kobj, &dev_attr_public_key.attr));
+       CHK_ERR(sysfs_create_file(&pdev->dev.kobj, &dev_attr_pkc_disable.attr));
+       CHK_ERR(sysfs_create_file(&pdev->dev.kobj, &dev_attr_vp8_enable.attr));
+       CHK_ERR(sysfs_create_file(&pdev->dev.kobj, &dev_attr_odm_lock.attr));
 
        return 0;
 }
 
 int tegra_fuse_rm_sysfs_variables(struct platform_device *pdev)
 {
-       sysfs_remove_file(&pdev->dev.kobj, &public_key_attr.attr);
-       sysfs_remove_file(&pdev->dev.kobj, &pkc_disable_attr.attr);
-       sysfs_remove_file(&pdev->dev.kobj, &vp8_enable_attr.attr);
-       sysfs_remove_file(&pdev->dev.kobj, &odm_lock_attr.attr);
+       sysfs_remove_file(&pdev->dev.kobj, &dev_attr_public_key.attr);
+       sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pkc_disable.attr);
+       sysfs_remove_file(&pdev->dev.kobj, &dev_attr_vp8_enable.attr);
+       sysfs_remove_file(&pdev->dev.kobj, &dev_attr_odm_lock.attr);
 
        return 0;
 }
 
 int tegra_fuse_ch_sysfs_perm(struct kobject *kobj)
 {
-       CHK_ERR(sysfs_chmod_file(kobj, &public_key_attr.attr, 0440));
-       CHK_ERR(sysfs_chmod_file(kobj, &pkc_disable_attr.attr, 0440));
-       CHK_ERR(sysfs_chmod_file(kobj, &vp8_enable_attr.attr, 0440));
+       CHK_ERR(sysfs_chmod_file(kobj, &dev_attr_public_key.attr, 0440));
+       CHK_ERR(sysfs_chmod_file(kobj, &dev_attr_pkc_disable.attr, 0440));
+       CHK_ERR(sysfs_chmod_file(kobj, &dev_attr_vp8_enable.attr, 0440));
 
        return 0;
 }
-#endif /* __TEGRA11x_FUSE_OFFSETS_H */
+#endif /* __TEGRA12x_FUSE_OFFSETS_H */