[PATCH RESEND v3 4/9] thermal: mediatek: lvts: Add platform ops to support alternative conversion logic
Daniel Lezcano
daniel.lezcano at linaro.org
Mon Nov 10 05:06:07 PST 2025
On 10/16/25 16:21, Laura Nao wrote:
> Introduce lvts_platform_ops struct to support SoC-specific versions of
> lvts_raw_to_temp() and lvts_temp_to_raw() conversion functions.
>
> This is in preparation for supporting SoCs like MT8196/MT6991, which
> require a different lvts_temp_to_raw() implementation.
>
> Reviewed-by: Fei Shao <fshao at chromium.org>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> Signed-off-by: Laura Nao <laura.nao at collabora.com>
> ---
> drivers/thermal/mediatek/lvts_thermal.c | 27 ++++++++++++++++++++++---
> 1 file changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/thermal/mediatek/lvts_thermal.c b/drivers/thermal/mediatek/lvts_thermal.c
> index 4ef549386add..df1c0f059ad0 100644
> --- a/drivers/thermal/mediatek/lvts_thermal.c
> +++ b/drivers/thermal/mediatek/lvts_thermal.c
> @@ -125,8 +125,14 @@ struct lvts_ctrl_data {
> continue; \
> else
>
> +struct lvts_platform_ops {
> + int (*lvts_raw_to_temp)(u32 raw_temp, int temp_factor);
> + u32 (*lvts_temp_to_raw)(int temperature, int temp_factor);
> +};
> +
> struct lvts_data {
> const struct lvts_ctrl_data *lvts_ctrl;
> + const struct lvts_platform_ops *ops;
> const u32 *conn_cmd;
> const u32 *init_cmd;
> int num_cal_offsets;
> @@ -300,6 +306,7 @@ static int lvts_get_temp(struct thermal_zone_device *tz, int *temp)
> struct lvts_ctrl *lvts_ctrl = container_of(lvts_sensor, struct lvts_ctrl,
> sensors[lvts_sensor->id]);
> const struct lvts_data *lvts_data = lvts_ctrl->lvts_data;
> + const struct lvts_platform_ops *ops = lvts_data->ops;
> void __iomem *msr = lvts_sensor->msr;
> u32 value;
> int rc;
> @@ -332,7 +339,7 @@ static int lvts_get_temp(struct thermal_zone_device *tz, int *temp)
> if (rc)
> return -EAGAIN;
>
> - *temp = lvts_raw_to_temp(value & 0xFFFF, lvts_data->temp_factor);
> + *temp = ops->lvts_raw_to_temp(value & 0xFFFF, lvts_data->temp_factor);
Don't do this in each functions. It does not help for the readability.
May be something like:
int lvts_raw_to_temp(u32 raw_temp, const struct lvts_ctrl_data)
{
return data->ops->lvts_temp_to_raw(raw_temp, data->temp_factor);
}
or
int lvts_raw_to_temp(u32 raw_temp, const struct lvts_ctrl_data)
{
int temperature;
if (data->ops->lvts_temp_to_raw)
return data->ops->lvts_temp_to_raw(raw_temp, data->temp_factor);
temperature = ((s64)(raw_temp & 0xFFFF) * temp_factor) >> 14;
temperature += golden_temp_offset;
return temperature;
}
... and get rid of all the lvts_platform_ops_v1
(btw _v1 is confusing, it suggests there multiple versions of the same SoC)
[ ... ]
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
More information about the Linux-mediatek
mailing list