]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
thermal: samsung: Only update available threshold limits
authorTushar Behera <tushar.behera@linaro.org>
Mon, 14 Apr 2014 05:38:15 +0000 (11:08 +0530)
committerZhang Rui <rui.zhang@intel.com>
Thu, 15 May 2014 08:44:16 +0000 (16:44 +0800)
Currently the threshold limits are updated in 2 stages, once for all
software trigger levels and again for hardware trip point.

While updating the software trigger levels, it overwrites the threshold
limit for hardware trip point thereby forcing the Exynos core to issue
an emergency shutdown.

Updating only the required fields in threshold register fixes this issue.

Signed-off-by: Tushar Behera <tushar.behera@linaro.org>
Acked-by: Amit Daniel Kachhap <amit.daniel@samsung.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
drivers/thermal/samsung/exynos_tmu.c

index 0d96a510389f412c0287f4f67484a23ae71356f1..ffccc894f0f87750779abcbea7f4e9ae0f0ebb4c 100644 (file)
@@ -225,6 +225,8 @@ skip_calib_data:
                        trigger_levs++;
        }
 
+       rising_threshold = readl(data->base + reg->threshold_th0);
+
        if (data->soc == SOC_ARCH_EXYNOS4210) {
                /* Write temperature code for threshold */
                threshold_code = temp_to_code(data, pdata->threshold);
@@ -249,6 +251,7 @@ skip_calib_data:
                                ret = threshold_code;
                                goto out;
                        }
+                       rising_threshold &= ~(0xff << 8 * i);
                        rising_threshold |= threshold_code << 8 * i;
                        if (pdata->threshold_falling) {
                                threshold_code = temp_to_code(data,
@@ -281,6 +284,7 @@ skip_calib_data:
                        }
                        if (i == EXYNOS_MAX_TRIGGER_PER_REG - 1) {
                                /* 1-4 level to be assigned in th0 reg */
+                               rising_threshold &= ~(0xff << 8 * i);
                                rising_threshold |= threshold_code << 8 * i;
                                writel(rising_threshold,
                                        data->base + reg->threshold_th0);