diff options
author | Bitan Biswas <bbiswas@nvidia.com> | 2011-08-12 15:02:31 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:48:18 -0800 |
commit | aaffcb14a39f3a13c8b4654bf5675e4505bfda61 (patch) | |
tree | 0f039eebe898e33fb0f52c2a01ae6f911ac4343a /arch/arm/mach-tegra/tegra3_tsensor.c | |
parent | 30b6fc81ce928e5383d6b63f902ca149cbf1e09d (diff) |
arm: tegra: tsensor: fuse revision corrected
tsensor functionality is enabled based on fuse revision.
The fuse revision is to be interpreted as an unsigned integer
while it is interpreted as a decimal number. Corrected this
in platform source file.
bug 863460
Original-Change-Id: Iaf9676d559bb7fb3555c7b731aa018f949441c8e
Reviewed-on: http://git-master/r/46901
Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Tested-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Rebase-Id: R8a85e2ce060dd3110c374b30d0018c7512b22113
Diffstat (limited to 'arch/arm/mach-tegra/tegra3_tsensor.c')
-rw-r--r-- | arch/arm/mach-tegra/tegra3_tsensor.c | 105 |
1 files changed, 51 insertions, 54 deletions
diff --git a/arch/arm/mach-tegra/tegra3_tsensor.c b/arch/arm/mach-tegra/tegra3_tsensor.c index 00c3b6d38afa..866c6a9f35c5 100644 --- a/arch/arm/mach-tegra/tegra3_tsensor.c +++ b/arch/arm/mach-tegra/tegra3_tsensor.c @@ -65,66 +65,63 @@ static struct tegra_tsensor_platform_data tsensor_data = { void __init tegra3_tsensor_init(struct tegra_tsensor_pmu_data *data) { - unsigned int reg, fuse_rev_integer, fuse_rev_decimal; + unsigned int reg; int err; u32 val, checksum; void __iomem *pMem = NULL; /* tsensor driver is instantiated based on fuse revision */ err = tegra_fuse_get_revision(®); if (err) - goto errLabel; - fuse_rev_decimal = (reg & 0xf); - fuse_rev_integer = ((reg >> 4) & 0x7); - pr_info("\nTegra3 fuse revision %d.%d \n", fuse_rev_integer, - fuse_rev_decimal); - if ((fuse_rev_decimal >= TSENSOR_FUSE_REVISION_DECIMAL) && - (fuse_rev_integer >= TSENSOR_FUSE_REVISION_INTEGER)) { - - if (!request_mem_region(TEGRA_PMC_BASE + SCRATCH54_OFFSET, - 8, "tegra-tsensor")) { - pr_err(" [%s, line=%d]: Error mem busy\n", - __func__, __LINE__); - } - - pMem = ioremap(TEGRA_PMC_BASE + SCRATCH54_OFFSET, 8); - if (!pMem) { - pr_err(" [%s, line=%d]: can't ioremap " - "pmc iomem\n", __FILE__, __LINE__); - } - - /* - Fill scratch registers to power off the device - in case if temperature crosses threshold TH3 - */ - val = (data->poweroff_reg_data << PMU_OFF_DATA_OFFSET) | - data->poweroff_reg_addr; - writel(val, pMem); - - val = ((data->reset_tegra & RESET_TEGRA_MASK) << - RESET_TEGRA_OFFSET) | - ((data->controller_type & CONTROLLER_TYPE_MASK) << - CONTROLLER_TYPE_OFFSET) | - ((data->i2c_controller_id & I2C_CONTROLLER_ID_MASK) << - I2C_CONTROLLER_ID_OFFSET) | - ((data->pinmux & PINMUX_MASK) << PINMUX_OFFSET) | - ((data->pmu_16bit_ops & PMU_16BIT_SUPPORT_MASK) << - PMU_16BIT_SUPPORT_OFFSET) | - data->pmu_i2c_addr; - - checksum = data->poweroff_reg_addr + - data->poweroff_reg_data + (val & 0xFF) + - ((val >> 8) & 0xFF) + ((val >> 24) & 0xFF); - checksum &= 0xFF; - checksum = 0x100 - checksum; - - val |= (checksum << CHECKSUM_OFFSET); - writel(val, pMem + 4); - - /* set platform data for device before register */ - tegra_tsensor_device.dev.platform_data = &tsensor_data; - platform_device_register(&tegra_tsensor_device); - } -errLabel: + goto labelEnd; + pr_info("\nTegra3 fuse revision %d ", reg); + if (reg < TSENSOR_FUSE_REVISION_DECIMAL) + goto labelEnd; + + if (!data) + goto labelSkipPowerOff; + + if (!request_mem_region(TEGRA_PMC_BASE + + SCRATCH54_OFFSET, 8, "tegra-tsensor")) + pr_err(" [%s, line=%d]: Error mem busy\n", + __func__, __LINE__); + + pMem = ioremap(TEGRA_PMC_BASE + SCRATCH54_OFFSET, 8); + if (!pMem) + pr_err(" [%s, line=%d]: can't ioremap " + "pmc iomem\n", __FILE__, __LINE__); + + /* + * Fill scratch registers to power off the device + * in case if temperature crosses threshold TH3 + */ + val = (data->poweroff_reg_data << PMU_OFF_DATA_OFFSET) | + data->poweroff_reg_addr; + writel(val, pMem); + + val = ((data->reset_tegra & RESET_TEGRA_MASK) << RESET_TEGRA_OFFSET) | + ((data->controller_type & CONTROLLER_TYPE_MASK) << + CONTROLLER_TYPE_OFFSET) | + ((data->i2c_controller_id & I2C_CONTROLLER_ID_MASK) << + I2C_CONTROLLER_ID_OFFSET) | + ((data->pinmux & PINMUX_MASK) << PINMUX_OFFSET) | + ((data->pmu_16bit_ops & PMU_16BIT_SUPPORT_MASK) << + PMU_16BIT_SUPPORT_OFFSET) | data->pmu_i2c_addr; + + checksum = data->poweroff_reg_addr + + data->poweroff_reg_data + (val & 0xFF) + + ((val >> 8) & 0xFF) + ((val >> 24) & 0xFF); + checksum &= 0xFF; + checksum = 0x100 - checksum; + + val |= (checksum << CHECKSUM_OFFSET); + writel(val, pMem + 4); + +labelSkipPowerOff: + /* set platform data for device before register */ + tegra_tsensor_device.dev.platform_data = &tsensor_data; + platform_device_register(&tegra_tsensor_device); + +labelEnd: return; } |