* [PATCH v8 0/3] thermal: imx: Add calibration offset support
@ 2026-07-14 10:28 Haoning CHENG via B4 Relay
2026-07-14 10:28 ` [PATCH v8 1/3] dt-bindings: thermal: imx: Document calibration offset property Haoning CHENG via B4 Relay
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Haoning CHENG via B4 Relay @ 2026-07-14 10:28 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, Krzysztof Kozlowski
Some i.MX boards need a small per-design correction to align the
reported CPU temperature with board-level measurements. This series
adds an optional DT property to specify such a calibration offset
and implements the corresponding support in the imx_thermal driver.
Patch 1 documents the new fsl,temp-calibration-offset-millicelsius
property in the i.MX thermal DT binding. The range is limited to
±20 °C because a temperature sensor with such a high deviation
would be unusable.
Patch 2 fixes the i.MX7D alarm temperature conversion to use
ceiling division (DIV_ROUND_UP() for non-negative, plain /
for negative) and clamp() to stay within the 9-bit register range.
Patch 3 reads this property in the imx_thermal driver and applies
the offset to the i.MX6/6SX/7D calibration formulas. Out-of-range
values are rejected with -EINVAL at probe time. When the property
is absent, the default offset remains 0, preserving the current
behavior.
Signed-off-by: Haoning CHENG <Haoning.CHENG@cn.bosch.com>
---
Changes in v8:
- binding: s/behaviour/behavior/ (Lukasz)
- New prep patch: use ceiling division (DIV_ROUND_UP() for non-negative, plain /
for negative) and clamp() for i.MX7D, extracted into a separate patch (Frank)
- driver commit message: add offset mechanism explanation with a +3000 m°C calculation example (Lukasz)
- probe: reject out-of-range offset with -EINVAL instead of silently clamping (Lukasz)
- prep patch: handle negative alarm_temp with plain division (C rounds toward zero)
- Link to v7: https://patch.msgid.link/20260713-b4-symana21-11221-imx-thermal-support-upstream-6-18-v7-0-09b6b7669be1@cn.bosch.com
Changes in v7:
- Align the author name with the Signed-off-by trailer.
- Link to v6: https://patch.msgid.link/20260713-b4-symana21-11221-imx-thermal-support-upstream-6-18-v6-0-88a378faeca5@cn.bosch.com
Changes in v6:
- Align the author name with the Signed-off-by trailer.
- Link to v5: https://patch.msgid.link/20260713-b4-symana21-11221-imx-thermal-support-upstream-6-18-v5-0-69405c306c6b@cn.bosch.com
Changes in v5:
- Move calibration offset application out of c2 initialization, instead
apply it in imx_get_temp(), imx_set_alarm_temp() and imx_set_panic_temp()
for consistent style across i.MX6 and i.MX7D
- Subtract calibration offset from alarm_temp before the if-else block in
imx_set_alarm_temp(), simplifying both SoC branches (Frank's suggestion)
- Link to v4: https://patch.msgid.link/20260710-b4-symana21-11221-imx-thermal-support-upstream-6-18-v4-0-1fef97d1c750@cn.bosch.com
Changes in v4:
- dt-bindings: drop maxItems to allow minimum/maximum constraints for
temp-calibration-offset-millicelsius
- Link to v3: https://patch.msgid.link/20260710-b4-symana21-11221-imx-thermal-support-upstream-6-18-v3-0-db9fc2947c55@cn.bosch.com
Changes in v3:
- dt-bindings: add minimum/maximum (-28580/+28580) for
temp-calibration-offset-millicelsius, as suggested by Conor Dooley
- Link to v2: https://patch.msgid.link/20260709-b4-symana21-11221-imx-thermal-support-upstream-6-18-v2-0-00ff72495e24@cn.bosch.com
Changes in v2:
- dt-bindings: Removed explicit `$ref: /schemas/types.yaml#/definitions/int32`
for fsl,temp-calibration-offset-millicelsius; the `-millicelsius` suffix
already resolves to int32-array via property-units.yaml (Rob).
- dt-bindings: Fixed example indentation.
- driver: Replaced C integer division (/) with DIV_ROUND_CLOSEST() in
imx_set_alarm_temp() to prevent off-by-one alarm threshold mismatch that
could cause IRQ storms on i.MX7D.
- driver: Added clamp() bounds check for alarm_value [0, 0x1ff] to avoid
corrupting adjacent register fields (PANIC_ALARM).
- Link to v1: https://patch.msgid.link/20260709-b4-symana21-11221-imx-thermal-support-upstream-6-18-v1-0-00f88f42930b@cn.bosch.com
To: "Rafael J. Wysocki" <rafael@kernel.org>
To: Daniel Lezcano <daniel.lezcano@linaro.org>
To: Zhang Rui <rui.zhang@intel.com>
To: Lukasz Luba <lukasz.luba@arm.com>
To: Rob Herring <robh@kernel.org>
To: Krzysztof Kozlowski <krzk+dt@kernel.org>
To: Conor Dooley <conor+dt@kernel.org>
To: Shawn Guo <shawnguo@kernel.org>
To: Sascha Hauer <s.hauer@pengutronix.de>
To: Pengutronix Kernel Team <kernel@pengutronix.de>
To: Fabio Estevam <festevam@gmail.com>
Cc: linux-pm@vger.kernel.org
Cc: devicetree@vger.kernel.org
Cc: imx@lists.linux.dev
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
---
Haoning CHENG (3):
dt-bindings: thermal: imx: Document calibration offset property
thermal/drivers/imx: Fix rounding and clamp for i.MX7D alarm
thermal/drivers/imx: Add calibration offset support
.../devicetree/bindings/thermal/imx-thermal.yaml | 11 ++++++
drivers/thermal/imx_thermal.c | 39 ++++++++++++++++++++--
2 files changed, 47 insertions(+), 3 deletions(-)
---
base-commit: c50a940dcde35c647e097e89a9150003abd48329
change-id: 20260709-b4-symana21-11221-imx-thermal-support-upstream-6-18-a084984deb76
Best regards,
--
Haoning CHENG <Haoning.CHENG@cn.bosch.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v8 1/3] dt-bindings: thermal: imx: Document calibration offset property
2026-07-14 10:28 [PATCH v8 0/3] thermal: imx: Add calibration offset support Haoning CHENG via B4 Relay
@ 2026-07-14 10:28 ` Haoning CHENG via B4 Relay
2026-07-14 10:28 ` [PATCH v8 2/3] thermal/drivers/imx: Fix rounding and clamp for i.MX7D alarm Haoning CHENG via B4 Relay
2026-07-14 10:28 ` [PATCH v8 3/3] thermal/drivers/imx: Add calibration offset support Haoning CHENG via B4 Relay
2 siblings, 0 replies; 6+ messages in thread
From: Haoning CHENG via B4 Relay @ 2026-07-14 10:28 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, Krzysztof Kozlowski
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 behavior is kept
when it is omitted.
Update the binding example to show its usage.
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Signed-off-by: Haoning CHENG <Haoning.CHENG@cn.bosch.com>
---
Documentation/devicetree/bindings/thermal/imx-thermal.yaml | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/Documentation/devicetree/bindings/thermal/imx-thermal.yaml b/Documentation/devicetree/bindings/thermal/imx-thermal.yaml
index 949b154856c5..44365aac8115 100644
--- a/Documentation/devicetree/bindings/thermal/imx-thermal.yaml
+++ b/Documentation/devicetree/bindings/thermal/imx-thermal.yaml
@@ -59,6 +59,16 @@ properties:
clocks:
maxItems: 1
+ fsl,temp-calibration-offset-millicelsius:
+ minimum: -20000
+ maximum: 20000
+ description:
+ A signed calibration offset, in millicelsius, added to the calculated
+ sensor temperature to compensate for board-level measurement
+ differences. The range is limited to ±20 °C because a temperature
+ sensor with such a high deviation would be unusable. When absent,
+ no offset is applied.
+
"#thermal-sensor-cells":
const: 0
@@ -109,6 +119,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] 6+ messages in thread
* [PATCH v8 2/3] thermal/drivers/imx: Fix rounding and clamp for i.MX7D alarm
2026-07-14 10:28 [PATCH v8 0/3] thermal: imx: Add calibration offset support Haoning CHENG via B4 Relay
2026-07-14 10:28 ` [PATCH v8 1/3] dt-bindings: thermal: imx: Document calibration offset property Haoning CHENG via B4 Relay
@ 2026-07-14 10:28 ` Haoning CHENG via B4 Relay
2026-07-14 14:29 ` Frank Li
2026-07-14 10:28 ` [PATCH v8 3/3] thermal/drivers/imx: Add calibration offset support Haoning CHENG via B4 Relay
2 siblings, 1 reply; 6+ messages in thread
From: Haoning CHENG via B4 Relay @ 2026-07-14 10:28 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>
Convert the alarm temperature from millicelsius to degrees for i.MX7D
using ceiling division instead of integer division, ensuring rounding
errors do not cause the alarm to trigger below the intended threshold.
Use DIV_ROUND_UP() for non-negative values and plain integer division
for negative values, since C rounds toward zero which is equivalent to
ceiling when the divisor is positive.
Add clamp() to ensure the hardware register value stays within the 9-bit
range (0..0x1ff) of the i.MX7D alarm field, preventing silent truncation
if an out-of-range value is written.
Signed-off-by: Haoning CHENG <Haoning.CHENG@cn.bosch.com>
---
drivers/thermal/imx_thermal.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
index 38c993d1bcb3..7f7d1116b9d6 100644
--- a/drivers/thermal/imx_thermal.c
+++ b/drivers/thermal/imx_thermal.c
@@ -240,10 +240,16 @@ 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;
- else
+ if (data->socdata->version == TEMPMON_IMX7D) {
+ if (alarm_temp >= 0)
+ alarm_temp = DIV_ROUND_UP(alarm_temp, 1000);
+ else
+ alarm_temp /= 1000;
+ alarm_value = alarm_temp + data->c1 - 25;
+ alarm_value = clamp(alarm_value, 0, 0x1ff);
+ } else {
alarm_value = (data->c2 - alarm_temp) / data->c1;
+ }
regmap_write(map, soc_data->high_alarm_ctrl + REG_CLR,
soc_data->high_alarm_mask);
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v8 3/3] thermal/drivers/imx: Add calibration offset support
2026-07-14 10:28 [PATCH v8 0/3] thermal: imx: Add calibration offset support Haoning CHENG via B4 Relay
2026-07-14 10:28 ` [PATCH v8 1/3] dt-bindings: thermal: imx: Document calibration offset property Haoning CHENG via B4 Relay
2026-07-14 10:28 ` [PATCH v8 2/3] thermal/drivers/imx: Fix rounding and clamp for i.MX7D alarm Haoning CHENG via B4 Relay
@ 2026-07-14 10:28 ` Haoning CHENG via B4 Relay
2026-07-14 14:35 ` Frank Li
2 siblings, 1 reply; 6+ messages in thread
From: Haoning CHENG via B4 Relay @ 2026-07-14 10:28 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
uniformly to the i.MX6/6SX/7D calibration formulas.
The offset is applied symmetrically at two points to ensure the thermal
framework sees calibrated temperatures while hardware thresholds remain
correctly positioned:
1. In imx_set_alarm_temp() and imx_set_panic_temp(): the temperature
threshold is *subtracted* by the offset before being converted to a
hardware register value. This shifts the hardware IRQ trigger to the
physical temperature that corresponds to the intended threshold.
2. In imx_get_temp(): after computing physical temperature from the
hardware register, the offset is *added* back. The thermal framework
always sees the calibrated temperature.
For example, if DT sets offset = +3000 m°C (board reads 3°C too low)
and the passive trip is 95°C:
imx_set_alarm_temp(95000):
alarm_temp = 95000 - 3000 = 92000
→ hardware register programmed for 92°C physical
Hardware IRQ fires at 92°C physical
imx_get_temp():
reads hardware, computes 92°C physical
*temp = 92000 + 3000 = 95000
→ thermal framework sees 95°C → correct trip
When the property is not present, the offset defaults to 0, preserving
the current behavior.
Signed-off-by: Haoning CHENG <Haoning.CHENG@cn.bosch.com>
---
drivers/thermal/imx_thermal.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
index 7f7d1116b9d6..d471acc16bce 100644
--- a/drivers/thermal/imx_thermal.c
+++ b/drivers/thermal/imx_thermal.c
@@ -85,6 +85,10 @@ enum imx_thermal_trip {
#define TEMPMON_IMX6SX 2
#define TEMPMON_IMX7D 3
+/* Calibration offset limits (±20 °C in millicelsius) */
+#define IMX_TEMP_CALIB_OFFSET_MIN (-20000)
+#define IMX_TEMP_CALIB_OFFSET_MAX 20000
+
struct thermal_soc_data {
u32 version;
@@ -207,6 +211,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;
@@ -223,6 +228,7 @@ static void imx_set_panic_temp(struct imx_thermal_data *data,
struct regmap *map = data->tempmon;
int critical_value;
+ panic_temp -= data->calibration_offset;
critical_value = (data->c2 - panic_temp) / data->c1;
regmap_write(map, soc_data->panic_alarm_ctrl + REG_CLR,
@@ -239,6 +245,7 @@ static void imx_set_alarm_temp(struct imx_thermal_data *data,
int alarm_value;
data->alarm_temp = alarm_temp;
+ alarm_temp -= data->calibration_offset;
if (data->socdata->version == TEMPMON_IMX7D) {
if (alarm_temp >= 0)
@@ -283,6 +290,7 @@ static int imx_get_temp(struct thermal_zone_device *tz, int *temp)
*temp = (n_meas - data->c1 + 25) * 1000;
else
*temp = data->c2 - n_meas * data->c1;
+ *temp += data->calibration_offset;
/* Update alarm value to next higher trip point for TEMPMON_IMX6Q */
if (data->socdata->version == TEMPMON_IMX6Q) {
@@ -635,6 +643,25 @@ static int imx_thermal_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, data);
+ if (of_property_present(dev->of_node,
+ "fsl,temp-calibration-offset-millicelsius")) {
+ ret = of_property_read_s32(dev->of_node,
+ "fsl,temp-calibration-offset-millicelsius",
+ &data->calibration_offset);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "failed to read calibration offset\n");
+
+ if (data->calibration_offset < IMX_TEMP_CALIB_OFFSET_MIN ||
+ data->calibration_offset > IMX_TEMP_CALIB_OFFSET_MAX)
+ return dev_err_probe(dev, -EINVAL,
+ "calibration offset %d millicelsius out of range\n",
+ data->calibration_offset);
+
+ dev_dbg(dev, "calibration offset: %d millicelsius\n",
+ 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] 6+ messages in thread
* Re: [PATCH v8 2/3] thermal/drivers/imx: Fix rounding and clamp for i.MX7D alarm
2026-07-14 10:28 ` [PATCH v8 2/3] thermal/drivers/imx: Fix rounding and clamp for i.MX7D alarm Haoning CHENG via B4 Relay
@ 2026-07-14 14:29 ` Frank Li
0 siblings, 0 replies; 6+ messages in thread
From: Frank Li @ 2026-07-14 14:29 UTC (permalink / raw)
To: Haoning.CHENG
Cc: Rafael J. Wysocki, Daniel Lezcano, Zhang Rui, Lukasz Luba,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, linux-pm,
devicetree, imx, linux-arm-kernel, linux-kernel
On Tue, Jul 14, 2026 at 06:28:42PM +0800, Haoning CHENG via B4 Relay wrote:
> From: Haoning CHENG <Haoning.CHENG@cn.bosch.com>
>
> Convert the alarm temperature from millicelsius to degrees for i.MX7D
> using ceiling division instead of integer division, ensuring rounding
> errors do not cause the alarm to trigger below the intended threshold.
> Use DIV_ROUND_UP() for non-negative values and plain integer division
> for negative values, since C rounds toward zero which is equivalent to
> ceiling when the divisor is positive.
>
> Add clamp() to ensure the hardware register value stays within the 9-bit
> range (0..0x1ff) of the i.MX7D alarm field, preventing silent truncation
> if an out-of-range value is written.
>
> Signed-off-by: Haoning CHENG <Haoning.CHENG@cn.bosch.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/thermal/imx_thermal.c | 12 +++++++++---
> 1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
> index 38c993d1bcb3..7f7d1116b9d6 100644
> --- a/drivers/thermal/imx_thermal.c
> +++ b/drivers/thermal/imx_thermal.c
> @@ -240,10 +240,16 @@ 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;
> - else
> + if (data->socdata->version == TEMPMON_IMX7D) {
> + if (alarm_temp >= 0)
> + alarm_temp = DIV_ROUND_UP(alarm_temp, 1000);
> + else
> + alarm_temp /= 1000;
> + alarm_value = alarm_temp + data->c1 - 25;
> + alarm_value = clamp(alarm_value, 0, 0x1ff);
> + } else {
> alarm_value = (data->c2 - alarm_temp) / data->c1;
> + }
>
> regmap_write(map, soc_data->high_alarm_ctrl + REG_CLR,
> soc_data->high_alarm_mask);
>
> --
> 2.43.0
>
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v8 3/3] thermal/drivers/imx: Add calibration offset support
2026-07-14 10:28 ` [PATCH v8 3/3] thermal/drivers/imx: Add calibration offset support Haoning CHENG via B4 Relay
@ 2026-07-14 14:35 ` Frank Li
0 siblings, 0 replies; 6+ messages in thread
From: Frank Li @ 2026-07-14 14:35 UTC (permalink / raw)
To: Haoning.CHENG
Cc: Rafael J. Wysocki, Daniel Lezcano, Zhang Rui, Lukasz Luba,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, linux-pm,
devicetree, imx, linux-arm-kernel, linux-kernel
On Tue, Jul 14, 2026 at 06:28:43PM +0800, Haoning CHENG via B4 Relay wrote:
> 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
> uniformly to the i.MX6/6SX/7D calibration formulas.
>
> The offset is applied symmetrically at two points to ensure the thermal
> framework sees calibrated temperatures while hardware thresholds remain
> correctly positioned:
>
> 1. In imx_set_alarm_temp() and imx_set_panic_temp(): the temperature
> threshold is *subtracted* by the offset before being converted to a
> hardware register value. This shifts the hardware IRQ trigger to the
> physical temperature that corresponds to the intended threshold.
>
> 2. In imx_get_temp(): after computing physical temperature from the
> hardware register, the offset is *added* back. The thermal framework
> always sees the calibrated temperature.
>
> For example, if DT sets offset = +3000 m°C (board reads 3°C too low)
> and the passive trip is 95°C:
>
> imx_set_alarm_temp(95000):
> alarm_temp = 95000 - 3000 = 92000
> → hardware register programmed for 92°C physical
>
> Hardware IRQ fires at 92°C physical
>
> imx_get_temp():
> reads hardware, computes 92°C physical
> *temp = 92000 + 3000 = 95000
> → thermal framework sees 95°C → correct trip
>
> When the property is not present, the offset defaults to 0, preserving
> the current behavior.
>
> Signed-off-by: Haoning CHENG <Haoning.CHENG@cn.bosch.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/thermal/imx_thermal.c | 27 +++++++++++++++++++++++++++
> 1 file changed, 27 insertions(+)
>
> diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
> index 7f7d1116b9d6..d471acc16bce 100644
> --- a/drivers/thermal/imx_thermal.c
> +++ b/drivers/thermal/imx_thermal.c
> @@ -85,6 +85,10 @@ enum imx_thermal_trip {
> #define TEMPMON_IMX6SX 2
> #define TEMPMON_IMX7D 3
>
> +/* Calibration offset limits (±20 °C in millicelsius) */
> +#define IMX_TEMP_CALIB_OFFSET_MIN (-20000)
> +#define IMX_TEMP_CALIB_OFFSET_MAX 20000
> +
> struct thermal_soc_data {
> u32 version;
>
> @@ -207,6 +211,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;
> @@ -223,6 +228,7 @@ static void imx_set_panic_temp(struct imx_thermal_data *data,
> struct regmap *map = data->tempmon;
> int critical_value;
>
> + panic_temp -= data->calibration_offset;
> critical_value = (data->c2 - panic_temp) / data->c1;
>
> regmap_write(map, soc_data->panic_alarm_ctrl + REG_CLR,
> @@ -239,6 +245,7 @@ static void imx_set_alarm_temp(struct imx_thermal_data *data,
> int alarm_value;
>
> data->alarm_temp = alarm_temp;
> + alarm_temp -= data->calibration_offset;
>
> if (data->socdata->version == TEMPMON_IMX7D) {
> if (alarm_temp >= 0)
> @@ -283,6 +290,7 @@ static int imx_get_temp(struct thermal_zone_device *tz, int *temp)
> *temp = (n_meas - data->c1 + 25) * 1000;
> else
> *temp = data->c2 - n_meas * data->c1;
> + *temp += data->calibration_offset;
>
> /* Update alarm value to next higher trip point for TEMPMON_IMX6Q */
> if (data->socdata->version == TEMPMON_IMX6Q) {
> @@ -635,6 +643,25 @@ static int imx_thermal_probe(struct platform_device *pdev)
>
> platform_set_drvdata(pdev, data);
>
> + if (of_property_present(dev->of_node,
> + "fsl,temp-calibration-offset-millicelsius")) {
> + ret = of_property_read_s32(dev->of_node,
> + "fsl,temp-calibration-offset-millicelsius",
> + &data->calibration_offset);
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "failed to read calibration offset\n");
> +
> + if (data->calibration_offset < IMX_TEMP_CALIB_OFFSET_MIN ||
> + data->calibration_offset > IMX_TEMP_CALIB_OFFSET_MAX)
> + return dev_err_probe(dev, -EINVAL,
> + "calibration offset %d millicelsius out of range\n",
> + data->calibration_offset);
> +
> + dev_dbg(dev, "calibration offset: %d millicelsius\n",
> + 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 [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-07-14 14:35 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-14 10:28 [PATCH v8 0/3] thermal: imx: Add calibration offset support Haoning CHENG via B4 Relay
2026-07-14 10:28 ` [PATCH v8 1/3] dt-bindings: thermal: imx: Document calibration offset property Haoning CHENG via B4 Relay
2026-07-14 10:28 ` [PATCH v8 2/3] thermal/drivers/imx: Fix rounding and clamp for i.MX7D alarm Haoning CHENG via B4 Relay
2026-07-14 14:29 ` Frank Li
2026-07-14 10:28 ` [PATCH v8 3/3] thermal/drivers/imx: Add calibration offset support Haoning CHENG via B4 Relay
2026-07-14 14:35 ` Frank Li
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox