]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ACPI: fan: Use ACPI handle when retrieving _FST
authorArmin Wolf <W_Armin@gmx.de>
Tue, 7 Oct 2025 23:41:44 +0000 (01:41 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:36:43 +0000 (15:36 -0500)
commit 58764259ebe0c9efd569194444629f6b26f86583 upstream.

Usage of the ACPI device should be phased out in the future, as
the driver itself is now using the platform bus.

Replace any usage of struct acpi_device in acpi_fan_get_fst() to
allow users to drop usage of struct acpi_device.

Also extend the integer check to all three package elements.

Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Link: https://patch.msgid.link/20251007234149.2769-2-W_Armin@gmx.de
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/acpi/fan.h
drivers/acpi/fan_attr.c
drivers/acpi/fan_core.c
drivers/acpi/fan_hwmon.c

index bf05a4b8e998671de82154795fb49e03e60f46ac..bedbab0e8e4e90866170f0ad2767d8c466610f55 100644 (file)
@@ -49,6 +49,7 @@ struct acpi_fan_fst {
 };
 
 struct acpi_fan {
+       acpi_handle handle;
        bool acpi4;
        bool has_fst;
        struct acpi_fan_fif fif;
@@ -59,7 +60,7 @@ struct acpi_fan {
        struct device_attribute fine_grain_control;
 };
 
-int acpi_fan_get_fst(struct acpi_device *device, struct acpi_fan_fst *fst);
+int acpi_fan_get_fst(acpi_handle handle, struct acpi_fan_fst *fst);
 int acpi_fan_create_attributes(struct acpi_device *device);
 void acpi_fan_delete_attributes(struct acpi_device *device);
 
index c1afb7b5ed3dc637efda456313cd500d8e95ca16..9b7fa52f3c2a7446d73b60c46b93b363fac09178 100644 (file)
@@ -55,7 +55,7 @@ static ssize_t show_fan_speed(struct device *dev, struct device_attribute *attr,
        struct acpi_fan_fst fst;
        int status;
 
-       status = acpi_fan_get_fst(acpi_dev, &fst);
+       status = acpi_fan_get_fst(acpi_dev->handle, &fst);
        if (status)
                return status;
 
index 6e64f107327f0c8ab0a3594ca195f350aa20206b..741dabc21429d254764138423bd88f1a67a22734 100644 (file)
@@ -44,25 +44,30 @@ static int fan_get_max_state(struct thermal_cooling_device *cdev, unsigned long
        return 0;
 }
 
-int acpi_fan_get_fst(struct acpi_device *device, struct acpi_fan_fst *fst)
+int acpi_fan_get_fst(acpi_handle handle, struct acpi_fan_fst *fst)
 {
        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
        union acpi_object *obj;
        acpi_status status;
        int ret = 0;
 
-       status = acpi_evaluate_object(device->handle, "_FST", NULL, &buffer);
-       if (ACPI_FAILURE(status)) {
-               dev_err(&device->dev, "Get fan state failed\n");
-               return -ENODEV;
-       }
+       status = acpi_evaluate_object(handle, "_FST", NULL, &buffer);
+       if (ACPI_FAILURE(status))
+               return -EIO;
 
        obj = buffer.pointer;
-       if (!obj || obj->type != ACPI_TYPE_PACKAGE ||
-           obj->package.count != 3 ||
-           obj->package.elements[1].type != ACPI_TYPE_INTEGER) {
-               dev_err(&device->dev, "Invalid _FST data\n");
-               ret = -EINVAL;
+       if (!obj)
+               return -ENODATA;
+
+       if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count != 3) {
+               ret = -EPROTO;
+               goto err;
+       }
+
+       if (obj->package.elements[0].type != ACPI_TYPE_INTEGER ||
+           obj->package.elements[1].type != ACPI_TYPE_INTEGER ||
+           obj->package.elements[2].type != ACPI_TYPE_INTEGER) {
+               ret = -EPROTO;
                goto err;
        }
 
@@ -81,7 +86,7 @@ static int fan_get_state_acpi4(struct acpi_device *device, unsigned long *state)
        struct acpi_fan_fst fst;
        int status, i;
 
-       status = acpi_fan_get_fst(device, &fst);
+       status = acpi_fan_get_fst(device->handle, &fst);
        if (status)
                return status;
 
@@ -323,11 +328,16 @@ static int acpi_fan_probe(struct platform_device *pdev)
        struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
        char *name;
 
+       if (!device)
+               return -ENODEV;
+
        fan = devm_kzalloc(&pdev->dev, sizeof(*fan), GFP_KERNEL);
        if (!fan) {
                dev_err(&device->dev, "No memory for fan\n");
                return -ENOMEM;
        }
+
+       fan->handle = device->handle;
        device->driver_data = fan;
        platform_set_drvdata(pdev, fan);
 
index cba1f096d9717e66fc3c542decf12d88e6c2bf57..4b2c2007f2d7fa5f0c58c76d73b4957cf7306400 100644 (file)
@@ -93,13 +93,12 @@ static umode_t acpi_fan_hwmon_is_visible(const void *drvdata, enum hwmon_sensor_
 static int acpi_fan_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
                               int channel, long *val)
 {
-       struct acpi_device *adev = to_acpi_device(dev->parent);
        struct acpi_fan *fan = dev_get_drvdata(dev);
        struct acpi_fan_fps *fps;
        struct acpi_fan_fst fst;
        int ret;
 
-       ret = acpi_fan_get_fst(adev, &fst);
+       ret = acpi_fan_get_fst(fan->handle, &fst);
        if (ret < 0)
                return ret;