]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ACPI: fan: Separate file for attributes creation
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Fri, 11 Feb 2022 16:09:28 +0000 (08:09 -0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 25 Feb 2022 19:49:29 +0000 (20:49 +0100)
Move the functionality of creation of sysfs attributes under acpi device
to a new file fan_attr.c. This cleans up the core fan code, which just
use thermal sysfs interface. The original fan.c is renamed to
fan_core.c.

No functional changes are expected.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/Makefile
drivers/acpi/fan.h
drivers/acpi/fan_attr.c [new file with mode: 0644]
drivers/acpi/fan_core.c [moved from drivers/acpi/fan.c with 80% similarity]

index bb757148e7ba0b13d9951eff8bedacb662012846..b5a8d3e00a52be430772f673851327ede14d8ede 100644 (file)
@@ -81,6 +81,9 @@ obj-$(CONFIG_ACPI_AC)                 += ac.o
 obj-$(CONFIG_ACPI_BUTTON)      += button.o
 obj-$(CONFIG_ACPI_TINY_POWER_BUTTON)   += tiny-power-button.o
 obj-$(CONFIG_ACPI_FAN)         += fan.o
+fan-objs                       := fan_core.o
+fan-objs                       += fan_attr.o
+
 obj-$(CONFIG_ACPI_VIDEO)       += video.o
 obj-$(CONFIG_ACPI_TAD)         += acpi_tad.o
 obj-$(CONFIG_ACPI_PCI_SLOT)    += pci_slot.o
index dd9bb8ca224426bd7115a15d6acb7610071fb005..36c5e1a570944fc313a308f46a10c685bb659850 100644 (file)
@@ -6,9 +6,44 @@
  *
  * Add new device IDs before the generic ACPI fan one.
  */
+
+#ifndef _ACPI_FAN_H_
+#define _ACPI_FAN_H_
+
 #define ACPI_FAN_DEVICE_IDS    \
        {"INT3404", }, /* Fan */ \
        {"INTC1044", }, /* Fan for Tiger Lake generation */ \
        {"INTC1048", }, /* Fan for Alder Lake generation */ \
        {"INTC10A2", }, /* Fan for Raptor Lake generation */ \
        {"PNP0C0B", } /* Generic ACPI fan */
+
+#define ACPI_FPS_NAME_LEN      20
+
+struct acpi_fan_fps {
+       u64 control;
+       u64 trip_point;
+       u64 speed;
+       u64 noise_level;
+       u64 power;
+       char name[ACPI_FPS_NAME_LEN];
+       struct device_attribute dev_attr;
+};
+
+struct acpi_fan_fif {
+       u64 revision;
+       u64 fine_grain_ctrl;
+       u64 step_size;
+       u64 low_speed_notification;
+};
+
+struct acpi_fan {
+       bool acpi4;
+       struct acpi_fan_fif fif;
+       struct acpi_fan_fps *fps;
+       int fps_count;
+       struct thermal_cooling_device *cdev;
+};
+
+int acpi_fan_create_attributes(struct acpi_device *device);
+void acpi_fan_delete_attributes(struct acpi_device *device);
+#endif
diff --git a/drivers/acpi/fan_attr.c b/drivers/acpi/fan_attr.c
new file mode 100644 (file)
index 0000000..7b10902
--- /dev/null
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *  fan_attr.c - Create extra attributes for ACPI Fan driver
+ *
+ *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
+ *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
+ *  Copyright (C) 2022 Intel Corporation. All rights reserved.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/acpi.h>
+
+#include "fan.h"
+
+MODULE_LICENSE("GPL");
+
+static ssize_t show_state(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct acpi_fan_fps *fps = container_of(attr, struct acpi_fan_fps, dev_attr);
+       int count;
+
+       if (fps->control == 0xFFFFFFFF || fps->control > 100)
+               count = scnprintf(buf, PAGE_SIZE, "not-defined:");
+       else
+               count = scnprintf(buf, PAGE_SIZE, "%lld:", fps->control);
+
+       if (fps->trip_point == 0xFFFFFFFF || fps->trip_point > 9)
+               count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
+       else
+               count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->trip_point);
+
+       if (fps->speed == 0xFFFFFFFF)
+               count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
+       else
+               count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->speed);
+
+       if (fps->noise_level == 0xFFFFFFFF)
+               count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
+       else
+               count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->noise_level * 100);
+
+       if (fps->power == 0xFFFFFFFF)
+               count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined\n");
+       else
+               count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld\n", fps->power);
+
+       return count;
+}
+
+int acpi_fan_create_attributes(struct acpi_device *device)
+{
+       struct acpi_fan *fan = acpi_driver_data(device);
+       int i, status = 0;
+
+       for (i = 0; i < fan->fps_count; ++i) {
+               struct acpi_fan_fps *fps = &fan->fps[i];
+
+               snprintf(fps->name, ACPI_FPS_NAME_LEN, "state%d", i);
+               sysfs_attr_init(&fps->dev_attr.attr);
+               fps->dev_attr.show = show_state;
+               fps->dev_attr.store = NULL;
+               fps->dev_attr.attr.name = fps->name;
+               fps->dev_attr.attr.mode = 0444;
+               status = sysfs_create_file(&device->dev.kobj, &fps->dev_attr.attr);
+               if (status) {
+                       int j;
+
+                       for (j = 0; j < i; ++j)
+                               sysfs_remove_file(&device->dev.kobj, &fan->fps[j].dev_attr.attr);
+                       break;
+               }
+       }
+
+       return status;
+}
+
+void acpi_fan_delete_attributes(struct acpi_device *device)
+{
+       struct acpi_fan *fan = acpi_driver_data(device);
+       int i;
+
+       for (i = 0; i < fan->fps_count; ++i)
+               sysfs_remove_file(&device->dev.kobj, &fan->fps[i].dev_attr.attr);
+}
similarity index 80%
rename from drivers/acpi/fan.c
rename to drivers/acpi/fan_core.c
index 098d64568d6d459cd841722c7640b59151573917..9f8e68403fad64fec25fc4be3d63a730ec4ddcd8 100644 (file)
@@ -1,9 +1,10 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
 /*
- *  acpi_fan.c - ACPI Fan Driver ($Revision: 29 $)
+ *  fan_core.c - ACPI Fan core Driver
  *
  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
+ *  Copyright (C) 2022 Intel Corporation. All rights reserved.
  */
 
 #include <linux/kernel.h>
