aboutsummaryrefslogtreecommitdiff
path: root/drivers/power/exynos-tmu.c
diff options
context:
space:
mode:
authorAkshay Saraswat2013-02-25 01:13:06 +0000
committerMinkyu Kang2013-03-12 17:07:31 +0900
commit3a0b1dae5b9b853559b87a2332a27d1ed6a91fb8 (patch)
treefa466a0120e4b4c401964149196ff319e92d82a9 /drivers/power/exynos-tmu.c
parent8afcfc212415b8bacdf08b752aef7976e7da52a8 (diff)
Exynos5: TMU: Add hardware tripping
This adds hardware tripping at 110 degrees celsius which must enable forced system shutdown in case TMU fails to power off. Signed-off-by: Akshay Saraswat <akshay.s@samsung.com> Acked-by: Simon Glass <sjg@chromium.org> Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
Diffstat (limited to 'drivers/power/exynos-tmu.c')
-rw-r--r--drivers/power/exynos-tmu.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/power/exynos-tmu.c b/drivers/power/exynos-tmu.c
index d8313b1d3b2..d4b3e65a3ea 100644
--- a/drivers/power/exynos-tmu.c
+++ b/drivers/power/exynos-tmu.c
@@ -22,9 +22,11 @@
#include <fdtdec.h>
#include <tmu.h>
#include <asm/arch/tmu.h>
+#include <asm/arch/power.h>
#define TRIMINFO_RELOAD 1
#define CORE_EN 1
+#define THERM_TRIP_EN (1 << 12)
#define INTEN_RISE0 1
#define INTEN_RISE1 (1 << 4)
@@ -55,6 +57,8 @@ struct temperature_params {
unsigned int start_warning;
/* temperature threshold CPU tripping */
unsigned int start_tripping;
+ /* temperature threshold for HW tripping */
+ unsigned int hardware_tripping;
};
/* Pre-defined values and thresholds for calibration of current temperature */
@@ -196,6 +200,9 @@ static int get_tmu_fdt_values(struct tmu_info *info, const void *blob)
info->data.ts.start_tripping = fdtdec_get_int(blob,
node, "samsung,start-tripping", -1);
error |= info->data.ts.start_tripping;
+ info->data.ts.hardware_tripping = fdtdec_get_int(blob,
+ node, "samsung,hw-tripping", -1);
+ error |= info->data.ts.hardware_tripping;
info->data.efuse_min_value = fdtdec_get_int(blob,
node, "samsung,efuse-min-value", -1);
error |= info->data.efuse_min_value;
@@ -230,7 +237,7 @@ static int get_tmu_fdt_values(struct tmu_info *info, const void *blob)
static void tmu_setup_parameters(struct tmu_info *info)
{
unsigned int te_code, con;
- unsigned int warning_code, trip_code;
+ unsigned int warning_code, trip_code, hwtrip_code;
unsigned int cooling_temp;
unsigned int rising_value;
struct tmu_data *data = &info->data;
@@ -254,9 +261,14 @@ static void tmu_setup_parameters(struct tmu_info *info)
+ info->te1 - info->dc_value;
trip_code = data->ts.start_tripping
+ info->te1 - info->dc_value;
+ hwtrip_code = data->ts.hardware_tripping
+ + info->te1 - info->dc_value;
+
cooling_temp = 0;
- rising_value = ((warning_code << 8) | (trip_code << 16));
+ rising_value = ((warning_code << 8) |
+ (trip_code << 16) |
+ (hwtrip_code << 24));
/* Set interrupt level */
writel(rising_value, &reg->threshold_temp_rise);
@@ -276,12 +288,15 @@ static void tmu_setup_parameters(struct tmu_info *info)
/* TMU core enable */
con = readl(&reg->tmu_control);
- con |= CORE_EN;
+ con |= THERM_TRIP_EN | CORE_EN;
writel(con, &reg->tmu_control);
- /* LEV0 LEV1 LEV2 interrupt enable */
- writel(INTEN_RISE0 | INTEN_RISE1 | INTEN_RISE2, &reg->inten);
+ /* Enable HW thermal trip */
+ set_hw_thermal_trip();
+
+ /* LEV1 LEV2 interrupt enable */
+ writel(INTEN_RISE1 | INTEN_RISE2, &reg->inten);
}
/*