Re: [PATCH v1 3/3] thermal: tsens: Fix negative temperature reporting
From: Amit Kucheria
Date: Thu Jul 26 2018 - 06:17:58 EST
On Thu, Jul 26, 2018 at 5:19 AM, Matthias Kaehlcke <mka@xxxxxxxxxxxx> wrote:
> On Wed, Jul 18, 2018 at 12:55:03PM +0530, Amit Kucheria wrote:
>> The current code will always return 0xffffffff in case of negative
>> temperatures due to a bug in how the binary sign extension is being done.
>>
>> Use sign_extend32() instead.
>>
>> Signed-off-by: Amit Kucheria <amit.kucheria@xxxxxxxxxx>
>> ---
>> drivers/thermal/qcom/tsens-v2.c | 13 +++++--------
>> 1 file changed, 5 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/thermal/qcom/tsens-v2.c b/drivers/thermal/qcom/tsens-v2.c
>> index 908e3dc..46abc21 100644
>> --- a/drivers/thermal/qcom/tsens-v2.c
>> +++ b/drivers/thermal/qcom/tsens-v2.c
>> @@ -5,19 +5,20 @@
>> */
>>
>> #include <linux/regmap.h>
>> +#include <linux/bitops.h>
>> #include "tsens.h"
>>
>> #define STATUS_OFFSET 0xa0
>> #define LAST_TEMP_MASK 0xfff
>> #define STATUS_VALID_BIT BIT(21)
>> -#define CODE_SIGN_BIT BIT(11)
>>
>> static int get_temp_tsens_v2(struct tsens_device *tmdev, int id, int *temp)
>> {
>> struct tsens_sensor *s = &tmdev->sensor[id];
>> u32 code;
>> unsigned int status_reg;
>> - int last_temp = 0, last_temp2 = 0, last_temp3 = 0, ret;
>> + u32 last_temp = 0, last_temp2 = 0, last_temp3 = 0;
>> + int ret;
>>
>> status_reg = tmdev->tm_offset + STATUS_OFFSET + s->hw_id * 4;
>> ret = regmap_read(tmdev->map, status_reg, &code);
>> @@ -54,12 +55,8 @@ static int get_temp_tsens_v2(struct tsens_device *tmdev, int id, int *temp)
>> else if (last_temp2 == last_temp3)
>> last_temp = last_temp3;
>> done:
>> - /* Code sign bit is the sign extension for a negative value */
>> - if (last_temp & CODE_SIGN_BIT)
>> - last_temp |= ~CODE_SIGN_BIT;
>> -
>> - /* Temperatures are in deciCelicius */
>> - *temp = last_temp * 100;
>> + /* Convert temperatures to milliCelicius */
>
> nits:
>
> s/temperatures/temperature/
> s/milliCelicius/milliCelsius/
Embarrassing to have two typos in a single sentence. :-)
>> + *temp = sign_extend32(last_temp, fls(LAST_TEMP_MASK) - 1) * 100;
>>
>> return 0;
>> }
>
> Reviewed-by: Matthias Kaehlcke <mka@xxxxxxxxxxxx>
Thanks for the review.