thermal: ACPI: Use the .should_bind() thermal zone callback

JIRA: https://issues.redhat.com/browse/RHEL-61357

commit b1c75b3820c18b53cc117bbb02e86b41b018b70a
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Mon Aug 19 18:02:44 2024 +0200

    thermal: ACPI: Use the .should_bind() thermal zone callback

    Make the ACPI thermal zone driver use the .should_bind() thermal zone
    callback to provide the thermal core with the information on whether or
    not to bind the given cooling device to the given trip point in the
    given thermal zone.  If it returns 'true', the thermal core will bind
    the cooling device to the trip and the corresponding unbinding will be
    taken care of automatically by the core on the removal of the involved
    thermal zone or cooling device.

    This replaces the .bind() and .unbind() thermal zone callbacks which
    allows the code to be simplified quite significantly while providing
    the same functionality.

    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Reviewed-by: Zhang Rui <rui.zhang@intel.com>
    Reviewed-by: Daniel Lezcano <daniel.lezcano@linaro.org>
    Link: https://patch.msgid.link/1812827.VLH7GnMWUR@rjwysocki.net

Signed-off-by: David Arcari <darcari@redhat.com>
This commit is contained in:
David Arcari 2024-09-30 15:14:46 -04:00
parent e88fbc91b6
commit 33462e66f2
1 changed files with 9 additions and 55 deletions

View File

@ -558,77 +558,31 @@ static void acpi_thermal_zone_device_critical(struct thermal_zone_device *therma
thermal_zone_device_critical(thermal);
}
struct acpi_thermal_bind_data {
struct thermal_zone_device *thermal;
struct thermal_cooling_device *cdev;
bool bind;
};
static int bind_unbind_cdev_cb(struct thermal_trip *trip, void *arg)
static bool acpi_thermal_should_bind_cdev(struct thermal_zone_device *thermal,
const struct thermal_trip *trip,
struct thermal_cooling_device *cdev,
struct cooling_spec *c)
{
struct acpi_thermal_trip *acpi_trip = trip->priv;
struct acpi_thermal_bind_data *bd = arg;
struct thermal_zone_device *thermal = bd->thermal;
struct thermal_cooling_device *cdev = bd->cdev;
struct acpi_device *cdev_adev = cdev->devdata;
int i;
/* Skip critical and hot trips. */
if (!acpi_trip)
return 0;
return false;
for (i = 0; i < acpi_trip->devices.count; i++) {
acpi_handle handle = acpi_trip->devices.handles[i];
struct acpi_device *adev = acpi_fetch_acpi_dev(handle);
if (adev != cdev_adev)
continue;
if (bd->bind) {
int ret;
ret = thermal_bind_cdev_to_trip(thermal, trip, cdev,
THERMAL_NO_LIMIT,
THERMAL_NO_LIMIT,
THERMAL_WEIGHT_DEFAULT);
if (ret)
return ret;
} else {
thermal_unbind_cdev_from_trip(thermal, trip, cdev);
}
if (acpi_fetch_acpi_dev(handle) == cdev_adev)
return true;
}
return 0;
}
static int acpi_thermal_bind_unbind_cdev(struct thermal_zone_device *thermal,
struct thermal_cooling_device *cdev,
bool bind)
{
struct acpi_thermal_bind_data bd = {
.thermal = thermal, .cdev = cdev, .bind = bind
};
return thermal_zone_for_each_trip(thermal, bind_unbind_cdev_cb, &bd);
}
static int
acpi_thermal_bind_cooling_device(struct thermal_zone_device *thermal,
struct thermal_cooling_device *cdev)
{
return acpi_thermal_bind_unbind_cdev(thermal, cdev, true);
}
static int
acpi_thermal_unbind_cooling_device(struct thermal_zone_device *thermal,
struct thermal_cooling_device *cdev)
{
return acpi_thermal_bind_unbind_cdev(thermal, cdev, false);
return false;
}
static const struct thermal_zone_device_ops acpi_thermal_zone_ops = {
.bind = acpi_thermal_bind_cooling_device,
.unbind = acpi_thermal_unbind_cooling_device,
.should_bind = acpi_thermal_should_bind_cdev,
.get_temp = thermal_get_temp,
.get_trend = thermal_get_trend,
.hot = acpi_thermal_zone_device_hot,