Re: [PATCH v3] i8042: enable keyboard wakeups by default when s2idle is used

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

 



On Tue, Sep 11, 2018 at 3:29 AM Daniel Drake <drake@xxxxxxxxxxxx> wrote:
>
> Previously, on typical consumer laptops, pressing a key on the keyboard
> when the system is in suspend would cause it to wake up (default or
> unconditional behaviour). This happens because the EC generates a SCI
> interrupt in this scenario.
>
> That is no longer true on modern laptops based on Intel WhiskyLake,
> including Acer Swift SF314-55G, Asus UX333FA, Asus UX433FN and Asus
> UX533FD. We confirmed with Asus EC engineers that the "Modern Standby"
> design has been modified so that the EC no longer generates a SCI
> in this case; the keyboard controller itself should be used for wakeup.
>
> In order to retain the standard behaviour of being able to use the
> keyboard to wake up the system, enable serio wakeups by default on
> platforms that are using s2idle.
>
> Link: https://lkml.kernel.org/r/CAB4CAwfQ0mPMqCLp95TVjw4J0r5zKPWkSvvkK4cpZUGE--w8bQ@xxxxxxxxxxxxxx
> Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx>
> Signed-off-by: Daniel Drake <drake@xxxxxxxxxxxx>
> ---
>  drivers/input/serio/i8042.c | 30 +++++++++++++++++++++---------
>  1 file changed, 21 insertions(+), 9 deletions(-)
>
> v2: tweak comment as suggested by Rafael
>
> v3: fix checkpatch line length warning
>
> diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
> index b8bc71569349..aa2f9e9521f3 100644
> --- a/drivers/input/serio/i8042.c
> +++ b/drivers/input/serio/i8042.c
> @@ -1395,15 +1395,27 @@ static void __init i8042_register_ports(void)
>         for (i = 0; i < I8042_NUM_PORTS; i++) {
>                 struct serio *serio = i8042_ports[i].serio;
>
> -               if (serio) {
> -                       printk(KERN_INFO "serio: %s at %#lx,%#lx irq %d\n",
> -                               serio->name,
> -                               (unsigned long) I8042_DATA_REG,
> -                               (unsigned long) I8042_COMMAND_REG,
> -                               i8042_ports[i].irq);
> -                       serio_register_port(serio);
> -                       device_set_wakeup_capable(&serio->dev, true);
> -               }
> +               if (!serio)
> +                       continue;
> +
> +               printk(KERN_INFO "serio: %s at %#lx,%#lx irq %d\n",
> +                       serio->name,
> +                       (unsigned long) I8042_DATA_REG,
> +                       (unsigned long) I8042_COMMAND_REG,
> +                       i8042_ports[i].irq);
> +               serio_register_port(serio);
> +               device_set_wakeup_capable(&serio->dev, true);
> +
> +               /*
> +                * On platforms using suspend-to-idle by default, make the
> +                * keyboard wake up the system from sleep by enabling keyboard
> +                * wakeups by default.  That is consistent with keyboard
> +                * wakeup behavior on many platforms using suspend-to-RAM
> +                * (ACPI S3) by default.
> +                */
> +               if (mem_sleep_current == PM_SUSPEND_TO_IDLE

On a second thought, it may be better to use mem_sleep_default here.

And you need to provide an empty stub for it for !CONFIG_SUSPEND.

It may be even better to have a wrapper function around it, something
like pm_default_s2idle() maybe?

> +                   && i == I8042_KBD_PORT_NO)
> +                       device_set_wakeup_enable(&serio->dev, true);
>         }
>  }
>
> --



[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux