[U-Boot] [PATCH 8/9 v6] EXYNOS5: TMU: Add hardware tripping
Akshay Saraswat
akshay.s at samsung.com
Wed Jan 23 16:24:40 CET 2013
This adds hardware tripping at 110 degrees celsius which must enable
forced system shutdown in case TMU fails to poweroff.
Signed-off-by: Akshay Saraswat <akshay.s at samsung.com>
---
Changes since v5:
- New patch.
arch/arm/cpu/armv7/exynos/power.c | 10 ++++++++++
arch/arm/include/asm/arch-exynos/power.h | 5 +++++
drivers/power/exynos-tmu.c | 25 ++++++++++++++++++++-----
3 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/arch/arm/cpu/armv7/exynos/power.c b/arch/arm/cpu/armv7/exynos/power.c
index 73f764e..d1d65e1 100644
--- a/arch/arm/cpu/armv7/exynos/power.c
+++ b/arch/arm/cpu/armv7/exynos/power.c
@@ -96,6 +96,16 @@ void set_dp_phy_ctrl(unsigned int enable)
exynos5_dp_phy_control(enable);
}
+/* Enables hardware tripping to poweroff the system when TMU fails */
+void power_enable_hw_thermal_trip(void)
+{
+ struct exynos5_power *power =
+ (struct exynos5_power *)samsung_get_base_power();
+
+ /* PS_HOLD_CONTROL register ENABLE_HW_TRIP bit*/
+ setbits_le32(&power->ps_hold_control, POWER_ENABLE_HW_TRIP);
+}
+
/*
* This function never returns.
* When called this function makes system hang and PAD driving value high
diff --git a/arch/arm/include/asm/arch-exynos/power.h b/arch/arm/include/asm/arch-exynos/power.h
index 7463036..f14d19e 100644
--- a/arch/arm/include/asm/arch-exynos/power.h
+++ b/arch/arm/include/asm/arch-exynos/power.h
@@ -857,6 +857,9 @@ void set_mipi_phy_ctrl(unsigned int dev_index, unsigned int enable);
void set_usbhost_phy_ctrl(unsigned int enable);
+/* Enables hardware tripping to poweroff the system when TMU fails */
+void power_enable_hw_thermal_trip(void);
+
#define POWER_USB_HOST_PHY_CTRL_EN (1 << 0)
#define POWER_USB_HOST_PHY_CTRL_DISABLE (0 << 0)
@@ -864,5 +867,7 @@ void set_dp_phy_ctrl(unsigned int enable);
#define EXYNOS_DP_PHY_ENABLE (1 << 0)
#define POWER_PS_HOLD_CONTROL_DATA_HIGH (1 << 8)
+#define POWER_ENABLE_HW_TRIP (1UL << 31)
+
#endif
diff --git a/drivers/power/exynos-tmu.c b/drivers/power/exynos-tmu.c
index 83a2572..9d28614 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/exynos-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 */
@@ -195,6 +199,9 @@ 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;
@@ -228,7 +235,7 @@ int get_tmu_fdt_values(struct tmu_info *info, const void *blob)
void tmu_setup_parameters(struct tmu_info *info)
{
unsigned int te_temp, con;
- unsigned int warning_temp, trip_temp;
+ unsigned int warning_temp, trip_temp, hwtrip_temp;
unsigned int cooling_temp;
unsigned int rising_value;
struct tmu_data *data = &info->data;
@@ -252,9 +259,14 @@ void tmu_setup_parameters(struct tmu_info *info)
+ info->te1 - info->dc_value;
trip_temp = data->ts.start_tripping
+ info->te1 - info->dc_value;
+ hwtrip_temp = data->ts.hardware_tripping
+ + info->te1 - info->dc_value;
+
cooling_temp = 0;
- rising_value = ((warning_temp << 8) | (trip_temp << 16));
+ rising_value = ((warning_temp << 8) |
+ (trip_temp << 16) |
+ (hwtrip_temp << 24));
/* Set interrupt level */
writel(rising_value, ®->threshold_temp_rise);
@@ -274,12 +286,15 @@ void tmu_setup_parameters(struct tmu_info *info)
/* TMU core enable */
con = readl(®->tmu_control);
- con |= CORE_EN;
+ con |= THERM_TRIP_EN | CORE_EN;
writel(con, ®->tmu_control);
- /* LEV0 LEV1 LEV2 interrupt enable */
- writel(INTEN_RISE0 | INTEN_RISE1 | INTEN_RISE2, ®->inten);
+ /* Enable HW thermal trip */
+ power_enable_hw_thermal_trip();
+
+ /* LEV1 LEV2 interrupt enable */
+ writel(INTEN_RISE1 | INTEN_RISE2, ®->inten);
}
/*
--
1.7.9.5
More information about the U-Boot
mailing list