Patch "thermal/drivers/hisi: Simplify the temperature/step computation" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
thermal/drivers/hisi: Simplify the temperature/step computation
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
thermal-drivers-hisi-simplify-the-temperature-step-computation.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
48880b979cdc9ef5a70af020f42b8ba1e51dbd34Mon Sep 17 00:00:00 2001
From: Daniel Lezcano <[email protected]>
Date: Thu, 19 Oct 2017 19:05:46 +0200
Subject: thermal/drivers/hisi: Simplify the temperature/step computation
From: Daniel Lezcano <[email protected]>
commit 48880b979cdc9ef5a70af020f42b8ba1e51dbd34 upstream.
The step and the base temperature are fixed values, we can simplify the computation by converting the base temperature to milli celsius and use a pre-computed step value. That saves us a lot of mult + div for nothing at runtime.
Take also the opportunity to change the function names to be consistent with the rest of the code.
--- drivers/thermal/hisi_thermal.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-)
drivers/thermal/hisi_thermal.c +28 -13
@@ -35,8 +35,9 @@#define TEMP0_RST_MSK (0x1C)#define TEMP0_VALUE (0x28) -#define HISI_TEMP_BASE (-60) +#define HISI_TEMP_BASE (-60000)#define HISI_TEMP_RESET (100000) +#define HISI_TEMP_STEP (784)#define HISI_MAX_SENSORS 4
@@ -61,19 +62,32 @@ struct hisi_thermal_data {void __iomem *regs; }; -/* in millicelsius */ -static inline int _step_to_temp (int step) +/* +* The temperature computation on the tsensor is as follow: +* Unit: millidegree Celsius +* Step: 255/200 (0.7843) +* Temperature base: -60°C +* +* The register is programmed in temperature steps, every step is 784 +* millidegree and begins at -60 000 m°C +* +* The temperature from the steps: +* +* Temp = TempBase + (steps x 784) +* +* and the steps from the temperature: +* +* steps = (Temp - TempBase) / 784 +* +*/ +static inline int hisi_thermal_step_to_temp (int step) { -/* -* Every step equals (1 * 200) / 255 celsius, and finally -* need convert to millicelsius. -*/ -return (HISI_TEMP_BASE *1000 + (step *200000 /255 )); +return HISI_TEMP_BASE + (step *HISI_TEMP_STEP ); } -static inline long _temp_to_step (long temp) +static inline long hisi_thermal_temp_to_step (long temp) { -return ((temp -HISI_TEMP_BASE *1000 ) *255 ) /200000 ; +return (temp -HISI_TEMP_BASE ) /HISI_TEMP_STEP ; } static long hisi_thermal_get_sensor_temp(struct hisi_thermal_data *data,
@@ -99,7 +113,7 @@ static long hisi_thermal_get_sensor_tempusleep_range (3000 ,5000 ); val =readl (data->regs +TEMP0_VALUE ); - val =_step_to_temp (val); + val =hisi_thermal_step_to_temp (val);mutex_unlock (&data->thermal_lock);
@@ -126,10 +140,11 @@ static void hisi_thermal_enable_bind_irqwritel ((sensor->id <<12 ), data->regs +TEMP0_CFG );/* enable for interrupt */ -writel (_temp_to_step (sensor->thres_temp) |0x0FFFFFF00 , +writel (hisi_thermal_temp_to_step (sensor->thres_temp) |0x0FFFFFF00 , data->regs +TEMP0_TH ); -writel (_temp_to_step (HISI_TEMP_RESET ), data->regs +TEMP0_RST_TH ); +writel (hisi_thermal_temp_to_step (HISI_TEMP_RESET ), + data->regs +TEMP0_RST_TH );/* enable module */ writel (0x1 , data->regs +TEMP0_RST_MSK );
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/thermal-drivers-hisi-fix-kernel-panic-on-alarm-interrupt.patch queue-4.9/thermal-drivers-hisi-fix-multiple-alarm-interrupts-firing.patch queue-4.9/thermal-drivers-hisi-simplify-the-temperature-step-computation.patch queue-4.9/thermal-drivers-hisi-fix-missing-interrupt-enablement.patch