OSDN Git Service

ACPI: thermal: Move to dedicated function sysfs extra attr creation
authorDaniel Lezcano <daniel.lezcano@linaro.org>
Wed, 19 Apr 2023 08:33:42 +0000 (10:33 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 27 Apr 2023 17:20:12 +0000 (19:20 +0200)
The ACPI thermal driver creates extra sysfs attributes in its own
directory pointing to the thermal zone it is related to and add a
pointer to the sysfs ACPI thermal device from the thermal zone sysfs
entry.

This is very specific to this ACPI thermal driver, let's encapsulate
the related creation/deletion code to group it inside a function we
can identify later for removal if needed.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
[ rjw: Subject adjustment, removal of trailing white space ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/thermal.c

index 3682f18..38bc81b 100644 (file)
@@ -787,9 +787,34 @@ static struct thermal_zone_device_ops acpi_thermal_zone_ops = {
        .critical = acpi_thermal_zone_device_critical,
 };
 
+static int acpi_thermal_zone_sysfs_add(struct acpi_thermal *tz)
+{
+       struct device *tzdev = thermal_zone_device(tz->thermal_zone);
+       int ret;
+
+       ret = sysfs_create_link(&tz->device->dev.kobj,
+                               &tzdev->kobj, "thermal_zone");
+       if (ret)
+               return ret;
+
+       ret = sysfs_create_link(&tzdev->kobj,
+                                  &tz->device->dev.kobj, "device");
+       if (ret)
+               sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
+
+       return ret;
+}
+
+static void acpi_thermal_zone_sysfs_remove(struct acpi_thermal *tz)
+{
+       struct device *tzdev = thermal_zone_device(tz->thermal_zone);
+
+       sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
+       sysfs_remove_link(&tzdev->kobj, "device");
+}
+
 static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
 {
-       struct device *tzdev;
        int trips = 0;
        int result;
        acpi_status status;
@@ -821,23 +846,15 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
        if (IS_ERR(tz->thermal_zone))
                return -ENODEV;
 
-       tzdev = thermal_zone_device(tz->thermal_zone);
-
-       result = sysfs_create_link(&tz->device->dev.kobj,
-                                  &tzdev->kobj, "thermal_zone");
+       result = acpi_thermal_zone_sysfs_add(tz);
        if (result)
                goto unregister_tzd;
 
-       result = sysfs_create_link(&tzdev->kobj,
-                                  &tz->device->dev.kobj, "device");
-       if (result)
-               goto remove_tz_link;
-
        status =  acpi_bus_attach_private_data(tz->device->handle,
                                               tz->thermal_zone);
        if (ACPI_FAILURE(status)) {
                result = -ENODEV;
-               goto remove_dev_link;
+               goto remove_links;
        }
 
        result = thermal_zone_device_enable(tz->thermal_zone);
@@ -851,10 +868,8 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
 
 acpi_bus_detach:
        acpi_bus_detach_private_data(tz->device->handle);
-remove_dev_link:
-       sysfs_remove_link(&tzdev->kobj, "device");
-remove_tz_link:
-       sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
+remove_links:
+       acpi_thermal_zone_sysfs_remove(tz);
 unregister_tzd:
        thermal_zone_device_unregister(tz->thermal_zone);
 
@@ -863,10 +878,7 @@ unregister_tzd:
 
 static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)
 {
-       struct device *tzdev = thermal_zone_device(tz->thermal_zone);
-
-       sysfs_remove_link(&tz->device->dev.kobj, "thermal_zone");
-       sysfs_remove_link(&tzdev->kobj, "device");
+       acpi_thermal_zone_sysfs_remove(tz);
        thermal_zone_device_unregister(tz->thermal_zone);
        tz->thermal_zone = NULL;
        acpi_bus_detach_private_data(tz->device->handle);