mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
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:
parent
8a2622ae68
commit
cdb9bf0faa
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user