diff --git a/drivers/thermal/thermal_helpers.c b/drivers/thermal/thermal_helpers.c index 4d66372c9629..f51a57deabef 100644 --- a/drivers/thermal/thermal_helpers.c +++ b/drivers/thermal/thermal_helpers.c @@ -78,6 +78,9 @@ EXPORT_SYMBOL(get_thermal_instance); * * Return: On success returns 0, an error code otherwise */ +#define CRITICAL_TEMP 120000 +int thermal_zone_data[4] = { 0, }; + int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp) { int ret = -EINVAL; @@ -110,6 +113,30 @@ int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp) if (ret) dev_dbg(&tz->device, "Failed to get temperature: %d\n", ret); + /* save thermal_zone data */ + if (!ret) + thermal_zone_data[tz->id] = *temp; + /* + * This case is that the thermal sensor is broken. + * That's not real temperature. Set the fake temperature value in order to + * avoid reaching the ciritical temperature. + */ + if ((thermal_zone_data[tz->id] > CRITICAL_TEMP) && (tz->id != 4)) { + int i, broken_sensor = 0, correct_temp = 0; + for (i = 0; i < 4; i++) { + if ((thermal_zone_data[i] <= CRITICAL_TEMP) && + (correct_temp <= thermal_zone_data[i])) + correct_temp = thermal_zone_data[i]; + if (thermal_zone_data[i] > CRITICAL_TEMP) + broken_sensor++; + } + /* + * if all thermal sensor broken then critical temperature data send + * for system poweroff. + */ + *temp = (broken_sensor == 4) ? CRITICAL_TEMP : correct_temp; + } + return ret; }