]> git.ipfire.org Git - thirdparty/kernel/linux.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)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 24 Oct 2025 08:29:08 +0000 (10:29 +0200)
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>
drivers/acpi/fan.h
drivers/acpi/fan_attr.c
drivers/acpi/fan_core.c
drivers/acpi/fan_hwmon.c

index 8a28a72a7c6a3084348d0cdb8bd5733bebca2d92..d39bb6fd132628e38dddae3487e83ff5c69234f7 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 04ff608f2ff02cfc8a9cbfb2d5bbfa2a313f7b52..ea2c646c470cedd92fc532314b8db3dee036685a 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;
 
@@ -311,11 +316,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 e8d90605106efad4c10ae22c82a61c64224f8fa0..4209a9923efcb948ac9d5b5c87b20b50b824b429 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;