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); > } > } > > --