ACPI: platform-profile: call sysfs_notify() from platform_profile_store()
authorHans de Goede <hdegoede@redhat.com>
Mon, 16 Aug 2021 11:30:07 +0000 (13:30 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 16 Aug 2021 16:32:02 +0000 (18:32 +0200)
Drivers like thinkpad_acpi and ideapad_laptop call the
platform_profile_notify() helper when the profile is changed by hardware
(the embedded-controller/EC) in response to an EC handled hotkey.

This allows userspace to monitor for such changes by polling for POLLPRI
on the platform_profile sysfs file. But the profile can also be changed
underneath a userspace program monitoring it by anonther userspace program
storing a new value.

Add a sysfs_notify() call to platform_profile_store(), so that userspace
programs monitoring for changes also get notified in this case.

Also update the documentation to document that POLLPRI polling can be
used to watch for changes.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Documentation/ABI/testing/sysfs-platform_profile
drivers/acpi/platform_profile.c

index dae9c89..baf1d12 100644 (file)
@@ -26,3 +26,10 @@ Contact:     Hans de Goede <hdegoede@redhat.com>
 Description:   Reading this file gives the current selected profile for this
                device. Writing this file with one of the strings from
                platform_profile_choices changes the profile to the new value.
+
+               This file can be monitored for changes by polling for POLLPRI,
+               POLLPRI will be signalled on any changes, independent of those
+               changes coming from a userspace write; or coming from another
+               source such as e.g. a hotkey triggered profile change handled
+               either directly by the embedded-controller or fully handled
+               inside the kernel.
index dd2fbf3..d418462 100644 (file)
@@ -106,6 +106,9 @@ static ssize_t platform_profile_store(struct device *dev,
        }
 
        err = cur_profile->profile_set(cur_profile, i);
+       if (!err)
+               sysfs_notify(acpi_kobj, NULL, "platform_profile");
+
        mutex_unlock(&profile_lock);
        if (err)
                return err;