diff options
author | venu byravarasu <vbyravarasu@nvidia.com> | 2011-08-03 16:51:57 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:48:05 -0800 |
commit | 3e8e2a67e2d2a0d77218d487082fdbffccbb548d (patch) | |
tree | b9ea4aa8afcecd7af5a6c19490023e14ecca4192 /arch/arm/mach-tegra/tegra3_tsensor.c | |
parent | 1351a51c206601dd552d85905d2b6c3800a87761 (diff) |
ARM: tegra: cardhu: switch off PMU at high temperature
Add board support needed for PMU switch off when tsensor
detects temperature > TH3 threshold set.
bug 850047
Original-Change-Id: I7a283cedc735264dd8ea52801f7f1a103e9293cb
Reviewed-on: http://git-master/r/41531
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Tested-by: Varun Colbert <vcolbert@nvidia.com>
Rebase-Id: Rc4bf2206a7207e28434b46baed442cd6f2797fbc
Diffstat (limited to 'arch/arm/mach-tegra/tegra3_tsensor.c')
-rw-r--r-- | arch/arm/mach-tegra/tegra3_tsensor.c | 76 |
1 files changed, 73 insertions, 3 deletions
diff --git a/arch/arm/mach-tegra/tegra3_tsensor.c b/arch/arm/mach-tegra/tegra3_tsensor.c index 019513218939..00c3b6d38afa 100644 --- a/arch/arm/mach-tegra/tegra3_tsensor.c +++ b/arch/arm/mach-tegra/tegra3_tsensor.c @@ -16,12 +16,16 @@ #include <linux/kernel.h> #include <linux/init.h> -#include "board.h" #ifdef CONFIG_SENSORS_TEGRA_TSENSOR +#include <linux/io.h> +#include <linux/ioport.h> + +#include <mach/iomap.h> #include <mach/tsensor.h> #include <mach/tegra_fuse.h> +#include "board.h" #include "devices.h" #include "fuse.h" @@ -36,10 +40,35 @@ static struct tegra_tsensor_platform_data tsensor_data = { #define TSENSOR_FUSE_REVISION_DECIMAL 8 #define TSENSOR_FUSE_REVISION_INTEGER 0 -void __init tegra_tsensor_init(void) +/* scratch register offsets needed for powering off PMU */ +#define SCRATCH54_OFFSET 0x258 +#define SCRATCH55_OFFSET 0x25C + +/* scratch 54 register bit field offsets */ +#define PMU_OFF_DATA_OFFSET 8 + +/* scratch 55 register bit field offsets */ +#define RESET_TEGRA_OFFSET 31 +#define CONTROLLER_TYPE_OFFSET 30 +#define I2C_CONTROLLER_ID_OFFSET 27 +#define PINMUX_OFFSET 24 +#define CHECKSUM_OFFSET 16 +#define PMU_16BIT_SUPPORT_OFFSET 15 +/* scratch 55 register bit field masks */ +#define RESET_TEGRA_MASK 0x1 +#define CONTROLLER_TYPE_MASK 0x1 +#define I2C_CONTROLLER_ID_MASK 0x7 +#define PINMUX_MASK 0x7 +#define CHECKSUM_MASK 0xff +#define PMU_16BIT_SUPPORT_MASK 0x1 + + +void __init tegra3_tsensor_init(struct tegra_tsensor_pmu_data *data) { unsigned int reg, fuse_rev_integer, fuse_rev_decimal; int err; + u32 val, checksum; + void __iomem *pMem = NULL; /* tsensor driver is instantiated based on fuse revision */ err = tegra_fuse_get_revision(®); if (err) @@ -50,6 +79,47 @@ void __init tegra_tsensor_init(void) 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); @@ -59,6 +129,6 @@ errLabel: } #else -void __init tegra_tsensor_init(void) { } +void __init tegra3_tsensor_init(void) { } #endif |