From: Marek Vasut Date: Sat, 6 Sep 2025 00:05:33 +0000 (+0200) Subject: thermal: Convert .get_temp() return value to millicelsius X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0ee639ff5af33342c6c2f4579e210d707abc9bc2;p=thirdparty%2Fu-boot.git thermal: Convert .get_temp() return value to millicelsius Linux kernel .get_temp() callback reports values in millicelsius, U-Boot currently reports them in celsius. Align the two and report in millicelsius. Update drivers accordingly. Update callsites that use thermal_get_temp() as well. The 'temperature' command now reports temperature in millicelsius as well, with additional accuracy. This changes command line ABI slightly. Signed-off-by: Marek Vasut Reviewed-by: Tom Rini Reviewed-by: Quentin Schulz Reviewed-by: David Zang [trini: Update test/cmd/temperature.c] Signed-off-by: Tom Rini --- diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c index 17de9ff98ec..cc215b771ef 100644 --- a/arch/arm/mach-imx/cpu.c +++ b/arch/arm/mach-imx/cpu.c @@ -230,6 +230,7 @@ int print_cpuinfo(void) ret = uclass_get_device(UCLASS_THERMAL, 0, &thermal_dev); if (!ret) { ret = thermal_get_temp(thermal_dev, &cpu_tmp); + cpu_tmp /= 1000; if (!ret) printf(" at %dC", cpu_tmp); diff --git a/arch/arm/mach-imx/imx8ulp/soc.c b/arch/arm/mach-imx/imx8ulp/soc.c index 7640f9b84da..04c6f064130 100644 --- a/arch/arm/mach-imx/imx8ulp/soc.c +++ b/arch/arm/mach-imx/imx8ulp/soc.c @@ -279,7 +279,7 @@ int print_cpuinfo(void) if (!ret) { ret = thermal_get_temp(udev, &temp); if (!ret) - printf("CPU current temperature: %dC\n", temp); + printf("CPU current temperature: %dC\n", temp / 1000); else debug(" - failed to get CPU current temperature\n"); } else { diff --git a/cmd/temperature.c b/cmd/temperature.c index 41e422fc937..c145d019364 100644 --- a/cmd/temperature.c +++ b/cmd/temperature.c @@ -32,7 +32,7 @@ static int do_get(struct cmd_tbl *cmdtp, int flag, int argc, if (ret) return CMD_RET_FAILURE; - printf("%s: %d C\n", dev->name, temp); + printf("%s: %d mC\n", dev->name, temp); return CMD_RET_SUCCESS; } diff --git a/drivers/cpu/imx8_cpu.c b/drivers/cpu/imx8_cpu.c index 630919a3642..5f17122c36c 100644 --- a/drivers/cpu/imx8_cpu.c +++ b/drivers/cpu/imx8_cpu.c @@ -192,7 +192,7 @@ static int cpu_imx_get_temp(struct cpu_imx_plat *plat) return 0xdeadbeef; } - return cpu_tmp; + return cpu_tmp / 1000; } #else static int cpu_imx_get_temp(struct cpu_imx_plat *plat) diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c index 92bc72b267c..ae742080643 100644 --- a/drivers/mmc/omap_hsmmc.c +++ b/drivers/mmc/omap_hsmmc.c @@ -651,6 +651,7 @@ static int omap_hsmmc_execute_tuning(struct udevice *dev, uint opcode) printf("Couldn't get temperature for tuning\n"); return ret; } + temperature /= 1000; val = readl(&mmc_base->dll); val |= DLL_SWT; writel(val, &mmc_base->dll); diff --git a/drivers/thermal/imx_scu_thermal.c b/drivers/thermal/imx_scu_thermal.c index fc2b0e227b2..6b0b1d10d9d 100644 --- a/drivers/thermal/imx_scu_thermal.c +++ b/drivers/thermal/imx_scu_thermal.c @@ -72,7 +72,7 @@ int imx_sc_thermal_get_temp(struct udevice *dev, int *temp) break; } - *temp = cpu_temp / 1000; + *temp = cpu_temp; return 0; } diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c index ea1fcc3dcb2..d04035950ee 100644 --- a/drivers/thermal/imx_thermal.c +++ b/drivers/thermal/imx_thermal.c @@ -223,7 +223,7 @@ int imx_thermal_get_temp(struct udevice *dev, int *temp) cpu_tmp = read_cpu_temperature(dev); } - *temp = cpu_tmp; + *temp = cpu_tmp * 1000; return 0; } diff --git a/drivers/thermal/imx_tmu.c b/drivers/thermal/imx_tmu.c index 70d002aee25..51a072e23c6 100644 --- a/drivers/thermal/imx_tmu.c +++ b/drivers/thermal/imx_tmu.c @@ -245,7 +245,7 @@ int imx_tmu_get_temp(struct udevice *dev, int *temp) return ret; } - *temp = cpu_tmp / 1000; + *temp = cpu_tmp; return 0; } diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c index 522337c8395..45e590535a0 100644 --- a/drivers/thermal/rcar_gen3_thermal.c +++ b/drivers/thermal/rcar_gen3_thermal.c @@ -160,7 +160,7 @@ static int rcar_gen3_thermal_get_temp(struct udevice *dev, int *temp) const struct equation_set_coef *coef; int adj, decicelsius, reg, thcode; - /* Read register and convert to degree Celsius */ + /* Read register and convert to millidegree Celsius */ reg = rcar_gen3_thermal_read(tsc, REG_GEN3_TEMP) & CTEMP_MASK; if (reg < tsc->thcode[1]) { @@ -183,8 +183,8 @@ static int rcar_gen3_thermal_get_temp(struct udevice *dev, int *temp) /* Guaranteed operating range is -40C to 125C. */ - /* Reporting is done in degree Celsius */ - *temp = (decicelsius * 100 + adj * 1000) / 1000; + /* Reporting is done in millidegree Celsius */ + *temp = decicelsius * 100 + adj * 1000; return 0; } diff --git a/drivers/thermal/thermal_sandbox.c b/drivers/thermal/thermal_sandbox.c index b7c567d76cd..2e1f1559e53 100644 --- a/drivers/thermal/thermal_sandbox.c +++ b/drivers/thermal/thermal_sandbox.c @@ -12,7 +12,7 @@ static int sandbox_thermal_get_temp(struct udevice *dev, int *temp) { /* Simply return 100 deg C */ - *temp = 100; + *temp = 100 * 1000; return 0; } diff --git a/drivers/thermal/ti-bandgap.c b/drivers/thermal/ti-bandgap.c index 0ea17a909dd..dc869f108e4 100644 --- a/drivers/thermal/ti-bandgap.c +++ b/drivers/thermal/ti-bandgap.c @@ -163,7 +163,7 @@ static int ti_bandgap_get_temp(struct udevice *dev, int *temp) struct ti_bandgap *bgp = dev_get_priv(dev); bgp->adc_val = 0x3ff & readl(bgp->base + CTRL_CORE_TEMP_SENSOR_MPU); - *temp = dra752_adc_to_temp[bgp->adc_val - DRA752_ADC_START_VALUE]; + *temp = dra752_adc_to_temp[bgp->adc_val - DRA752_ADC_START_VALUE] * 1000; return 0; } diff --git a/drivers/thermal/ti-lm74.c b/drivers/thermal/ti-lm74.c index 0310d3330c0..104c27429f4 100644 --- a/drivers/thermal/ti-lm74.c +++ b/drivers/thermal/ti-lm74.c @@ -28,7 +28,7 @@ static int ti_lm74_get_temp(struct udevice *dev, int *temp) raw = ((buf[0] << 8) + buf[1]) >> 3; - *temp = (((int)raw * 125) + 1000) / 2000; + *temp = (((int)raw * 125) + 1000) / 2; return 0; } diff --git a/include/thermal.h b/include/thermal.h index 52a3317fd54..74b1c62466b 100644 --- a/include/thermal.h +++ b/include/thermal.h @@ -25,7 +25,7 @@ struct dm_thermal_ops { * It will enable and initialize any Thermal hardware as necessary. * * @dev: The Thermal device - * @temp: pointer that returns the measured temperature + * @temp: pointer that returns the measured temperature in millidegree Celsius */ int (*get_temp)(struct udevice *dev, int *temp); }; diff --git a/test/cmd/temperature.c b/test/cmd/temperature.c index 309693aa1e8..464d055b94d 100644 --- a/test/cmd/temperature.c +++ b/test/cmd/temperature.c @@ -27,7 +27,7 @@ static int dm_test_cmd_temperature(struct unit_test_state *uts) /* Test that "temperature get thermal" returns expected value */ console_record_reset(); ut_assertok(run_command("temperature get thermal", 0)); - ut_assert_nextline("thermal: 100 C"); + ut_assert_nextline("thermal: 100000 mC"); ut_assert_console_end(); return 0;