[PATCH v1 00/14] Support cooling device with ID in the OF

Daniel Lezcano
2026-04-19T18:22:32Z

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@oss.qualcomm.com/
[3] https://lore.kernel.org/all/546faeda-d896-403c-a449-5c9b0cd7159e@kernel.org/
[4] https://lore.kernel.org/all/74f59ef0-ead7-483f-a80e-a3da2f6ebcdb@oss.qualcomm.com/
[5] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/thermal/thermal-zones.yaml#n99

Daniel Lezcano (13):
thermal/of: Move OF code where it belongs to
thermal/driver/tegra/soctherm: Use devm_ variant when registering a
cooling device
thermal/core: Make thermal_cooling_device_init_complete() non static
thermal/of: Move the node pointer assignation in the OF code file
thermal/core: Remove node pointer parameter parameter when registering
a tz
thermal/core: Register cooling device non-OF drivers
hwmon:: Use non-OF thermal cooling device register function
thermal/core: Move OF functions def in the CONFIG_OF section in
thermal.h
thermal/core: Put of_node field cooling device structure under Kconfig
option
thermal/of: Rename the devm_thermal_of_cooling_device_register()
function
thermal/of: Introduce cooling device of_index
thermal/of: Pass the of_index and add a function to register with an
index
thermal/of: Process cooling device index in cooling-spec

Gaurav Kohli (1):
dt-bindings: thermal: cooling-devices: Update support for 3 cells
cooling device

.../thermal/thermal-cooling-devices.yaml | 8 +-
.../bindings/thermal/thermal-zones.yaml | 3 +-
drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 2 +-
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 | 60 ++------
drivers/thermal/thermal_core.h | 6 +
drivers/thermal/thermal_of.c | 139 +++++++++++++++++-
include/linux/thermal.h | 71 ++++++---
26 files changed, 267 insertions(+), 106 deletions(-)

--
2.43.0