From 54a36422d8081b3ab5800acc1c0ae14cb3abf4a2 Mon Sep 17 00:00:00 2001 From: Manaf Meethalavalappu Pallikunhi Date: Wed, 3 Feb 2016 16:23:58 +0530 Subject: [PATCH] msm: thermal: Maintain state in the mitigation device monitor If KTM get a trip threshold trigger notification and if the temperature stays the same as the recent trip threshold, KTM will re-activate the recently triggered threshold, resulting in back to back interrupts. To avoid this add support in KTM to maintain the recently triggered threshold state and then re-active the threshold based on the last threshold trip. This state is updated for mitigation features like VDD MX retention, CX phase control, VDD restriction, OCR monitor and external clients like CPR low temperature monitor etc. CRs-Fixed: 969112 972634 Change-Id: I44c0a93e1507a9f0b8a65e5c2ce5a98962bb335b Signed-off-by: Manaf Meethalavalappu Pallikunhi --- drivers/clk/qcom/clock-gcc-8952.c | 5 ++++- drivers/regulator/cpr-regulator.c | 16 +++++++++++----- drivers/thermal/msm_thermal.c | 27 +++++++++++++++++++++------ include/linux/msm_thermal.h | 3 ++- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/drivers/clk/qcom/clock-gcc-8952.c b/drivers/clk/qcom/clock-gcc-8952.c index ca8e129bccdd..e0595c2bda9f 100644 --- a/drivers/clk/qcom/clock-gcc-8952.c +++ b/drivers/clk/qcom/clock-gcc-8952.c @@ -3536,8 +3536,11 @@ static void thermal_monitor_notify(struct therm_threshold *trig_thres) break; } - sensor_mgr_set_threshold(trig_thres->sensor_id, + if (trig_thres->cur_state != trig_thres->trip_triggered) { + sensor_mgr_set_threshold(trig_thres->sensor_id, trig_thres->threshold); + trig_thres->cur_state = trig_thres->trip_triggered; + } } static int clock_check_tsens(void) diff --git a/drivers/regulator/cpr-regulator.c b/drivers/regulator/cpr-regulator.c index 663a5495972a..03bcd049ae89 100644 --- a/drivers/regulator/cpr-regulator.c +++ b/drivers/regulator/cpr-regulator.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -5092,10 +5092,16 @@ static void tsens_threshold_notify(struct therm_threshold *tsens_cb_data) break; } - rc = sensor_mgr_set_threshold(tsens_cb_data->sensor_id, - tsens_cb_data->threshold); - if (rc < 0) - cpr_err(cpr_vreg, "Failed to set temp. threshold, rc=%d\n", rc); + if (tsens_cb_data->cur_state != tsens_cb_data->trip_triggered) { + rc = sensor_mgr_set_threshold(tsens_cb_data->sensor_id, + tsens_cb_data->threshold); + if (rc < 0) + cpr_err(cpr_vreg, + "Failed to set temp. threshold, rc=%d\n", rc); + else + tsens_cb_data->cur_state = + tsens_cb_data->trip_triggered; + } } static int cpr_check_tsens(struct cpr_regulator *cpr_vreg) diff --git a/drivers/thermal/msm_thermal.c b/drivers/thermal/msm_thermal.c index 5c50dd264c4a..13e7686bd7f7 100644 --- a/drivers/thermal/msm_thermal.c +++ b/drivers/thermal/msm_thermal.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -2601,8 +2601,12 @@ static void vdd_mx_notify(struct therm_threshold *trig_thresh) pr_err("Failed to remove vdd mx restriction\n"); } mutex_unlock(&vdd_mx_mutex); - sensor_mgr_set_threshold(trig_thresh->sensor_id, + + if (trig_thresh->cur_state != trig_thresh->trip_triggered) { + sensor_mgr_set_threshold(trig_thresh->sensor_id, trig_thresh->threshold); + trig_thresh->cur_state = trig_thresh->trip_triggered; + } } static void msm_thermal_bite(int zone_id, long temp) @@ -4036,8 +4040,11 @@ static void cx_phase_ctrl_notify(struct therm_threshold *trig_thresh) cx_phase_unlock_exit: mutex_unlock(&cx_mutex); cx_phase_ctrl_exit: - sensor_mgr_set_threshold(trig_thresh->sensor_id, + if (trig_thresh->cur_state != trig_thresh->trip_triggered) { + sensor_mgr_set_threshold(trig_thresh->sensor_id, trig_thresh->threshold); + trig_thresh->cur_state = trig_thresh->trip_triggered; + } return; } @@ -4260,8 +4267,11 @@ static void vdd_restriction_notify(struct therm_threshold *trig_thresh) unlock_and_exit: mutex_unlock(&vdd_rstr_mutex); set_and_exit: - sensor_mgr_set_threshold(trig_thresh->sensor_id, + if (trig_thresh->cur_state != trig_thresh->trip_triggered) { + sensor_mgr_set_threshold(trig_thresh->sensor_id, trig_thresh->threshold); + trig_thresh->cur_state = trig_thresh->trip_triggered; + } return; } @@ -4309,8 +4319,11 @@ static void ocr_notify(struct therm_threshold *trig_thresh) unlock_and_exit: mutex_unlock(&ocr_mutex); set_and_exit: - sensor_mgr_set_threshold(trig_thresh->sensor_id, - trig_thresh->threshold); + if (trig_thresh->cur_state != trig_thresh->trip_triggered) { + sensor_mgr_set_threshold(trig_thresh->sensor_id, + trig_thresh->threshold); + trig_thresh->cur_state = trig_thresh->trip_triggered; + } return; } @@ -4654,6 +4667,7 @@ int sensor_mgr_init_threshold(struct device *dev, thresh_ptr[i].notify = callback; thresh_ptr[i].trip_triggered = -1; thresh_ptr[i].parent = thresh_inp; + thresh_ptr[i].cur_state = -1; thresh_ptr[i].threshold[0].temp = high_temp * tsens_scaling_factor; thresh_ptr[i].threshold[0].trip = @@ -4677,6 +4691,7 @@ int sensor_mgr_init_threshold(struct device *dev, thresh_ptr->notify = callback; thresh_ptr->trip_triggered = -1; thresh_ptr->parent = thresh_inp; + thresh_ptr->cur_state = -1; thresh_ptr->threshold[0].temp = high_temp * tsens_scaling_factor; thresh_ptr->threshold[0].trip = THERMAL_TRIP_CONFIGURABLE_HI; diff --git a/include/linux/msm_thermal.h b/include/linux/msm_thermal.h index f4b3b557891c..a1cdcd8dcc18 100644 --- a/include/linux/msm_thermal.h +++ b/include/linux/msm_thermal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -105,6 +105,7 @@ struct therm_threshold { struct threshold_info *parent; enum msm_therm_progressive_state prog_state; bool prog_trip_clear; + int32_t cur_state; }; struct threshold_info {