On Mon, Nov 28, 2016 at 07:12:03PM +0800, Caesar Wang wrote:
> In order to support the valid temperature can conver to analog value.
> The rockchip thermal driver has not supported the all valid temperature
> to convert the analog value. (e.g.: 61C, 62C, 63C....)
> 
> For example:
> In some cases, we need adjust the trip point.
> $cd /sys/class/thermal/thermal_zone*
> $echo 68000 > trip_point_0_temp
> That will return the max analogic value indicates the invalid before
> posting this patch.
> 
> So, this patch will optimize the conversion table to support the other
> cases.
> 
> Signed-off-by: Caesar Wang <w...@rock-chips.com>
> Reviewed-by: Brian Norris <briannor...@chromium.org>
> ---
> 
> Changes in v3: None
> Changes in v2:
> - improve the commit as Brian commnets on 
> https://patchwork.kernel.org/patch/9440985
> 
> Changes in v1: None
> 
>  drivers/thermal/rockchip_thermal.c | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 
> diff --git a/drivers/thermal/rockchip_thermal.c 
> b/drivers/thermal/rockchip_thermal.c
> index ca1730e..660ed3b 100644
> --- a/drivers/thermal/rockchip_thermal.c
> +++ b/drivers/thermal/rockchip_thermal.c
> @@ -401,6 +401,8 @@ static u32 rk_tsadcv2_temp_to_code(const struct 
> chip_tsadc_table *table,
>                                  int temp)
>  {
>       int high, low, mid;
> +     unsigned long num;
> +     unsigned int denom;
>       u32 error = table->data_mask;
>  
>       low = 0;
> @@ -421,6 +423,27 @@ static u32 rk_tsadcv2_temp_to_code(const struct 
> chip_tsadc_table *table,
>               mid = (low + high) / 2;
>       }
>  
> +     /*
> +      * The conversion code granularity provided by the table. Let's
> +      * assume that the relationship between temperature and
> +      * analog value between 2 table entries is linear and interpolate
> +      * to produce less granular result.
> +      */
> +     num = abs(table->id[mid].code - table->id[mid + 1].code);
> +     num *= temp - table->id[mid].temp;
> +     denom = table->id[mid + 1].temp - table->id[mid].temp;
> +
> +     switch (table->mode) {
> +     case ADC_DECREMENT:
> +             return table->id[mid].code - (num / denom);
> +     case ADC_INCREMENT:
> +             return table->id[mid].code + (num / denom);
> +     default:
> +             pr_err("%s: invalid conversion table, mode=%d\n",

Is this really an invalid conversion table, or an invalid conversion mode?

> +                    __func__, table->mode);
> +             return error;
> +     }
> +
>  exit:
>       pr_err("%s: invalid temperature, temp=%d error=%d\n",
>              __func__, temp, error);
> -- 
> 2.7.4
> 

Reply via email to