diff options
author | Diwakar Tundlam <dtundlam@nvidia.com> | 2013-03-15 12:47:28 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 13:03:57 -0700 |
commit | 069436b60072f1ff55de96828bb246e72de06fab (patch) | |
tree | 58bd1891c0b749a0da1685303866bec668125625 /arch/arm/mach-tegra/tegra11_soctherm.c | |
parent | 971b942b1a2f6ecdcefe22c91d5b35b16422ae9c (diff) |
arm: tegra: soctherm: Init error if we find FUSE is improper
Change-Id: I52ef93850a9ebbe214c759d3d5f06221e547fcde
Signed-off-by: Diwakar Tundlam <dtundlam@nvidia.com>
Reviewed-on: http://git-master/r/210106
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/tegra11_soctherm.c')
-rw-r--r-- | arch/arm/mach-tegra/tegra11_soctherm.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/arch/arm/mach-tegra/tegra11_soctherm.c b/arch/arm/mach-tegra/tegra11_soctherm.c index 1bae3eb1e15f..5a17dcbfba95 100644 --- a/arch/arm/mach-tegra/tegra11_soctherm.c +++ b/arch/arm/mach-tegra/tegra11_soctherm.c @@ -1232,7 +1232,7 @@ static int soctherm_clk_enable(bool enable) return 0; } -static void soctherm_fuse_read_vsensor(void) +static int soctherm_fuse_read_vsensor(void) { u32 value; s32 calib_cp, calib_ft; @@ -1257,6 +1257,12 @@ static void soctherm_fuse_read_vsensor(void) /* use HI precision to calculate: use fuse_temp in 0.5C */ actual_temp_cp = 2 * nominal_calib_cp + calib_cp; actual_temp_ft = 2 * nominal_calib_ft + calib_ft; + + if (!actual_temp_ft || !actual_temp_cp) { + pr_err("soctherm: ERROR: Improper FUSE. SOC_THERM disabled\n"); + return -EINVAL; + } + return 0; } static int fuse_corr_alpha[] = { /* scaled *1000000 */ @@ -1277,7 +1283,7 @@ static int fuse_corr_beta[] = { /* scaled *1000000 */ [TSENSE_PLLX] = -14665000, }; -static void soctherm_fuse_read_tsensor(enum soctherm_sense sensor) +static int soctherm_fuse_read_tsensor(enum soctherm_sense sensor) { u32 r, value; s32 calib, delta_sens, delta_temp; @@ -1295,6 +1301,11 @@ static void soctherm_fuse_read_tsensor(enum soctherm_sense sensor) calib = MAKE_SIGNED32(calib, FUSE_TSENSOR_CALIB_BITS); actual_tsensor_cp = (fuse_calib_base_cp * 64) + calib; + if (!actual_tsensor_ft || !actual_tsensor_cp) { + pr_err("soctherm: ERROR: Improper FUSE. SOC_THERM disabled\n"); + return -EINVAL; + } + mult = plat_data.sensor_data[sensor].pdiv * plat_data.sensor_data[sensor].tsamp_ATE; div = plat_data.sensor_data[sensor].tsample * @@ -1331,6 +1342,8 @@ static void soctherm_fuse_read_tsensor(enum soctherm_sense sensor) r = REG_SET(0, TS_CPU0_CONFIG2_THERM_A, therm_a); r = REG_SET(r, TS_CPU0_CONFIG2_THERM_B, therm_b); soctherm_writel(r, TS_TSENSE_REG_OFFSET(TS_CPU0_CONFIG2, sensor)); + + return 0; } static void soctherm_therm_trip_init(struct tegra_tsensor_pmu_data *data) @@ -1416,11 +1429,13 @@ static int soctherm_init_platform_data(void) soctherm_writel(r, TS_HOTSPOT_OFF); /* Thermal Sensing programming */ - soctherm_fuse_read_vsensor(); + if (soctherm_fuse_read_vsensor() < 0) + return -EINVAL; for (i = 0; i < TSENSE_SIZE; i++) { if (plat_data.sensor_data[i].sensor_enable) { soctherm_tsense_program(i, &plat_data.sensor_data[i]); - soctherm_fuse_read_tsensor(i); + if (soctherm_fuse_read_tsensor(i) < 0) + return -EINVAL; } } |