* [PATCH v3 0/2] thermal: Add support A9
@ 2026-08-21 7:50 Xianwei Zhao via B4 Relay
2026-08-21 7:50 ` [PATCH v3 1/2] dt-bindings: thermal: amlogic: Add A9 thermal bindings Xianwei Zhao via B4 Relay
2026-08-21 7:50 ` [PATCH v3 2/2] thermal: amlogic: Add support for A9 thermal controller Xianwei Zhao via B4 Relay
0 siblings, 2 replies; 5+ messages in thread
From: Xianwei Zhao via B4 Relay @ 2026-08-21 7:50 UTC (permalink / raw)
To: Guillaume La Roque, Rafael J. Wysocki, Daniel Lezcano, Zhang Rui,
Lukasz Luba, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-pm, linux-amlogic, devicetree, linux-kernel, Xianwei Zhao
Document the thermal controller compatibles for the Amlogic A9 SoC
And add driver support for the Amlogic A9 thermal controller.
Signed-off-by: Xianwei Zhao <xianwei.zhao@amlogic.com>
---
Changes in v3:
- Binding: add restrictive conditions for clock, and remove remove "amlogic,hw-reset-temp" property.
- Driver: add private data reset_temp instead of get value from DTS.
- Link to v2: https://lore.kernel.org/r/20260811-a9-thermal-v2-0-7ddc33b11b9a@amlogic.com
Changes in v2:
- Fix the spelling mistakes (clock-names) and reset-temp properties is visible to old chips.
- Adjust the clock enable sequence in resume func and remove the clock disable in remove func.
- Add the judgment on the divisor zero.
- Add description of support for over-temperature reset for old chips in commit message.
- Link to v1: https://lore.kernel.org/r/20260730-a9-thermal-v1-0-d786d37cba58@amlogic.com
---
Xianwei Zhao (2):
dt-bindings: thermal: amlogic: Add A9 thermal bindings
thermal: amlogic: Add support for A9 thermal controller
.../bindings/thermal/amlogic,thermal.yaml | 27 ++++-
drivers/thermal/amlogic_thermal.c | 113 ++++++++++++++++++++-
2 files changed, 136 insertions(+), 4 deletions(-)
---
base-commit: 78bc8af4affb9a732504eb22eeac7d1e50883853
change-id: 20260703-a9-thermal-f62cef6ea91f
Best regards,
--
Xianwei Zhao <xianwei.zhao@amlogic.com>
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 1/2] dt-bindings: thermal: amlogic: Add A9 thermal bindings
2026-08-21 7:50 [PATCH v3 0/2] thermal: Add support A9 Xianwei Zhao via B4 Relay
@ 2026-08-21 7:50 ` Xianwei Zhao via B4 Relay
2026-08-21 7:57 ` sashiko-bot
2026-08-21 7:50 ` [PATCH v3 2/2] thermal: amlogic: Add support for A9 thermal controller Xianwei Zhao via B4 Relay
1 sibling, 1 reply; 5+ messages in thread
From: Xianwei Zhao via B4 Relay @ 2026-08-21 7:50 UTC (permalink / raw)
To: Guillaume La Roque, Rafael J. Wysocki, Daniel Lezcano, Zhang Rui,
Lukasz Luba, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-pm, linux-amlogic, devicetree, linux-kernel, Xianwei Zhao
From: Xianwei Zhao <xianwei.zhao@amlogic.com>
Document the thermal controller compatibles for the Amlogic A9 SoC.
Describe the required "core" and "plck" clocks, and update the schema
constraints for A9-specific thermal controllers.
Signed-off-by: Xianwei Zhao <xianwei.zhao@amlogic.com>
---
.../bindings/thermal/amlogic,thermal.yaml | 27 +++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/thermal/amlogic,thermal.yaml b/Documentation/devicetree/bindings/thermal/amlogic,thermal.yaml
index 8cfa44dcda58..1b02404d67d5 100644
--- a/Documentation/devicetree/bindings/thermal/amlogic,thermal.yaml
+++ b/Documentation/devicetree/bindings/thermal/amlogic,thermal.yaml
@@ -23,6 +23,7 @@ properties:
- const: amlogic,g12a-thermal
- enum:
- amlogic,a1-cpu-thermal
+ - amlogic,a9-thermal
- amlogic,t7-thermal
reg:
@@ -32,7 +33,13 @@ properties:
maxItems: 1
clocks:
- maxItems: 1
+ minItems: 1
+ maxItems: 2
+
+ clock-names:
+ items:
+ - const: core
+ - const: pclk
power-domains:
maxItems: 1
@@ -73,6 +80,24 @@ allOf:
required:
- amlogic,secure-monitor
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - amlogic,a9-thermal
+ then:
+ properties:
+ clocks:
+ minItems: 2
+ required:
+ - clock-names
+ else:
+ properties:
+ clocks:
+ maxItems: 1
+ clock-names: false
+
unevaluatedProperties: false
examples:
--
2.52.0
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 2/2] thermal: amlogic: Add support for A9 thermal controller
2026-08-21 7:50 [PATCH v3 0/2] thermal: Add support A9 Xianwei Zhao via B4 Relay
2026-08-21 7:50 ` [PATCH v3 1/2] dt-bindings: thermal: amlogic: Add A9 thermal bindings Xianwei Zhao via B4 Relay
@ 2026-08-21 7:50 ` Xianwei Zhao via B4 Relay
2026-08-21 8:01 ` sashiko-bot
1 sibling, 1 reply; 5+ messages in thread
From: Xianwei Zhao via B4 Relay @ 2026-08-21 7:50 UTC (permalink / raw)
To: Guillaume La Roque, Rafael J. Wysocki, Daniel Lezcano, Zhang Rui,
Lukasz Luba, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-pm, linux-amlogic, devicetree, linux-kernel, Xianwei Zhao
From: Xianwei Zhao <xianwei.zhao@amlogic.com>
Add support for the Amlogic A9 thermal controller.
The A9 thermal controller uses different calibration parameters, requires
separate core and bus clocks, and supports a hardware over-temperature
reset mechanism, and restore the hardware reset configuration after resume.
Signed-off-by: Xianwei Zhao <xianwei.zhao@amlogic.com>
---
drivers/thermal/amlogic_thermal.c | 113 +++++++++++++++++++++++++++++++++++++-
1 file changed, 110 insertions(+), 3 deletions(-)
diff --git a/drivers/thermal/amlogic_thermal.c b/drivers/thermal/amlogic_thermal.c
index a0b530624b60..ff8a8b152536 100644
--- a/drivers/thermal/amlogic_thermal.c
+++ b/drivers/thermal/amlogic_thermal.c
@@ -45,6 +45,18 @@
TSENSOR_CFG_REG1_DEM_EN | \
TSENSOR_CFG_REG1_CH_SEL)
+#define TSENSOR_CFG_REG2 0x8
+ #define TSENSOR_CFG_REG2_HITEMP_EN BIT(31)
+ #define TSENSOR_CFG_REG2_REBOOT_EN BIT(30)
+ #define TSENSOR_CFG_REG2_REBOOT_CODE GENMASK(15, 4)
+ #define TSENSOR_CFG_REG2_REBOOT_TIME GENMASK(23, 16)
+ #define TSENSOR_CFG_REG2_ENABLE \
+ (TSENSOR_CFG_REG2_HITEMP_EN | \
+ TSENSOR_CFG_REG2_REBOOT_EN | \
+ TSENSOR_CFG_REG2_REBOOT_TIME)
+
+#define TSENSOR_TEMP_CAL 1
+
#define TSENSOR_STAT0 0x40
#define TSENSOR_STAT9 0x64
@@ -63,6 +75,7 @@
#define TSENSOR_CALIB_OFFSET 1
#define TSENSOR_CALIB_SHIFT 4
+#define TSENSOR_HW_RESET_DEFAULT_TEMP 110000
/**
* struct amlogic_thermal_soc_calib_data
@@ -85,14 +98,18 @@ struct amlogic_thermal_soc_calib_data {
* @u_efuse_off: register offset to read fused calibration value
* @calibration_parameters: calibration parameters structure pointer
* @regmap_config: regmap config for the device
+ * @reset_temp: the hardware-controlled reset temperature value
* @use_sm: read data from secure monitor instead of efuse
+ * @has_sysclk: sensor driver control sysclk
* This structure is required for configuration of amlogic thermal driver.
*/
struct amlogic_thermal_data {
int u_efuse_off;
const struct amlogic_thermal_soc_calib_data *calibration_parameters;
const struct regmap_config *regmap_config;
+ u32 reset_temp;
bool use_sm;
+ bool has_sysclk;
};
struct amlogic_thermal {
@@ -101,8 +118,10 @@ struct amlogic_thermal {
struct regmap *regmap;
struct regmap *sec_ao_map;
struct clk *clk;
+ struct clk *sysclk;
struct thermal_zone_device *tzd;
u32 trim_info;
+ u32 temp_code;
struct meson_sm_firmware *sm_fw;
u32 tsensor_id;
};
@@ -138,6 +157,49 @@ static int amlogic_thermal_code_to_millicelsius(struct amlogic_thermal *pdata,
return temp;
}
+/*
+ * Calculate a temperature code from a temperature value .
+ * The unit of the temperature is degree milliCelsius.
+ */
+static u32 amlogic_thermal_millicelsius_to_code(struct amlogic_thermal *pdata, int millicelsius)
+{
+ const struct amlogic_thermal_soc_calib_data *param =
+ pdata->data->calibration_parameters;
+ s64 factor, uptat, uefuse;
+ u32 temp_code;
+
+ uefuse = pdata->trim_info & TSENSOR_TRIM_SIGN_MASK ?
+ ~(pdata->trim_info & TSENSOR_TRIM_TEMP_MASK) + 1 :
+ (pdata->trim_info & TSENSOR_TRIM_TEMP_MASK);
+
+ factor = param->B + div_s64(millicelsius, 100);
+ factor = BIT(16) * factor;
+ factor = div_s64(factor, param->A);
+ factor = factor - uefuse;
+
+ uptat = param->n * factor;
+ uptat = div_s64(uptat, BIT(16));
+ uptat = param->m - uptat;
+
+ factor = factor * 100;
+ if (!uptat)
+ factor = TSENSOR_TEMP_MASK << 0x4;
+ else
+ factor = div_s64(factor, uptat);
+
+ temp_code = ((factor >> 0x4) & TSENSOR_TEMP_MASK) + TSENSOR_TEMP_CAL;
+
+ return temp_code;
+}
+
+static void amlogic_tsensor_setup_hw_reset(struct amlogic_thermal *data)
+{
+ regmap_update_bits(data->regmap, TSENSOR_CFG_REG2, TSENSOR_CFG_REG2_REBOOT_CODE,
+ data->temp_code << 0x4);
+ regmap_update_bits(data->regmap, TSENSOR_CFG_REG2,
+ TSENSOR_CFG_REG2_ENABLE, TSENSOR_CFG_REG2_ENABLE);
+}
+
static int amlogic_thermal_enable(struct amlogic_thermal *data)
{
int ret;
@@ -254,6 +316,13 @@ static const struct amlogic_thermal_soc_calib_data amlogic_thermal_g12a = {
.n = 324,
};
+static const struct amlogic_thermal_soc_calib_data amlogic_thermal_a9 = {
+ .A = 9164,
+ .B = 2747,
+ .m = 370,
+ .n = 270,
+};
+
static const struct amlogic_thermal_data amlogic_thermal_g12a_cpu_param = {
.u_efuse_off = 0x128,
.calibration_parameters = &amlogic_thermal_g12a,
@@ -272,6 +341,14 @@ static const struct amlogic_thermal_data amlogic_thermal_a1_cpu_param = {
.regmap_config = &amlogic_thermal_regmap_config_g12a,
};
+static const struct amlogic_thermal_data amlogic_thermal_a9_param = {
+ .use_sm = true,
+ .has_sysclk = true,
+ .calibration_parameters = &amlogic_thermal_a9,
+ .regmap_config = &amlogic_thermal_regmap_config_g12a,
+ .reset_temp = 110000,
+};
+
static const struct amlogic_thermal_data amlogic_thermal_t7_param = {
.use_sm = true,
.calibration_parameters = &amlogic_thermal_g12a,
@@ -291,6 +368,10 @@ static const struct of_device_id of_amlogic_thermal_match[] = {
.compatible = "amlogic,a1-cpu-thermal",
.data = &amlogic_thermal_a1_cpu_param,
},
+ {
+ .compatible = "amlogic,a9-thermal",
+ .data = &amlogic_thermal_a9_param,
+ },
{
.compatible = "amlogic,t7-thermal",
.data = &amlogic_thermal_t7_param,
@@ -305,6 +386,7 @@ static int amlogic_thermal_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
void __iomem *base;
int ret;
+ u32 reset_temp;
pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata)
@@ -323,9 +405,18 @@ static int amlogic_thermal_probe(struct platform_device *pdev)
if (IS_ERR(pdata->regmap))
return PTR_ERR(pdata->regmap);
- pdata->clk = devm_clk_get(dev, NULL);
- if (IS_ERR(pdata->clk))
- return dev_err_probe(dev, PTR_ERR(pdata->clk), "failed to get clock\n");
+ if (pdata->data->has_sysclk) {
+ pdata->clk = devm_clk_get(dev, "core");
+ if (IS_ERR(pdata->clk))
+ return dev_err_probe(dev, PTR_ERR(pdata->clk), "failed to get core clk\n");
+ pdata->sysclk = devm_clk_get_enabled(dev, "pclk");
+ if (IS_ERR(pdata->sysclk))
+ return dev_err_probe(dev, PTR_ERR(pdata->sysclk), "failed to get pclk\n");
+ } else {
+ pdata->clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(pdata->clk))
+ return dev_err_probe(dev, PTR_ERR(pdata->clk), "failed to get clock\n");
+ }
if (pdata->data->use_sm)
ret = amlogic_thermal_probe_sm(pdev, pdata);
@@ -346,6 +437,17 @@ static int amlogic_thermal_probe(struct platform_device *pdev)
devm_thermal_add_hwmon_sysfs(&pdev->dev, pdata->tzd);
+ if (pdata->data->reset_temp) {
+ reset_temp = pdata->data->reset_temp;
+ } else {
+ dev_dbg(dev, "using default hardware reset temperature\n");
+ reset_temp = TSENSOR_HW_RESET_DEFAULT_TEMP;
+ }
+
+ pdata->temp_code = amlogic_thermal_millicelsius_to_code(pdata, reset_temp);
+
+ amlogic_tsensor_setup_hw_reset(pdata);
+
ret = amlogic_thermal_enable(pdata);
return ret;
@@ -363,6 +465,8 @@ static int amlogic_thermal_suspend(struct device *dev)
struct amlogic_thermal *data = dev_get_drvdata(dev);
amlogic_thermal_disable(data);
+ if (data->data->has_sysclk)
+ clk_disable_unprepare(data->sysclk);
return 0;
}
@@ -371,6 +475,9 @@ static int amlogic_thermal_resume(struct device *dev)
{
struct amlogic_thermal *data = dev_get_drvdata(dev);
+ if (data->data->has_sysclk)
+ clk_prepare_enable(data->sysclk);
+ amlogic_tsensor_setup_hw_reset(data);
return amlogic_thermal_enable(data);
}
--
2.52.0
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: thermal: amlogic: Add A9 thermal bindings
2026-08-21 7:50 ` [PATCH v3 1/2] dt-bindings: thermal: amlogic: Add A9 thermal bindings Xianwei Zhao via B4 Relay
@ 2026-08-21 7:57 ` sashiko-bot
0 siblings, 0 replies; 5+ messages in thread
From: sashiko-bot @ 2026-08-21 7:57 UTC (permalink / raw)
To: Xianwei Zhao; +Cc: robh, neil.armstrong, linux-amlogic, devicetree, conor+dt
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] The commit message contains a typographical error, referring to the clock as 'plck' instead of 'pclk'.
--
--- Patch [1]: [PATCH v3 1/2] dt-bindings: thermal: amlogic: Add A9 thermal bindings ---
commit 49a4951362b7daffa63163bcd033f80c3c836b83
Author: Xianwei Zhao <xianwei.zhao@amlogic.com>
dt-bindings: thermal: amlogic: Add A9 thermal bindings
Document the thermal controller compatibles for the Amlogic A9 SoC. Describe
the required core and pclk clocks and update the schema constraints for the
A9-specific thermal controllers.
> Describe the required "core" and "plck" clocks, and update the schema
> constraints for A9-specific thermal controllers.
[Severity: Low]
This isn't a bug, but there is a typo in the commit message. The commit
message refers to the clock as "plck", while the binding schema correctly
defines it as "pclk".
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260821-a9-thermal-v3-0-0e7abf3941e3@amlogic.com?part=1
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3 2/2] thermal: amlogic: Add support for A9 thermal controller
2026-08-21 7:50 ` [PATCH v3 2/2] thermal: amlogic: Add support for A9 thermal controller Xianwei Zhao via B4 Relay
@ 2026-08-21 8:01 ` sashiko-bot
0 siblings, 0 replies; 5+ messages in thread
From: sashiko-bot @ 2026-08-21 8:01 UTC (permalink / raw)
To: Xianwei Zhao; +Cc: linux-amlogic, conor+dt, robh, devicetree, neil.armstrong
Thank you for your contribution! Sashiko AI review found 6 potential issue(s) to consider:
New issues:
- [Critical] Hardware reset registers are unconditionally accessed before the peripheral clock is enabled, causing a bus fault or system hang on legacy SoCs.
- [High] The hardware over-temperature reset mechanism is unconditionally enabled for all SoCs, contradicting the commit message and potentially causing undefined behavior on unsupported platforms.
- [High] The return value of `clk_prepare_enable()` for `sysclk` is ignored in `amlogic_thermal_resume()`, potentially leading to unclocked hardware accesses and clock state leaks.
- [High] The fallback logic for a zero divisor (`!uptat`) in temperature calculation produces a code that overflows the 12-bit hardware register mask, silently setting the reboot threshold to 0.
Pre-existing issues:
- [High] The calculation of `uefuse` incorrectly zero-extends a 32-bit bitwise NOT result on 32-bit platforms, turning a negative calibration offset into a massive positive value.
- [High] The thermal zone and hwmon sysfs interfaces are exposed to userspace and the thermal core before hardware initialization completes, allowing unclocked register accesses.
--
--- Patch [2]: [PATCH v3 2/2] thermal: amlogic: Add support for A9 thermal controller ---
commit a95f34d366c7ca1c65ce5aec6e86688c00a990a8
Author: Xianwei Zhao <xianwei.zhao@amlogic.com>
thermal: amlogic: Add support for A9 thermal controller
Add support for the Amlogic A9 thermal controller. The A9 thermal controller
uses different calibration parameters, requires separate core and bus clocks,
and supports a hardware over-temperature reset mechanism, and restore the
hardware reset configuration after resume.
> diff --git a/drivers/thermal/amlogic_thermal.c b/drivers/thermal/amlogic_thermal.c
> index a0b530624b60c..ff8a8b1525367 100644
> --- a/drivers/thermal/amlogic_thermal.c
> +++ b/drivers/thermal/amlogic_thermal.c
[ ... ]
> @@ -138,6 +157,49 @@ static int amlogic_thermal_code_to_millicelsius(struct amlogic_thermal *pdata,
> return temp;
> }
>
> +/*
> + * Calculate a temperature code from a temperature value .
> + * The unit of the temperature is degree milliCelsius.
> + */
> +static u32 amlogic_thermal_millicelsius_to_code(struct amlogic_thermal *pdata, int millicelsius)
> +{
> + const struct amlogic_thermal_soc_calib_data *param =
> + pdata->data->calibration_parameters;
> + s64 factor, uptat, uefuse;
> + u32 temp_code;
> +
> + uefuse = pdata->trim_info & TSENSOR_TRIM_SIGN_MASK ?
> + ~(pdata->trim_info & TSENSOR_TRIM_TEMP_MASK) + 1 :
> + (pdata->trim_info & TSENSOR_TRIM_TEMP_MASK);
[Severity: High]
This is a pre-existing issue that was copied into this new function, but does
this calculation correctly handle negative calibration offsets on 32-bit
platforms?
The expression ~(pdata->trim_info & TSENSOR_TRIM_TEMP_MASK) + 1 evaluates to a
32-bit unsigned integer since TSENSOR_TRIM_TEMP_MASK is generated by GENMASK.
When assigned to the s64 uefuse variable, it is zero-extended instead of
sign-extended, turning a negative offset into a massive positive value.
> +
> + factor = param->B + div_s64(millicelsius, 100);
> + factor = BIT(16) * factor;
> + factor = div_s64(factor, param->A);
> + factor = factor - uefuse;
> +
> + uptat = param->n * factor;
> + uptat = div_s64(uptat, BIT(16));
> + uptat = param->m - uptat;
> +
> + factor = factor * 100;
> + if (!uptat)
> + factor = TSENSOR_TEMP_MASK << 0x4;
> + else
> + factor = div_s64(factor, uptat);
> +
> + temp_code = ((factor >> 0x4) & TSENSOR_TEMP_MASK) + TSENSOR_TEMP_CAL;
[Severity: High]
If the division-by-zero fallback (!uptat) triggers, factor is set to 0xFFF0.
Does this result in a temp_code of 0x1000 here, which exceeds the 12-bit
TSENSOR_TEMP_MASK?
Later in amlogic_tsensor_setup_hw_reset(), this 0x1000 is shifted left by 4 to
produce 0x10000. When written to TSENSOR_CFG_REG2 with the GENMASK(15, 4) mask,
it truncates to 0. Could this accidentally set the hardware reboot threshold to
0 and cause an unexpected reboot?
> +
> + return temp_code;
> +}
> +
> +static void amlogic_tsensor_setup_hw_reset(struct amlogic_thermal *data)
> +{
> + regmap_update_bits(data->regmap, TSENSOR_CFG_REG2, TSENSOR_CFG_REG2_REBOOT_CODE,
> + data->temp_code << 0x4);
> + regmap_update_bits(data->regmap, TSENSOR_CFG_REG2,
> + TSENSOR_CFG_REG2_ENABLE, TSENSOR_CFG_REG2_ENABLE);
> +}
[ ... ]
> @@ -346,6 +437,17 @@ static int amlogic_thermal_probe(struct platform_device *pdev)
>
> devm_thermal_add_hwmon_sysfs(&pdev->dev, pdata->tzd);
[Severity: High]
This is a pre-existing issue, but does registering the thermal zone and hwmon
sysfs interfaces here expose them to userspace before hardware initialization
completes?
Since devm_thermal_of_zone_register() and devm_thermal_add_hwmon_sysfs() are
called before amlogic_thermal_enable() starts the device clock, a thermal
core or sysfs read could invoke amlogic_thermal_get_temp() concurrently,
accessing TSENSOR_STAT0 while the clock is gated, which could cause a bus
hang.
> + if (pdata->data->reset_temp) {
> + reset_temp = pdata->data->reset_temp;
> + } else {
> + dev_dbg(dev, "using default hardware reset temperature\n");
> + reset_temp = TSENSOR_HW_RESET_DEFAULT_TEMP;
> + }
[Severity: High]
The commit message states the hardware over-temperature reset is an A9
thermal controller feature.
However, doesn't this unconditionally fall back to the default reset
temperature and enable the hardware reboot feature for all SoCs? Older
platforms might not support this register or the hardware reboot feature.
> +
> + pdata->temp_code = amlogic_thermal_millicelsius_to_code(pdata, reset_temp);
> +
> + amlogic_tsensor_setup_hw_reset(pdata);
> +
> + ret = amlogic_thermal_enable(pdata);
[Severity: Critical]
Does amlogic_tsensor_setup_hw_reset() access TSENSOR_CFG_REG2 before
amlogic_thermal_enable() starts the device clock?
On older SoCs like G12A, there is no separate sysclk, so the hardware is
completely unclocked during this MMIO write. Could this cause a bus fault
or system hang during boot?
> return ret;
> }
[ ... ]
> @@ -371,6 +475,9 @@ static int amlogic_thermal_resume(struct device *dev)
> {
> struct amlogic_thermal *data = dev_get_drvdata(dev);
>
> + if (data->data->has_sysclk)
> + clk_prepare_enable(data->sysclk);
[Severity: High]
Should the return value of clk_prepare_enable() be checked here?
If it fails, the driver continues to access the hardware in
amlogic_tsensor_setup_hw_reset(), causing a bus hang. If it succeeds but the
subsequent amlogic_thermal_enable() fails, the clock reference count could be
left imbalanced.
> + amlogic_tsensor_setup_hw_reset(data);
> + return amlogic_thermal_enable(data);
[Severity: Critical]
Similar to the issue in amlogic_thermal_probe(), does this perform an
unclocked hardware register access during device resume on legacy platforms?
amlogic_tsensor_setup_hw_reset() accesses TSENSOR_CFG_REG2 before
amlogic_thermal_enable() starts the main device clock, which could cause a
bus hang on older SoCs that lack a separate sysclk.
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260821-a9-thermal-v3-0-0e7abf3941e3@amlogic.com?part=2
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-21 8:01 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-21 7:50 [PATCH v3 0/2] thermal: Add support A9 Xianwei Zhao via B4 Relay
2026-08-21 7:50 ` [PATCH v3 1/2] dt-bindings: thermal: amlogic: Add A9 thermal bindings Xianwei Zhao via B4 Relay
2026-08-21 7:57 ` sashiko-bot
2026-08-21 7:50 ` [PATCH v3 2/2] thermal: amlogic: Add support for A9 thermal controller Xianwei Zhao via B4 Relay
2026-08-21 8:01 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox