ACPI: platform-profile: call sysfs_notify() from platform_profile_store()

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>
This commit is contained in:
Hans de Goede 2021-08-16 13:30:07 +02:00 committed by Rafael J. Wysocki
parent 7c60610d47
commit b25d5a1cd1
2 changed files with 10 additions and 0 deletions

View File

@ -26,3 +26,10 @@ Contact: Hans de Goede <hdegoede@redhat.com>
Description: Reading this file gives the current selected profile for this Description: Reading this file gives the current selected profile for this
device. Writing this file with one of the strings from device. Writing this file with one of the strings from
platform_profile_choices changes the profile to the new value. 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.

View File

@ -106,6 +106,9 @@ static ssize_t platform_profile_store(struct device *dev,
} }
err = cur_profile->profile_set(cur_profile, i); err = cur_profile->profile_set(cur_profile, i);
if (!err)
sysfs_notify(acpi_kobj, NULL, "platform_profile");
mutex_unlock(&profile_lock); mutex_unlock(&profile_lock);
if (err) if (err)
return err; return err;