| From 4dd74e8a65014b9bf3d19a5b94728bc4fbb37045 Mon Sep 17 00:00:00 2001 |
| From: Patrick Titiano <ptitiano@baylibre.com> |
| Date: Fri, 28 Feb 2014 14:10:04 +0100 |
| Subject: 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> |
| (cherry picked from commit 9477165ec525d47abb1cb6523698e0cd89d65ddb) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/thermal/rcar_thermal.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| 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) |
| static void rcar_thermal_work(struct work_struct *work) |
| { |
| struct rcar_thermal_priv *priv; |
| + unsigned long cctemp, nctemp; |
| |
| priv = container_of(work, struct rcar_thermal_priv, work.work); |
| |
| + rcar_thermal_get_temp(priv->zone, &cctemp); |
| rcar_thermal_update_temp(priv); |
| rcar_thermal_irq_enable(priv); |
| - thermal_zone_device_update(priv->zone); |
| + |
| + rcar_thermal_get_temp(priv->zone, &nctemp); |
| + if (nctemp != cctemp) |
| + thermal_zone_device_update(priv->zone); |
| } |
| |
| static u32 rcar_thermal_had_changed(struct rcar_thermal_priv *priv, u32 status) |
| -- |
| 2.1.2 |
| |