[PATCH v3 00/11] Support cooling device with ID in the OF
From: Daniel Lezcano
Date: Tue May 26 2026 - 10:13:15 EST
Ultra short description. DT Cooling device description:
Old: <&mycdev min max>
New: <&mycdev min max> OR/AND <&mycdev id min max>
Based on
https://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux.git/log/?h=thermal/linux-next
A cooling device can be a single cooling device or a cooling device
controller with multiple cooling devices attached to it.
The thermal framework builds a connection between a cooling device and
a thermal zone when there is a trip point to be mitigated by the
cooling device. In the Linux kernel thermal semantic, the action of
connecting the cooling device and the thermal zone is called a
binding.
The description of the aforementioned connection depends on the
firmware definition and in our case it is through the device tree. The
cooling map describes this connection.
How is it done ?
For a single cooling device, the DT describes:
* A cooling device:
mycooling_device {
...
};
* A cooling map in a thermal zone
mythermal_zone {
...
cooling-maps {
map0 {
...
cooling-device = <&mycooling_device min max>;
...
};
}
...
};
For a cooling device controller with multiple cooling devices
attached, the DT describes:
* A cooling device controller:
mycooling_device_ctrl {
mycooling_device1 {
...
};
mycooling_device2 {
...
};
...
mycooling_deviceN {
...
};
};
* A cooling map in a thermal zone
mythermal_zone {
...
cooling-maps {
map0 {
...
cooling-device = <&mycooling_device1 min max>;
...
};
}
...
};
When the cooling device "mycooling_device" is registered, then the
binding function will browse all the cooling maps and matches the node
device pointer to do the association (the pĥandle in the cooling map
vs the cooling device node).
That is how the connection between the cooling device and the thermal
zone is done.
DT maintainers consider the above description with child nodes is
incorrect if a child node doesn't have its own bindings as explained
in the documentation [1].
Gaurav Kohli posted a series to support the QMI TMD (Qualcomm
Messaging Interface based Thermal Mitigation Devices) [2]. This device
is a dedicated, centralized cooling device controller managing a set
of cooling devices.
Because of the above restrictions with child nodes there is no DT
bindings allowing to do the connection between the cooling device
inside the cooling device controller and a thermal zone.
A QMI TMD is not a standalone cooling device neither a multiple
cooling devices with their own DT description.
For this reason, the proposed changes with child nodes has been
rejected [3].
As a solution, it has been proposed to fold all these child nodes into
an array and add an id in the cooling maps to identify the cooling
device entry in the controller node [4].
Given the thermal zone has the same mechanism [5], that is a phandle
to a sensor node and an sensor specifier. The proposed approach makes
sense as it is consistent with the thermal zone description.
This series provides a cleanup around the usage of the OF code which
is interleaved with non-OF code. The OF and the non-OF code are
separated and remain self-encapsulated.
Then the function to register a cooling device is renamed to reflect
the legacy usage and a new function is introduced with the id
parameter.
Finally, the DT bindings is updated with the new format and the
thermal OF is changed to handle the new DT bindings.
Given the trivial changes impacting the files outside of the thermal
framework, this series is designed to have all changes going through
the thermal tree.
Thanks!
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/writing-bindings.rst
[2] https://lore.kernel.org/all/20260127155722.2797783-1-gaurav.kohli@xxxxxxxxxxxxxxxx/
[3] https://lore.kernel.org/all/546faeda-d896-403c-a449-5c9b0cd7159e@xxxxxxxxxx/
[4] https://lore.kernel.org/all/74f59ef0-ead7-483f-a80e-a3da2f6ebcdb@xxxxxxxxxxxxxxxx/
[5] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/thermal/thermal-zones.yaml#n99
---
Changelog:
- V4
- Reworked splitted functions to register a cooling device and
merged separately
- V3
- Reordered and reworked the patches to be git bisect safe
- Reworked devm usage by using a more adequate function doing the
same as the group of calls to devm*
- Pass an init callback instead of moving
thermal_cooling_device_init_complete() out of the function and
calling it in different places
- Sent separetely changes to the tegra soctherm driver
- V2
- Added stubs for OF functions in order to prevent to break the git
bisectability compilation
- Added missing call to thermal_cooling_device_init_complete() in
devm_thermal_of_cooling_device_register()
- Fixed assymetry in devm_ calls for the tegra/soctherm() driver
- Fixed kernel documentation for API changes
- Added missing static inline for a API stub
- Hardened the test with two or three arguments in the cooling spec
- Narrowed const: 2 strict in pwm-fan
---
Daniel Lezcano (9):
thermal/core: Introduce non-OF thermal_cooling_device_register()
thermal/core: Add devm_thermal_cooling_device_register()
hwmon: Use non-OF thermal cooling device registration API
thermal/core: Make cooling device OF node conditional on
CONFIG_THERMAL_OF
thermal/of: Move cooling device OF helpers out of thermal core
thermal/of: Rename the devm_thermal_of_cooling_device_register()
function
thermal/of: Add cooling device ID support
thermal/of: Pass cdev_id and introduce devm registration helper
thermal/of: Support cooling device ID in cooling-spec
Gaurav Kohli (1):
dt-bindings: thermal: cooling-devices: Update support for 3 cells
cooling device
.../devicetree/bindings/hwmon/pwm-fan.yaml | 3 +-
.../thermal/thermal-cooling-devices.yaml | 8 +-
.../bindings/thermal/thermal-zones.yaml | 3 +-
drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 5 +-
drivers/hwmon/amc6821.c | 2 +-
drivers/hwmon/aspeed-pwm-tacho.c | 5 +-
drivers/hwmon/cros_ec_hwmon.c | 4 +-
drivers/hwmon/dell-smm-hwmon.c | 4 +-
drivers/hwmon/emc2305.c | 6 +-
drivers/hwmon/gpio-fan.c | 6 +-
drivers/hwmon/max6650.c | 6 +-
drivers/hwmon/mlxreg-fan.c | 4 +-
drivers/hwmon/npcm750-pwm-fan.c | 6 +-
drivers/hwmon/pwm-fan.c | 5 +-
drivers/hwmon/qnap-mcu-hwmon.c | 6 +-
drivers/hwmon/tc654.c | 5 +-
drivers/memory/tegra/tegra210-emc-core.c | 4 +-
drivers/soc/qcom/qcom_aoss.c | 2 +-
drivers/thermal/cpufreq_cooling.c | 2 +-
drivers/thermal/cpuidle_cooling.c | 2 +-
drivers/thermal/devfreq_cooling.c | 2 +-
drivers/thermal/khadas_mcu_fan.c | 7 +-
drivers/thermal/tegra/soctherm.c | 6 +-
drivers/thermal/thermal_core.c | 85 ++--------
drivers/thermal/thermal_core.h | 5 +
drivers/thermal/thermal_of.c | 148 +++++++++++++++++-
include/linux/thermal.h | 69 +++++---
27 files changed, 273 insertions(+), 137 deletions(-)
--
2.43.0