Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1762023Ab3DCWO4 (ORCPT ); Wed, 3 Apr 2013 18:14:56 -0400 Received: from bear.ext.ti.com ([192.94.94.41]:56173 "EHLO bear.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755939Ab3DCWOy (ORCPT ); Wed, 3 Apr 2013 18:14:54 -0400 From: Eduardo Valentin To: CC: , , , Eduardo Valentin Subject: [PATCHv2 3/3] staging: ti-soc-thermal: remove external heat while extrapolating hotspot Date: Wed, 3 Apr 2013 18:13:17 -0400 Message-ID: <1365027197-2793-4-git-send-email-eduardo.valentin@ti.com> X-Mailer: git-send-email 1.7.7.1.488.ge8e1c In-Reply-To: <1365027197-2793-1-git-send-email-eduardo.valentin@ti.com> References: <1365027197-2793-1-git-send-email-eduardo.valentin@ti.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2869 Lines: 86 For boards that provide a PCB sensor close to SoC junction temperature, it is possible to remove the cumulative heat reported by the SoC temperature sensor. This patch changes the extrapolation computation to consider an external sensor in the extrapolation equations. Signed-off-by: Eduardo Valentin --- drivers/staging/ti-soc-thermal/ti-thermal-common.c | 30 +++++++++++++------ 1 files changed, 20 insertions(+), 10 deletions(-) diff --git a/drivers/staging/ti-soc-thermal/ti-thermal-common.c b/drivers/staging/ti-soc-thermal/ti-thermal-common.c index 231c549..780368b 100644 --- a/drivers/staging/ti-soc-thermal/ti-thermal-common.c +++ b/drivers/staging/ti-soc-thermal/ti-thermal-common.c @@ -38,6 +38,7 @@ /* common data structures */ struct ti_thermal_data { struct thermal_zone_device *ti_thermal; + struct thermal_zone_device *pcb_tz; struct thermal_cooling_device *cool_dev; struct ti_bandgap *bgp; enum thermal_device_mode mode; @@ -77,10 +78,12 @@ static inline int ti_thermal_hotspot_temperature(int t, int s, int c) static inline int ti_thermal_get_temp(struct thermal_zone_device *thermal, unsigned long *temp) { + struct thermal_zone_device *pcb_tz = NULL; struct ti_thermal_data *data = thermal->devdata; struct ti_bandgap *bgp; const struct ti_temp_sensor *s; - int ret, tmp, pcb_temp, slope, constant; + int ret, tmp, slope, constant; + unsigned long pcb_temp; if (!data) return 0; @@ -92,16 +95,22 @@ static inline int ti_thermal_get_temp(struct thermal_zone_device *thermal, if (ret) return ret; - pcb_temp = 0; - /* TODO: Introduce pcb temperature lookup */ + /* Default constants */ + slope = s->slope; + constant = s->constant; + + pcb_tz = data->pcb_tz; /* In case pcb zone is available, use the extrapolation rule with it */ - if (pcb_temp) { - tmp -= pcb_temp; - slope = s->slope_pcb; - constant = s->constant_pcb; - } else { - slope = s->slope; - constant = s->constant; + if (!IS_ERR_OR_NULL(pcb_tz)) { + ret = thermal_zone_get_temp(pcb_tz, &pcb_temp); + if (!ret) { + tmp -= pcb_temp; /* got a valid PCB temp */ + slope = s->slope_pcb; + constant = s->constant_pcb; + } else { + dev_err(bgp->dev, + "Failed to read PCB state. Using defaults\n"); + } } *temp = ti_thermal_hotspot_temperature(tmp, slope, constant); @@ -248,6 +257,7 @@ static struct ti_thermal_data data->sensor_id = id; data->bgp = bgp; data->mode = THERMAL_DEVICE_ENABLED; + data->pcb_tz = thermal_zone_get_zone_by_name("pcb"); INIT_WORK(&data->thermal_wq, ti_thermal_work); return data; -- 1.7.7.1.488.ge8e1c -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/