]> git.sur5r.net Git - u-boot/blobdiff - drivers/power/exynos-tmu.c
bfin: Move gpio support for bf54x and bf60x into the generic driver folder.
[u-boot] / drivers / power / exynos-tmu.c
index d8313b1d3b213d0f0df127c68facc64bf681d764..d4b3e65a3eac0bfac781572d15e8fe6115c02cce 100644 (file)
 #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);
 }
 
 /*