ACPI: thermal: Use cooling device parent for thermal zone binding

The ACPI thermal zone .should_bind() callback function,
acpi_thermal_should_bind_cdev(), expects the given cooling device's
devdata to point to an ACPI device object whose ACPI handle should be
compared with ACPI handles in a list associated with the given trip
point.  That is not particularly straightforward and it effectively
requires the drivers of ACPI cooling devices to populate the devdata
with addresses of the ACPI companions of the devices they bind to.
Consequently, the devdata cannot be used by the driver for its own
needs which is its intended purpose.

That can be overcome with the help of the observation that the
ACPI device objects to be matched against the lists of ACPI handles
associated with trip points are in fact the ACPI companions of the
parents of cooling devices.  Thus instead of using the given cooling
device's devdata, it is sufficient to obtain the ACPI handle of its
parent and compare that ACPI handle with the ones in the list
associated with the given trip point.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Armin Wolf <W_Armin@gmx.de>
[ rjw: Added parent_handle check against NULL ]
Link: https://patch.msgid.link/9672996.CDJkKcVGEf@rafael.j.wysocki
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Rafael J. Wysocki 2026-09-11 15:05:07 +02:00
parent 8a2622ae68
commit cdb9bf0faa

View File

@ -564,17 +564,20 @@ static bool acpi_thermal_should_bind_cdev(struct thermal_zone_device *thermal,
struct cooling_spec *c)
{
struct acpi_thermal_trip *acpi_trip = trip->priv;
struct acpi_device *cdev_adev = cdev->devdata;
struct device *parent = cdev->device.parent;
acpi_handle parent_handle;
int i;
/* Skip critical and hot trips. */
if (!acpi_trip)
/* Skip critical and hot trips and parentless cooling devices. */
if (!acpi_trip || !parent)
return false;
parent_handle = ACPI_HANDLE(parent);
if (!parent_handle)
return false;
for (i = 0; i < acpi_trip->devices.count; i++) {
acpi_handle handle = acpi_trip->devices.handles[i];
if (acpi_fetch_acpi_dev(handle) == cdev_adev)
if (acpi_trip->devices.handles[i] == parent_handle)
return true;
}