@@ -45,33 +46,6 @@ static const struct dev_pm_ops acpi_fan_pm = {
 #define FAN_PM_OPS_PTR NULL
 #endif
 
-#define ACPI_FPS_NAME_LEN      20
-
-struct acpi_fan_fps {
-       u64 control;
-       u64 trip_point;
-       u64 speed;
-       u64 noise_level;
-       u64 power;
-       char name[ACPI_FPS_NAME_LEN];
-       struct device_attribute dev_attr;
-};
-
-struct acpi_fan_fif {
-       u64 revision;
-       u64 fine_grain_ctrl;
-       u64 step_size;
-       u64 low_speed_notification;
-};
-
-struct acpi_fan {
-       bool acpi4;
-       struct acpi_fan_fif fif;
-       struct acpi_fan_fps *fps;
-       int fps_count;
-       struct thermal_cooling_device *cdev;
-};
-
 static struct platform_driver acpi_fan_driver = {
        .probe = acpi_fan_probe,
        .remove = acpi_fan_remove,
@@ -270,39 +244,6 @@ static int acpi_fan_speed_cmp(const void *a, const void *b)
        return fps1->speed - fps2->speed;
 }
 
-static ssize_t show_state(struct device *dev, struct device_attribute *attr, char *buf)
-{
-       struct acpi_fan_fps *fps = container_of(attr, struct acpi_fan_fps, dev_attr);
-       int count;
-
-       if (fps->control == 0xFFFFFFFF || fps->control > 100)
-               count = scnprintf(buf, PAGE_SIZE, "not-defined:");
-       else
-               count = scnprintf(buf, PAGE_SIZE, "%lld:", fps->control);
-
-       if (fps->trip_point == 0xFFFFFFFF || fps->trip_point > 9)
-               count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
-       else
-               count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->trip_point);
-
-       if (fps->speed == 0xFFFFFFFF)
-               count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
-       else
-               count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->speed);
-
-       if (fps->noise_level == 0xFFFFFFFF)
-               count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined:");
-       else
-               count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld:", fps->noise_level * 100);
-
-       if (fps->power == 0xFFFFFFFF)
-               count += scnprintf(&buf[count], PAGE_SIZE - count, "not-defined\n");
-       else
-               count += scnprintf(&buf[count], PAGE_SIZE - count, "%lld\n", fps->power);
-
-       return count;
-}
-
 static int acpi_fan_get_fps(struct acpi_device *device)
 {
        struct acpi_fan *fan = acpi_driver_data(device);
@@ -347,25 +288,6 @@ static int acpi_fan_get_fps(struct acpi_device *device)
        sort(fan->fps, fan->fps_count, sizeof(*fan->fps),
             acpi_fan_speed_cmp, NULL);
 
-       for (i = 0; i < fan->fps_count; ++i) {
-               struct acpi_fan_fps *fps = &fan->fps[i];
-
-               snprintf(fps->name, ACPI_FPS_NAME_LEN, "state%d", i);
-               sysfs_attr_init(&fps->dev_attr.attr);
-               fps->dev_attr.show = show_state;
-               fps->dev_attr.store = NULL;
-               fps->dev_attr.attr.name = fps->name;
-               fps->dev_attr.attr.mode = 0444;
-               status = sysfs_create_file(&device->dev.kobj, &fps->dev_attr.attr);
-               if (status) {
-                       int j;
-
-                       for (j = 0; j < i; ++j)
-                               sysfs_remove_file(&device->dev.kobj, &fan->fps[j].dev_attr.attr);
-                       break;
-               }
-       }
-
 err:
        kfree(obj);
        return status;
@@ -396,6 +318,10 @@ static int acpi_fan_probe(struct platform_device *pdev)
                if (result)
                        return result;
 
+               result = acpi_fan_create_attributes(device);
+               if (result)
+                       return result;
+
                fan->acpi4 = true;
        } else {
                result = acpi_device_update_power(device, NULL);
@@ -437,12 +363,8 @@ static int acpi_fan_probe(struct platform_device *pdev)
        return 0;
 
 err_end:
-       if (fan->acpi4) {
-               int i;
-
-               for (i = 0; i < fan->fps_count; ++i)
-                       sysfs_remove_file(&device->dev.kobj, &fan->fps[i].dev_attr.attr);
-       }
+       if (fan->acpi4)
+               acpi_fan_delete_attributes(device);
 
        return result;
 }
@@ -453,10 +375,8 @@ static int acpi_fan_remove(struct platform_device *pdev)
 
        if (fan->acpi4) {
                struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
-               int i;
 
-               for (i = 0; i < fan->fps_count; ++i)
-                       sysfs_remove_file(&device->dev.kobj, &fan->fps[i].dev_attr.attr);
+               acpi_fan_delete_attributes(device);
        }
        sysfs_remove_link(&pdev->dev.kobj, "thermal_cooling");
        sysfs_remove_link(&fan->cdev->device.kobj, "device");