]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPI: TAD: Create one attribute group
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 4 Mar 2026 18:12:22 +0000 (19:12 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sat, 4 Apr 2026 17:18:56 +0000 (19:18 +0200)
Instead of creating three attribute groups, one for each supported
subset of capabilities, create just one and use an .is_visible()
callback in it to decide which attributes to use.

No intentional functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/2412153.ElGaqSPkdT@rafael.j.wysocki
drivers/acpi/acpi_tad.c

index 4f5089fc023d0623917a2629245e8f22cd5ea624..78d0bee4b28aec1400ebd63bbba0da4d3bfa638d 100644 (file)
@@ -249,14 +249,6 @@ static ssize_t time_show(struct device *dev, struct device_attribute *attr,
 
 static DEVICE_ATTR_RW(time);
 
-static struct attribute *acpi_tad_time_attrs[] = {
-       &dev_attr_time.attr,
-       NULL,
-};
-static const struct attribute_group acpi_tad_time_attr_group = {
-       .attrs  = acpi_tad_time_attrs,
-};
-
 static int acpi_tad_wake_set(struct device *dev, char *method, u32 timer_id,
                             u32 value)
 {
@@ -486,17 +478,6 @@ static ssize_t ac_status_show(struct device *dev, struct device_attribute *attr,
 
 static DEVICE_ATTR_RW(ac_status);
 
-static struct attribute *acpi_tad_attrs[] = {
-       &dev_attr_caps.attr,
-       &dev_attr_ac_alarm.attr,
-       &dev_attr_ac_policy.attr,
-       &dev_attr_ac_status.attr,
-       NULL,
-};
-static const struct attribute_group acpi_tad_attr_group = {
-       .attrs  = acpi_tad_attrs,
-};
-
 static ssize_t dc_alarm_store(struct device *dev, struct device_attribute *attr,
                              const char *buf, size_t count)
 {
@@ -545,14 +526,44 @@ static ssize_t dc_status_show(struct device *dev, struct device_attribute *attr,
 
 static DEVICE_ATTR_RW(dc_status);
 
-static struct attribute *acpi_tad_dc_attrs[] = {
+static struct attribute *acpi_tad_attrs[] = {
+       &dev_attr_caps.attr,
+       &dev_attr_ac_alarm.attr,
+       &dev_attr_ac_policy.attr,
+       &dev_attr_ac_status.attr,
        &dev_attr_dc_alarm.attr,
        &dev_attr_dc_policy.attr,
        &dev_attr_dc_status.attr,
+       &dev_attr_time.attr,
        NULL,
 };
-static const struct attribute_group acpi_tad_dc_attr_group = {
-       .attrs  = acpi_tad_dc_attrs,
+
+static umode_t acpi_tad_attr_is_visible(struct kobject *kobj,
+                                       struct attribute *a, int n)
+{
+       struct acpi_tad_driver_data *dd = dev_get_drvdata(kobj_to_dev(kobj));
+
+       if (a == &dev_attr_caps.attr)
+               return a->mode;
+
+       if (a == &dev_attr_ac_alarm.attr || a == &dev_attr_ac_policy.attr ||
+           a == &dev_attr_ac_status.attr)
+               return a->mode;
+
+       if ((dd->capabilities & ACPI_TAD_DC_WAKE) &&
+           (a == &dev_attr_dc_alarm.attr || a == &dev_attr_dc_policy.attr ||
+            a == &dev_attr_dc_status.attr))
+               return a->mode;
+
+       if ((dd->capabilities & ACPI_TAD_RT) && a == &dev_attr_time.attr)
+               return a->mode;
+
+       return 0;
+}
+
+static const struct attribute_group acpi_tad_attr_group = {
+       .attrs  = acpi_tad_attrs,
+       .is_visible = acpi_tad_attr_is_visible,
 };
 
 static int acpi_tad_disable_timer(struct device *dev, u32 timer_id)
@@ -567,12 +578,6 @@ static void acpi_tad_remove(struct platform_device *pdev)
 
        device_init_wakeup(dev, false);
 
-       if (dd->capabilities & ACPI_TAD_RT)
-               sysfs_remove_group(&dev->kobj, &acpi_tad_time_attr_group);
-
-       if (dd->capabilities & ACPI_TAD_DC_WAKE)
-               sysfs_remove_group(&dev->kobj, &acpi_tad_dc_attr_group);
-
        sysfs_remove_group(&dev->kobj, &acpi_tad_attr_group);
 
        scoped_guard(pm_runtime_noresume, dev) {
@@ -633,6 +638,7 @@ static int acpi_tad_probe(struct platform_device *pdev)
        device_init_wakeup(dev, true);
        dev_pm_set_driver_flags(dev, DPM_FLAG_SMART_SUSPEND |
                                     DPM_FLAG_MAY_SKIP_RESUME);
+
        /*
         * The platform bus type layer tells the ACPI PM domain powers up the
         * device, so set the runtime PM status of it to "active".
@@ -643,24 +649,8 @@ static int acpi_tad_probe(struct platform_device *pdev)
 
        ret = sysfs_create_group(&dev->kobj, &acpi_tad_attr_group);
        if (ret)
-               goto fail;
-
-       if (caps & ACPI_TAD_DC_WAKE) {
-               ret = sysfs_create_group(&dev->kobj, &acpi_tad_dc_attr_group);
-               if (ret)
-                       goto fail;
-       }
-
-       if (caps & ACPI_TAD_RT) {
-               ret = sysfs_create_group(&dev->kobj, &acpi_tad_time_attr_group);
-               if (ret)
-                       goto fail;
-       }
-
-       return 0;
+               acpi_tad_remove(pdev);
 
-fail:
-       acpi_tad_remove(pdev);
        return ret;
 }