summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/tegra3_tsensor.c
diff options
context:
space:
mode:
authorvenu byravarasu <vbyravarasu@nvidia.com>2011-08-03 16:51:57 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:48:05 -0800
commit3e8e2a67e2d2a0d77218d487082fdbffccbb548d (patch)
treeb9ea4aa8afcecd7af5a6c19490023e14ecca4192 /arch/arm/mach-tegra/tegra3_tsensor.c
parent1351a51c206601dd552d85905d2b6c3800a87761 (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.c76
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(&reg);
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