Message ID | 1479513177-81504-3-git-send-email-briannorris@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
在 2016年11月19日 07:52, Brian Norris 写道: > This driver passes struct chip_tsadc_table by value throughout; this is > inefficient, and AFAICT, there is no reason for it. Let's pass pointers > instead. > > Signed-off-by: Brian Norris <briannorris@chromium.org> Reviewed-by: Caesar Wang <wxt@rock-chips.com> Tested-by: Caesar Wang <wxt@rock-chips.com> Yup, that make sense to improve efficiency. Thanks the fixes. And tested on rk3399 evb board. > --- > drivers/thermal/rockchip_thermal.c | 80 +++++++++++++++++++------------------- > 1 file changed, 40 insertions(+), 40 deletions(-) > > diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c > index 35554d146b9d..30fb95a0dff0 100644 > --- a/drivers/thermal/rockchip_thermal.c > +++ b/drivers/thermal/rockchip_thermal.c > @@ -118,11 +118,11 @@ struct rockchip_tsadc_chip { > void (*control)(void __iomem *reg, bool on); > > /* Per-sensor methods */ > - int (*get_temp)(struct chip_tsadc_table table, > + int (*get_temp)(const struct chip_tsadc_table *table, > int chn, void __iomem *reg, int *temp); > - void (*set_alarm_temp)(struct chip_tsadc_table table, > + void (*set_alarm_temp)(const struct chip_tsadc_table *table, > int chn, void __iomem *reg, int temp); > - void (*set_tshut_temp)(struct chip_tsadc_table table, > + void (*set_tshut_temp)(const struct chip_tsadc_table *table, > int chn, void __iomem *reg, int temp); > void (*set_tshut_mode)(int chn, void __iomem *reg, enum tshut_mode m); > > @@ -397,26 +397,26 @@ static const struct tsadc_table rk3399_code_table[] = { > {TSADCV3_DATA_MASK, 125000}, > }; > > -static u32 rk_tsadcv2_temp_to_code(struct chip_tsadc_table table, > +static u32 rk_tsadcv2_temp_to_code(const struct chip_tsadc_table *table, > int temp) > { > int high, low, mid; > u32 error = 0; > > low = 0; > - high = table.length - 1; > + high = table->length - 1; > mid = (high + low) / 2; > > /* Return mask code data when the temp is over table range */ > - if (temp < table.id[low].temp || temp > table.id[high].temp) { > - error = table.data_mask; > + if (temp < table->id[low].temp || temp > table->id[high].temp) { > + error = table->data_mask; > goto exit; > } > > while (low <= high) { > - if (temp == table.id[mid].temp) > - return table.id[mid].code; > - else if (temp < table.id[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; > @@ -429,28 +429,28 @@ static u32 rk_tsadcv2_temp_to_code(struct chip_tsadc_table table, > return error; > } > > -static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code, > - int *temp) > +static int rk_tsadcv2_code_to_temp(const struct chip_tsadc_table *table, > + u32 code, int *temp) > { > unsigned int low = 1; > - unsigned int high = table.length - 1; > + unsigned int high = table->length - 1; > unsigned int mid = (low + high) / 2; > unsigned int num; > unsigned long denom; > > - WARN_ON(table.length < 2); > + WARN_ON(table->length < 2); > > - switch (table.mode) { > + switch (table->mode) { > case ADC_DECREMENT: > - code &= table.data_mask; > - if (code < table.id[high].code) > + code &= table->data_mask; > + if (code < table->id[high].code) > return -EAGAIN; /* Incorrect reading */ > > while (low <= high) { > - if (code >= table.id[mid].code && > - code < table.id[mid - 1].code) > + if (code >= table->id[mid].code && > + code < table->id[mid - 1].code) > break; > - else if (code < table.id[mid].code) > + else if (code < table->id[mid].code) > low = mid + 1; > else > high = mid - 1; > @@ -459,15 +459,15 @@ static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code, > } > break; > case ADC_INCREMENT: > - code &= table.data_mask; > - if (code < table.id[low].code) > + code &= table->data_mask; > + if (code < table->id[low].code) > return -EAGAIN; /* Incorrect reading */ > > while (low <= high) { > - if (code <= table.id[mid].code && > - code > table.id[mid - 1].code) > + if (code <= table->id[mid].code && > + code > table->id[mid - 1].code) > break; > - else if (code > table.id[mid].code) > + else if (code > table->id[mid].code) > low = mid + 1; > else > high = mid - 1; > @@ -477,7 +477,7 @@ static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code, > break; > default: > pr_err("%s: invalid conversion table, mode=%d\n", > - __func__, table.mode); > + __func__, table->mode); > return -EINVAL; > } > > @@ -487,10 +487,10 @@ static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code, > * temperature between 2 table entries is linear and interpolate > * to produce less granular result. > */ > - num = table.id[mid].temp - table.id[mid - 1].temp; > - num *= abs(table.id[mid - 1].code - code); > - denom = abs(table.id[mid - 1].code - table.id[mid].code); > - *temp = table.id[mid - 1].temp + (num / denom); > + num = table->id[mid].temp - table->id[mid - 1].temp; > + num *= abs(table->id[mid - 1].code - code); > + denom = abs(table->id[mid - 1].code - table->id[mid].code); > + *temp = table->id[mid - 1].temp + (num / denom); > > return 0; > } > @@ -646,7 +646,7 @@ static void rk_tsadcv3_control(void __iomem *regs, bool enable) > writel_relaxed(val, regs + TSADCV2_AUTO_CON); > } > > -static int rk_tsadcv2_get_temp(struct chip_tsadc_table table, > +static int rk_tsadcv2_get_temp(const struct chip_tsadc_table *table, > int chn, void __iomem *regs, int *temp) > { > u32 val; > @@ -656,17 +656,17 @@ static int rk_tsadcv2_get_temp(struct chip_tsadc_table table, > return rk_tsadcv2_code_to_temp(table, val, temp); > } > > -static void rk_tsadcv2_alarm_temp(struct chip_tsadc_table table, > +static void rk_tsadcv2_alarm_temp(const struct chip_tsadc_table *table, > int chn, void __iomem *regs, int temp) > { > u32 alarm_value, int_en; > > /* Make sure the value is valid */ > alarm_value = rk_tsadcv2_temp_to_code(table, temp); > - if (alarm_value == table.data_mask) > + if (alarm_value == table->data_mask) > return; > > - writel_relaxed(alarm_value & table.data_mask, > + writel_relaxed(alarm_value & table->data_mask, > regs + TSADCV2_COMP_INT(chn)); > > int_en = readl_relaxed(regs + TSADCV2_INT_EN); > @@ -674,14 +674,14 @@ static void rk_tsadcv2_alarm_temp(struct chip_tsadc_table table, > writel_relaxed(int_en, regs + TSADCV2_INT_EN); > } > > -static void rk_tsadcv2_tshut_temp(struct chip_tsadc_table table, > +static void rk_tsadcv2_tshut_temp(const struct chip_tsadc_table *table, > int chn, void __iomem *regs, int temp) > { > u32 tshut_value, val; > > /* Make sure the value is valid */ > tshut_value = rk_tsadcv2_temp_to_code(table, temp); > - if (tshut_value == table.data_mask) > + if (tshut_value == table->data_mask) > return; > > writel_relaxed(tshut_value, regs + TSADCV2_COMP_SHUT(chn)); > @@ -891,7 +891,7 @@ static int rockchip_thermal_set_trips(void *_sensor, int low, int high) > dev_dbg(&thermal->pdev->dev, "%s: sensor %d: low: %d, high %d\n", > __func__, sensor->id, low, high); > > - tsadc->set_alarm_temp(tsadc->table, > + tsadc->set_alarm_temp(&tsadc->table, > sensor->id, thermal->regs, high); > > return 0; > @@ -904,7 +904,7 @@ 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(tsadc->table, > + 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); > @@ -988,7 +988,7 @@ rockchip_thermal_register_sensor(struct platform_device *pdev, > int error; > > tsadc->set_tshut_mode(id, thermal->regs, thermal->tshut_mode); > - tsadc->set_tshut_temp(tsadc->table, id, thermal->regs, > + tsadc->set_tshut_temp(&tsadc->table, id, thermal->regs, > thermal->tshut_temp); > > sensor->thermal = thermal; > @@ -1202,7 +1202,7 @@ 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(thermal->chip->table, > + thermal->chip->set_tshut_temp(&thermal->chip->table, > id, thermal->regs, > thermal->tshut_temp); > }
diff --git a/drivers/thermal/rockchip_thermal.c b/drivers/thermal/rockchip_thermal.c index 35554d146b9d..30fb95a0dff0 100644 --- a/drivers/thermal/rockchip_thermal.c +++ b/drivers/thermal/rockchip_thermal.c @@ -118,11 +118,11 @@ struct rockchip_tsadc_chip { void (*control)(void __iomem *reg, bool on); /* Per-sensor methods */ - int (*get_temp)(struct chip_tsadc_table table, + int (*get_temp)(const struct chip_tsadc_table *table, int chn, void __iomem *reg, int *temp); - void (*set_alarm_temp)(struct chip_tsadc_table table, + void (*set_alarm_temp)(const struct chip_tsadc_table *table, int chn, void __iomem *reg, int temp); - void (*set_tshut_temp)(struct chip_tsadc_table table, + void (*set_tshut_temp)(const struct chip_tsadc_table *table, int chn, void __iomem *reg, int temp); void (*set_tshut_mode)(int chn, void __iomem *reg, enum tshut_mode m); @@ -397,26 +397,26 @@ static const struct tsadc_table rk3399_code_table[] = { {TSADCV3_DATA_MASK, 125000}, }; -static u32 rk_tsadcv2_temp_to_code(struct chip_tsadc_table table, +static u32 rk_tsadcv2_temp_to_code(const struct chip_tsadc_table *table, int temp) { int high, low, mid; u32 error = 0; low = 0; - high = table.length - 1; + high = table->length - 1; mid = (high + low) / 2; /* Return mask code data when the temp is over table range */ - if (temp < table.id[low].temp || temp > table.id[high].temp) { - error = table.data_mask; + if (temp < table->id[low].temp || temp > table->id[high].temp) { + error = table->data_mask; goto exit; } while (low <= high) { - if (temp == table.id[mid].temp) - return table.id[mid].code; - else if (temp < table.id[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; @@ -429,28 +429,28 @@ static u32 rk_tsadcv2_temp_to_code(struct chip_tsadc_table table, return error; } -static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code, - int *temp) +static int rk_tsadcv2_code_to_temp(const struct chip_tsadc_table *table, + u32 code, int *temp) { unsigned int low = 1; - unsigned int high = table.length - 1; + unsigned int high = table->length - 1; unsigned int mid = (low + high) / 2; unsigned int num; unsigned long denom; - WARN_ON(table.length < 2); + WARN_ON(table->length < 2); - switch (table.mode) { + switch (table->mode) { case ADC_DECREMENT: - code &= table.data_mask; - if (code < table.id[high].code) + code &= table->data_mask; + if (code < table->id[high].code) return -EAGAIN; /* Incorrect reading */ while (low <= high) { - if (code >= table.id[mid].code && - code < table.id[mid - 1].code) + if (code >= table->id[mid].code && + code < table->id[mid - 1].code) break; - else if (code < table.id[mid].code) + else if (code < table->id[mid].code) low = mid + 1; else high = mid - 1; @@ -459,15 +459,15 @@ static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code, } break; case ADC_INCREMENT: - code &= table.data_mask; - if (code < table.id[low].code) + code &= table->data_mask; + if (code < table->id[low].code) return -EAGAIN; /* Incorrect reading */ while (low <= high) { - if (code <= table.id[mid].code && - code > table.id[mid - 1].code) + if (code <= table->id[mid].code && + code > table->id[mid - 1].code) break; - else if (code > table.id[mid].code) + else if (code > table->id[mid].code) low = mid + 1; else high = mid - 1; @@ -477,7 +477,7 @@ static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code, break; default: pr_err("%s: invalid conversion table, mode=%d\n", - __func__, table.mode); + __func__, table->mode); return -EINVAL; } @@ -487,10 +487,10 @@ static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code, * temperature between 2 table entries is linear and interpolate * to produce less granular result. */ - num = table.id[mid].temp - table.id[mid - 1].temp; - num *= abs(table.id[mid - 1].code - code); - denom = abs(table.id[mid - 1].code - table.id[mid].code); - *temp = table.id[mid - 1].temp + (num / denom); + num = table->id[mid].temp - table->id[mid - 1].temp; + num *= abs(table->id[mid - 1].code - code); + denom = abs(table->id[mid - 1].code - table->id[mid].code); + *temp = table->id[mid - 1].temp + (num / denom); return 0; } @@ -646,7 +646,7 @@ static void rk_tsadcv3_control(void __iomem *regs, bool enable) writel_relaxed(val, regs + TSADCV2_AUTO_CON); } -static int rk_tsadcv2_get_temp(struct chip_tsadc_table table, +static int rk_tsadcv2_get_temp(const struct chip_tsadc_table *table, int chn, void __iomem *regs, int *temp) { u32 val; @@ -656,17 +656,17 @@ static int rk_tsadcv2_get_temp(struct chip_tsadc_table table, return rk_tsadcv2_code_to_temp(table, val, temp); } -static void rk_tsadcv2_alarm_temp(struct chip_tsadc_table table, +static void rk_tsadcv2_alarm_temp(const struct chip_tsadc_table *table, int chn, void __iomem *regs, int temp) { u32 alarm_value, int_en; /* Make sure the value is valid */ alarm_value = rk_tsadcv2_temp_to_code(table, temp); - if (alarm_value == table.data_mask) + if (alarm_value == table->data_mask) return; - writel_relaxed(alarm_value & table.data_mask, + writel_relaxed(alarm_value & table->data_mask, regs + TSADCV2_COMP_INT(chn)); int_en = readl_relaxed(regs + TSADCV2_INT_EN); @@ -674,14 +674,14 @@ static void rk_tsadcv2_alarm_temp(struct chip_tsadc_table table, writel_relaxed(int_en, regs + TSADCV2_INT_EN); } -static void rk_tsadcv2_tshut_temp(struct chip_tsadc_table table, +static void rk_tsadcv2_tshut_temp(const struct chip_tsadc_table *table, int chn, void __iomem *regs, int temp) { u32 tshut_value, val; /* Make sure the value is valid */ tshut_value = rk_tsadcv2_temp_to_code(table, temp); - if (tshut_value == table.data_mask) + if (tshut_value == table->data_mask) return; writel_relaxed(tshut_value, regs + TSADCV2_COMP_SHUT(chn)); @@ -891,7 +891,7 @@ static int rockchip_thermal_set_trips(void *_sensor, int low, int high) dev_dbg(&thermal->pdev->dev, "%s: sensor %d: low: %d, high %d\n", __func__, sensor->id, low, high); - tsadc->set_alarm_temp(tsadc->table, + tsadc->set_alarm_temp(&tsadc->table, sensor->id, thermal->regs, high); return 0; @@ -904,7 +904,7 @@ 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(tsadc->table, + 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); @@ -988,7 +988,7 @@ rockchip_thermal_register_sensor(struct platform_device *pdev, int error; tsadc->set_tshut_mode(id, thermal->regs, thermal->tshut_mode); - tsadc->set_tshut_temp(tsadc->table, id, thermal->regs, + tsadc->set_tshut_temp(&tsadc->table, id, thermal->regs, thermal->tshut_temp); sensor->thermal = thermal; @@ -1202,7 +1202,7 @@ 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(thermal->chip->table, + thermal->chip->set_tshut_temp(&thermal->chip->table, id, thermal->regs, thermal->tshut_temp); }
This driver passes struct chip_tsadc_table by value throughout; this is inefficient, and AFAICT, there is no reason for it. Let's pass pointers instead. Signed-off-by: Brian Norris <briannorris@chromium.org> --- drivers/thermal/rockchip_thermal.c | 80 +++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 40 deletions(-)