#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)
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 */
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;
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;
+ 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, ®->threshold_temp_rise);
/* 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 */
+ set_hw_thermal_trip();
+
+ /* LEV1 LEV2 interrupt enable */
+ writel(INTEN_RISE1 | INTEN_RISE2, ®->inten);
}
/*