* [PATCH 1/2] dt-bindings: thermal: imx: Document calibration offset property
2026-07-09 5:43 [PATCH 0/2] thermal: imx: Add calibration offset support HaoNing Cheng via B4 Relay
@ 2026-07-09 5:43 ` HaoNing Cheng via B4 Relay
2026-07-09 6:26 ` Rob Herring (Arm)
2026-07-09 5:43 ` [PATCH 2/2] thermal/drivers/imx: Add calibration offset support HaoNing Cheng via B4 Relay
1 sibling, 1 reply; 4+ messages in thread
From: HaoNing Cheng via B4 Relay @ 2026-07-09 5:43 UTC (permalink / raw)
To: Rafael J. Wysocki, Daniel Lezcano, Zhang Rui, Lukasz Luba,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam
Cc: linux-pm, devicetree, imx, linux-arm-kernel, linux-kernel,
Haoning CHENG
From: HaoNing Cheng <Haoning.CHENG@cn.bosch.com>
Some boards need a small per-design correction to align the reported CPU
temperature with board-level measurements.
Document the optional fsl,temp-calibration-offset-millicelsius property,
a signed offset in millicelsius that is added to the calculated sensor
temperature. The property is optional and the existing behaviour is kept
when it is omitted.
Update the binding example to show its usage.
Signed-off-by: HaoNing Cheng <Haoning.CHENG@cn.bosch.com>
---
Documentation/devicetree/bindings/thermal/imx-thermal.yaml | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/Documentation/devicetree/bindings/thermal/imx-thermal.yaml b/Documentation/devicetree/bindings/thermal/imx-thermal.yaml
index 949b154856c5..29bdcb921a96 100644
--- a/Documentation/devicetree/bindings/thermal/imx-thermal.yaml
+++ b/Documentation/devicetree/bindings/thermal/imx-thermal.yaml
@@ -59,6 +59,13 @@ properties:
clocks:
maxItems: 1
+ fsl,temp-calibration-offset-millicelsius:
+ description:
+ A signed calibration offset, in millicelsius, added to the calculated
+ sensor temperature to compensate for board-level measurement
+ differences. When absent, no offset is applied.
+ $ref: /schemas/types.yaml#/definitions/int32
+
"#thermal-sensor-cells":
const: 0
@@ -109,6 +116,7 @@ examples:
nvmem-cells = <&tempmon_calib>, <&tempmon_temp_grade>;
nvmem-cell-names = "calib", "temp_grade";
clocks = <&clks IMX6SX_CLK_PLL3_USB_OTG>;
+ fsl,temp-calibration-offset-millicelsius = <(-6400)>;
#thermal-sensor-cells = <0>;
};
};
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH 2/2] thermal/drivers/imx: Add calibration offset support
2026-07-09 5:43 [PATCH 0/2] thermal: imx: Add calibration offset support HaoNing Cheng via B4 Relay
2026-07-09 5:43 ` [PATCH 1/2] dt-bindings: thermal: imx: Document calibration offset property HaoNing Cheng via B4 Relay
@ 2026-07-09 5:43 ` HaoNing Cheng via B4 Relay
1 sibling, 0 replies; 4+ messages in thread
From: HaoNing Cheng via B4 Relay @ 2026-07-09 5:43 UTC (permalink / raw)
To: Rafael J. Wysocki, Daniel Lezcano, Zhang Rui, Lukasz Luba,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam
Cc: linux-pm, devicetree, imx, linux-arm-kernel, linux-kernel,
Haoning CHENG
From: HaoNing Cheng <Haoning.CHENG@cn.bosch.com>
Some boards need a small per-design correction to align the reported CPU
temperature with board-level measurements.
Read the optional fsl,temp-calibration-offset-millicelsius property from
DT and apply it to the i.MX6/6SX/7D calibration formulas. When the
property is not present, the default offset remains 0, preserving the
current behaviour.
Signed-off-by: HaoNing Cheng <Haoning.CHENG@cn.bosch.com>
---
drivers/thermal/imx_thermal.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
index 38c993d1bcb3..c65400b51ed8 100644
--- a/drivers/thermal/imx_thermal.c
+++ b/drivers/thermal/imx_thermal.c
@@ -207,6 +207,7 @@ struct imx_thermal_data {
struct regmap *tempmon;
u32 c1, c2; /* See formula in imx_init_calib() */
int temp_max;
+ s32 calibration_offset;
int alarm_temp;
int last_temp;
bool irq_enabled;
@@ -241,7 +242,7 @@ static void imx_set_alarm_temp(struct imx_thermal_data *data,
data->alarm_temp = alarm_temp;
if (data->socdata->version == TEMPMON_IMX7D)
- alarm_value = alarm_temp / 1000 + data->c1 - 25;
+ alarm_value = (alarm_temp - data->calibration_offset) / 1000 + data->c1 - 25;
else
alarm_value = (data->c2 - alarm_temp) / data->c1;
@@ -274,7 +275,7 @@ static int imx_get_temp(struct thermal_zone_device *tz, int *temp)
/* See imx_init_calib() for formula derivation */
if (data->socdata->version == TEMPMON_IMX7D)
- *temp = (n_meas - data->c1 + 25) * 1000;
+ *temp = (n_meas - data->c1 + 25) * 1000 + data->calibration_offset;
else
*temp = data->c2 - n_meas * data->c1;
@@ -413,7 +414,7 @@ static int imx_init_calib(struct platform_device *pdev, u32 ocotp_ana1)
temp64 *= 1000; /* to get result in °mC */
do_div(temp64, 15423 * n1 - 4148468);
data->c1 = temp64;
- data->c2 = n1 * data->c1 + 28581;
+ data->c2 = n1 * data->c1 + 28581 + data->calibration_offset;
return 0;
}
@@ -629,6 +630,10 @@ static int imx_thermal_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, data);
+ of_property_read_s32(dev->of_node,
+ "fsl,temp-calibration-offset-millicelsius",
+ &data->calibration_offset);
+
if (of_property_present(dev->of_node, "nvmem-cells")) {
ret = imx_init_from_nvmem_cells(pdev);
if (ret)
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread