aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Titiano <ptitiano@baylibre.com>2014-02-28 08:10:04 -0500
committerZhang Rui <rui.zhang@intel.com>2014-04-07 21:01:39 -0400
commit9477165ec525d47abb1cb6523698e0cd89d65ddb (patch)
tree76fd2a4df3ffdc668c9f8f3b13cc0c06815bea65
parent206c0cba095acbb91d552d220207d690c9b29594 (diff)
thermal: rcar-thermal: update thermal zone only when temperature changes
Avoid updating the thermal zone in case an IRQ was triggered but the temperature didn't effectively change. Note this is not a driver issue. Below is a captured debug trace illustrating the purpose of this patch: out of 8 thermal zone updates, only 2 are actually necessary. [ 41.120000] rcar_thermal_work(): cctemp=25000 [ 41.120000] rcar_thermal_work(): nctemp=30000 [ 41.120000] rcar_thermal_work(): temp is now 30000C, update thermal zone [ 58.990000] rcar_thermal_work(): cctemp=30000 [ 58.990000] rcar_thermal_work(): nctemp=30000 [ 58.990000] rcar_thermal_work(): same temp, do not update thermal zone [ 59.290000] rcar_thermal_work(): cctemp=30000 [ 59.290000] rcar_thermal_work(): nctemp=30000 [ 59.290000] rcar_thermal_work(): same temp, do not update thermal zone [ 59.590000] rcar_thermal_work(): cctemp=30000 [ 59.590000] rcar_thermal_work(): nctemp=30000 [ 59.590000] rcar_thermal_work(): same temp, do not update thermal zone [ 59.890000] rcar_thermal_work(): cctemp=30000 [ 59.890000] rcar_thermal_work(): nctemp=30000 [ 59.890000] rcar_thermal_work(): same temp, do not update thermal zone [ 60.190000] rcar_thermal_work(): cctemp=30000 [ 60.190000] rcar_thermal_work(): nctemp=30000 [ 60.190000] rcar_thermal_work(): same temp, do not update thermal zone [ 60.490000] rcar_thermal_work(): cctemp=30000 [ 60.490000] rcar_thermal_work(): nctemp=30000 [ 60.490000] rcar_thermal_work(): same temp, do not update thermal zone [ 60.790000] rcar_thermal_work(): cctemp=30000 [ 60.790000] rcar_thermal_work(): nctemp=35000 [ 60.790000] rcar_thermal_work(): temp is now 35000C, update thermal zone I suspect this may be due to sensor sampling accuracy / fluctuation, but no formal proof. Signed-off-by: Patrick Titiano <ptitiano@baylibre.com> Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Zhang Rui <rui.zhang@intel.com>
-rw-r--r--drivers/thermal/rcar_thermal.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c
index 88cfeec6a28f..5a37940b02c9 100644
--- a/drivers/thermal/rcar_thermal.c
+++ b/drivers/thermal/rcar_thermal.c
@@ -299,12 +299,17 @@ static void _rcar_thermal_irq_ctrl(struct rcar_thermal_priv *priv, int enable)
299static void rcar_thermal_work(struct work_struct *work) 299static void rcar_thermal_work(struct work_struct *work)
300{ 300{
301 struct rcar_thermal_priv *priv; 301 struct rcar_thermal_priv *priv;
302 unsigned long cctemp, nctemp;
302 303
303 priv = container_of(work, struct rcar_thermal_priv, work.work); 304 priv = container_of(work, struct rcar_thermal_priv, work.work);
304 305
306 rcar_thermal_get_temp(priv->zone, &cctemp);
305 rcar_thermal_update_temp(priv); 307 rcar_thermal_update_temp(priv);
306 rcar_thermal_irq_enable(priv); 308 rcar_thermal_irq_enable(priv);
307 thermal_zone_device_update(priv->zone); 309
310 rcar_thermal_get_temp(priv->zone, &nctemp);
311 if (nctemp != cctemp)
312 thermal_zone_device_update(priv->zone);
308} 313}
309 314
310static u32 rcar_thermal_had_changed(struct rcar_thermal_priv *priv, u32 status) 315static u32 rcar_thermal_had_changed(struct rcar_thermal_priv *priv, u32 status)