Re: [PATCH 4/4] ACPI: battery: Wake system on AC plug or unplug in over s2idle

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Feb 8, 2025 at 5:22 PM Mario Limonciello <superm1@xxxxxxxxxx> wrote:
>
> From: Mario Limonciello <mario.limonciello@xxxxxxx>
>
> On Windows the OS will wake up when plugged or unplugged from AC adapter.
> Depending upon whether the system was plugged in or unplugged will
> determine whether the "display turns on".  If there is no user activity
> for some time then it goes back to sleep.
>
> In Linux plugging or unplugging an adapter will wake the SoC from HW
> sleep but then the Linux kernel puts it right back into HW sleep
> immediately unless there is another interrupt active (such as a PME or
> GPIO).
>
> To get closer to the Windows behavior, record the state of the battery
> when going into suspend and compare it when updating battery status
> during the s2idle loop. If it's changed, wake the system.
>
> This can be restored to previous behavior by disabling the ACPI battery
> device `power/wakeup` sysfs file.

Why is this desirable?

What if the AC is connected to a suspended laptop when the lid is
still closed?  Is it really a good idea to resume it then?

Frankly, I'd prefer the existing behavior to be still the default.

> Link: https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-wake-sources#environmental-context-changes-1
> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>
> ---
>  drivers/acpi/battery.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
> index 72c8a509695e6..91f79927cc720 100644
> --- a/drivers/acpi/battery.c
> +++ b/drivers/acpi/battery.c
> @@ -125,6 +125,7 @@ struct acpi_battery {
>         int state;
>         int power_unit;
>         int capacity_suspend;
> +       int suspend_state;
>         unsigned long flags;
>  };
>
> @@ -1012,6 +1013,12 @@ static inline bool acpi_battery_should_wake(struct acpi_battery *battery)
>                 return true;
>         }
>
> +       if (battery->state != battery->suspend_state) {
> +               pm_pr_dbg("Waking due to battery state changed from 0x%x to 0x%x",
> +                         battery->suspend_state, battery->state);
> +               return true;
> +       }
> +
>         return false;
>  }
>
> @@ -1313,6 +1320,7 @@ static int acpi_battery_suspend(struct device *dev)
>                 return -EINVAL;
>
>         battery->capacity_suspend = battery->capacity_now;
> +       battery->suspend_state = battery->state;
>
>         return 0;
>  }
> --
> 2.43.0
>
>





[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]
  Powered by Linux