lkml.org 
[lkml]   [2015]   [Nov]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 4/9] thermal: rockchip: improve the conversion function
    Date
    We should make the conversion table in as a parameter since the different
    SoCs have the different conversionion table.

    Signed-off-by: Caesar Wang <wxt@rock-chips.com>
    ---

    Changes in v2:
    - make the conversion table in as a parameter both code_to_temp
    and temp_to_code function.
    Series-changes: 1
    - As Dmitry comment, make the conversion table in as a parameter.

    Changes in v1: None

    drivers/thermal/rockchip_thermal.c | 82 +++++++++++++++++++++++++-------------
    1 file changed, 55 insertions(+), 27 deletions(-)

    diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c
    index bdf7063..e828f18 100644
    --- a/drivers/thermal/rockchip_thermal.c
    +++ b/drivers/thermal/rockchip_thermal.c
    @@ -58,6 +58,16 @@ enum sensor_id {
    */
    #define SOC_MAX_SENSORS 2

    +struct chip_tsadc_table {
    + const struct tsadc_table *id;
    +
    + /* the array table size*/
    + unsigned int length;
    +
    + /* that analogic mask data */
    + unsigned long data_mask;
    +};
    +
    struct rockchip_tsadc_chip {
    /* The sensor id of chip correspond to the ADC channel */
    int chn_id[SOC_MAX_SENSORS];
    @@ -74,9 +84,14 @@ struct rockchip_tsadc_chip {
    void (*control)(void __iomem *reg, bool on);

    /* Per-sensor methods */
    - int (*get_temp)(int chn, void __iomem *reg, int *temp);
    - void (*set_tshut_temp)(int chn, void __iomem *reg, long temp);
    + int (*get_temp)(struct chip_tsadc_table table,
    + int chn, void __iomem *reg, int *temp);
    + void (*set_tshut_temp)(struct chip_tsadc_table table,
    + int chn, void __iomem *reg, long temp);
    void (*set_tshut_mode)(int chn, void __iomem *reg, enum tshut_mode m);
    +
    + /* Per-table methods */
    + struct chip_tsadc_table table;
    };

    struct rockchip_thermal_sensor {
    @@ -172,21 +187,22 @@ static const struct tsadc_table v2_code_table[] = {
    {3421, 125000},
    };

    -static u32 rk_tsadcv2_temp_to_code(long temp)
    +static u32 rk_tsadcv2_temp_to_code(struct chip_tsadc_table table,
    + long temp)
    {
    int high, low, mid;

    low = 0;
    - high = ARRAY_SIZE(v2_code_table) - 1;
    + high = table.length - 1;
    mid = (high + low) / 2;

    - if (temp < v2_code_table[low].temp || temp > v2_code_table[high].temp)
    + if (temp < table.id[low].temp || temp > table.id[high].temp)
    return 0;

    while (low <= high) {
    - if (temp == v2_code_table[mid].temp)
    - return v2_code_table[mid].code;
    - else if (temp < v2_code_table[mid].temp)
    + if (temp == table.id[mid].temp)
    + return table.id[mid].code;
    + else if (temp < table.id[mid].temp)
    high = mid - 1;
    else
    low = mid + 1;
    @@ -196,25 +212,26 @@ static u32 rk_tsadcv2_temp_to_code(long temp)
    return 0;
    }

    -static int rk_tsadcv2_code_to_temp(u32 code, int *temp)
    +static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code,
    + int *temp)
    {
    unsigned int low = 1;
    - unsigned int high = ARRAY_SIZE(v2_code_table) - 1;
    + unsigned int high = table.length - 1;
    unsigned int mid = (low + high) / 2;
    unsigned int num;
    unsigned long denom;

    - BUILD_BUG_ON(ARRAY_SIZE(v2_code_table) < 2);
    + WARN_ON(table.length < 2);

    - code &= TSADCV2_DATA_MASK;
    - if (code < v2_code_table[high].code)
    + code &= table.data_mask;
    + if (code < table.id[high].code)
    return -EAGAIN; /* Incorrect reading */

    while (low <= high) {
    - if (code >= v2_code_table[mid].code &&
    - code < v2_code_table[mid - 1].code)
    + if (code >= table.id[mid].code &&
    + code < table.id[mid - 1].code)
    break;
    - else if (code < v2_code_table[mid].code)
    + else if (code < table.id[mid].code)
    low = mid + 1;
    else
    high = mid - 1;
    @@ -227,10 +244,10 @@ static int rk_tsadcv2_code_to_temp(u32 code, int *temp)
    * temperature between 2 table entries is linear and interpolate
    * to produce less granular result.
    */
    - num = v2_code_table[mid].temp - v2_code_table[mid - 1].temp;
    - num *= v2_code_table[mid - 1].code - code;
    - denom = v2_code_table[mid - 1].code - v2_code_table[mid].code;
    - *temp = v2_code_table[mid - 1].temp + (num / denom);
    + num = table.id[mid].temp - v2_code_table[mid - 1].temp;
    + num *= table.id[mid - 1].code - code;
    + denom = table.id[mid - 1].code - table.id[mid].code;
    + *temp = table.id[mid - 1].temp + (num / denom);

    return 0;
    }
    @@ -290,20 +307,22 @@ static void rk_tsadcv2_control(void __iomem *regs, bool enable)
    writel_relaxed(val, regs + TSADCV2_AUTO_CON);
    }

    -static int rk_tsadcv2_get_temp(int chn, void __iomem *regs, int *temp)
    +static int rk_tsadcv2_get_temp(struct chip_tsadc_table table,
    + int chn, void __iomem *regs, int *temp)
    {
    u32 val;

    val = readl_relaxed(regs + TSADCV2_DATA(chn));

    - return rk_tsadcv2_code_to_temp(val, temp);
    + return rk_tsadcv2_code_to_temp(table, val, temp);
    }

    -static void rk_tsadcv2_tshut_temp(int chn, void __iomem *regs, long temp)
    +static void rk_tsadcv2_tshut_temp(struct chip_tsadc_table table,
    + int chn, void __iomem *regs, long temp)
    {
    u32 tshut_value, val;

    - tshut_value = rk_tsadcv2_temp_to_code(temp);
    + tshut_value = rk_tsadcv2_temp_to_code(table, temp);
    writel_relaxed(tshut_value, regs + TSADCV2_COMP_SHUT(chn));

    /* TSHUT will be valid */
    @@ -343,6 +362,12 @@ static const struct rockchip_tsadc_chip rk3288_tsadc_data = {
    .get_temp = rk_tsadcv2_get_temp,
    .set_tshut_temp = rk_tsadcv2_tshut_temp,
    .set_tshut_mode = rk_tsadcv2_tshut_mode,
    +
    + .table = {
    + .id = v2_code_table,
    + .length = ARRAY_SIZE(v2_code_table),
    + .data_mask = TSADCV2_DATA_MASK,
    + },
    };

    static const struct of_device_id of_rockchip_thermal_match[] = {
    @@ -385,7 +410,8 @@ static int rockchip_thermal_get_temp(void *_sensor, int *out_temp)
    const struct rockchip_tsadc_chip *tsadc = sensor->thermal->chip;
    int retval;

    - retval = tsadc->get_temp(sensor->id, thermal->regs, out_temp);
    + retval = tsadc->get_temp(tsadc->table,
    + sensor->id, thermal->regs, out_temp);
    dev_dbg(&thermal->pdev->dev, "sensor %d - temp: %d, retval: %d\n",
    sensor->id, *out_temp, retval);

    @@ -463,7 +489,8 @@ rockchip_thermal_register_sensor(struct platform_device *pdev,
    int error;

    tsadc->set_tshut_mode(id, thermal->regs, thermal->tshut_mode);
    - tsadc->set_tshut_temp(id, thermal->regs, thermal->tshut_temp);
    + tsadc->set_tshut_temp(tsadc->table, id, thermal->regs,
    + thermal->tshut_temp);

    sensor->thermal = thermal;
    sensor->id = id;
    @@ -681,7 +708,8 @@ static int __maybe_unused rockchip_thermal_resume(struct device *dev)

    thermal->chip->set_tshut_mode(id, thermal->regs,
    thermal->tshut_mode);
    - thermal->chip->set_tshut_temp(id, thermal->regs,
    + thermal->chip->set_tshut_temp(thermal->chip->table,
    + id, thermal->regs,
    thermal->tshut_temp);
    }

    --
    1.9.1


    \
     
     \ /
      Last update: 2015-11-05 06:41    [W:5.056 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site