Message ID | 1421597753-2082-2-git-send-email-wxt@rock-chips.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Jan 19, 2015 at 12:15:53AM +0800, Caesar Wang wrote: > In general, the kernel should report temperature readings exactly as > reported by the hardware. The cpu / gpu thermal driver works in 5 degree > increments,but we ought to do more accurate. The temperature will do > linear interpolation between the entries in the table. > > Test= $md5sum /dev/zero & > $while true; do grep "" /sys/class/thermal/thermal_zone[1-2]/temp; > sleep .5; done > > e.g. We can get the result as follows: > /sys/class/thermal/thermal_zone1/temp:39994 > /sys/class/thermal/thermal_zone2/temp:39086 > /sys/class/thermal/thermal_zone1/temp:39994 > /sys/class/thermal/thermal_zone2/temp:39540 > /sys/class/thermal/thermal_zone1/temp:39540 > /sys/class/thermal/thermal_zone2/temp:39540 > /sys/class/thermal/thermal_zone1/temp:39540 > /sys/class/thermal/thermal_zone2/temp:39994 > > Signed-off-by: Caesar Wang <wxt@rock-chips.com> I did several review this patch on the Chrome OS gerrit, so Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> > > --- > > drivers/thermal/rockchip_thermal.c | 26 +++++++++++++++++--------- > 1 file changed, 17 insertions(+), 9 deletions(-) > > diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c > index 1bcddfc..a7ae23a 100644 > --- a/drivers/thermal/rockchip_thermal.c > +++ b/drivers/thermal/rockchip_thermal.c > @@ -193,19 +193,18 @@ static u32 rk_tsadcv2_temp_to_code(long temp) > > static long rk_tsadcv2_code_to_temp(u32 code) > { > - int high, low, mid; > - > - low = 0; > - high = ARRAY_SIZE(v2_code_table) - 1; > - mid = (high + low) / 2; > + unsigned int low = 0; > + unsigned int high = ARRAY_SIZE(v2_code_table) - 1; > + unsigned int mid = (low + high) / 2; > + unsigned int scale; > > if (code > v2_code_table[low].code || code < v2_code_table[high].code) > return 125000; /* No code available, return max temperature */ > > while (low <= high) { > - if (code >= v2_code_table[mid].code && code < > - v2_code_table[mid - 1].code) > - return v2_code_table[mid].temp; > + if (code >= v2_code_table[mid].code && > + code < v2_code_table[mid - 1].code) > + break; > else if (code < v2_code_table[mid].code) > low = mid + 1; > else > @@ -213,7 +212,16 @@ static long rk_tsadcv2_code_to_temp(u32 code) > mid = (low + high) / 2; > } > > - return 125000; > + /* > + * The 5C granularity provided by the table is too much. Let's > + * assume that the relationship between sensor readings and > + * temperature between 2 table entries is linear and extrapolate > + * to produce less granular result. > + */ > + scale = (v2_code_table[mid].temp - v2_code_table[mid - 1].temp) / > + (v2_code_table[mid - 1].code - v2_code_table[mid].code); > + return v2_code_table[mid - 1].temp + > + (v2_code_table[mid - 1].code - code) * scale; > } > > /** > -- > 1.9.1 > > Thanks.
diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c index 1bcddfc..a7ae23a 100644 --- a/drivers/thermal/rockchip_thermal.c +++ b/drivers/thermal/rockchip_thermal.c @@ -193,19 +193,18 @@ static u32 rk_tsadcv2_temp_to_code(long temp) static long rk_tsadcv2_code_to_temp(u32 code) { - int high, low, mid; - - low = 0; - high = ARRAY_SIZE(v2_code_table) - 1; - mid = (high + low) / 2; + unsigned int low = 0; + unsigned int high = ARRAY_SIZE(v2_code_table) - 1; + unsigned int mid = (low + high) / 2; + unsigned int scale; if (code > v2_code_table[low].code || code < v2_code_table[high].code) return 125000; /* No code available, return max temperature */ while (low <= high) { - if (code >= v2_code_table[mid].code && code < - v2_code_table[mid - 1].code) - return v2_code_table[mid].temp; + if (code >= v2_code_table[mid].code && + code < v2_code_table[mid - 1].code) + break; else if (code < v2_code_table[mid].code) low = mid + 1; else @@ -213,7 +212,16 @@ static long rk_tsadcv2_code_to_temp(u32 code) mid = (low + high) / 2; } - return 125000; + /* + * The 5C granularity provided by the table is too much. Let's + * assume that the relationship between sensor readings and + * temperature between 2 table entries is linear and extrapolate + * to produce less granular result. + */ + scale = (v2_code_table[mid].temp - v2_code_table[mid - 1].temp) / + (v2_code_table[mid - 1].code - v2_code_table[mid].code); + return v2_code_table[mid - 1].temp + + (v2_code_table[mid - 1].code - code) * scale; } /**
In general, the kernel should report temperature readings exactly as reported by the hardware. The cpu / gpu thermal driver works in 5 degree increments,but we ought to do more accurate. The temperature will do linear interpolation between the entries in the table. Test= $md5sum /dev/zero & $while true; do grep "" /sys/class/thermal/thermal_zone[1-2]/temp; sleep .5; done e.g. We can get the result as follows: /sys/class/thermal/thermal_zone1/temp:39994 /sys/class/thermal/thermal_zone2/temp:39086 /sys/class/thermal/thermal_zone1/temp:39994 /sys/class/thermal/thermal_zone2/temp:39540 /sys/class/thermal/thermal_zone1/temp:39540 /sys/class/thermal/thermal_zone2/temp:39540 /sys/class/thermal/thermal_zone1/temp:39540 /sys/class/thermal/thermal_zone2/temp:39994 Signed-off-by: Caesar Wang <wxt@rock-chips.com> --- drivers/thermal/rockchip_thermal.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-)