diff options
author | Ravi Chandra Sadineni <ravisadineni@chromium.org> | 2018-05-30 22:22:04 +0300 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2018-05-31 02:42:12 +0300 |
commit | 38ba34a43dbc00c87d13d1c4b6d0719a2ac87b2e (patch) | |
tree | 5279be593f866181bfa759a135963d180cbfc6f8 /drivers/input/keyboard | |
parent | cbd606ec9feff7c428cfec9b4a90a6b5e6744c31 (diff) |
Input: cros_ec_keyb - mark cros_ec_keyb driver as wake enabled device.
Mark cros_ec_keyb has wake enabled by default. If we see a MKBP event
related to keyboard, call pm_wakeup_event() to make sure wakeup
triggers are accounted to keyb during suspend resume path.
Signed-off-by: Ravi Chandra Sadineni <ravisadineni@chromium.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/keyboard')
-rw-r--r-- | drivers/input/keyboard/cros_ec_keyb.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c index 79eb29550c34..489ddd37bd4e 100644 --- a/drivers/input/keyboard/cros_ec_keyb.c +++ b/drivers/input/keyboard/cros_ec_keyb.c @@ -244,24 +244,35 @@ static int cros_ec_keyb_work(struct notifier_block *nb, switch (ckdev->ec->event_data.event_type) { case EC_MKBP_EVENT_KEY_MATRIX: - /* - * If EC is not the wake source, discard key state changes - * during suspend. - */ - if (queued_during_suspend) - return NOTIFY_OK; + if (device_may_wakeup(ckdev->dev)) { + pm_wakeup_event(ckdev->dev, 0); + } else { + /* + * If keyboard is not wake enabled, discard key state + * changes during suspend. Switches will be re-checked + * in cros_ec_keyb_resume() to be sure nothing is lost. + */ + if (queued_during_suspend) + return NOTIFY_OK; + } if (ckdev->ec->event_size != ckdev->cols) { dev_err(ckdev->dev, "Discarded incomplete key matrix event.\n"); return NOTIFY_OK; } + cros_ec_keyb_process(ckdev, ckdev->ec->event_data.data.key_matrix, ckdev->ec->event_size); break; case EC_MKBP_EVENT_SYSRQ: + if (device_may_wakeup(ckdev->dev)) + pm_wakeup_event(ckdev->dev, 0); + else if (queued_during_suspend) + return NOTIFY_OK; + val = get_unaligned_le32(&ckdev->ec->event_data.data.sysrq); dev_dbg(ckdev->dev, "sysrq code from EC: %#x\n", val); handle_sysrq(val); @@ -269,12 +280,9 @@ static int cros_ec_keyb_work(struct notifier_block *nb, case EC_MKBP_EVENT_BUTTON: case EC_MKBP_EVENT_SWITCH: - /* - * If EC is not the wake source, discard key state - * changes during suspend. Switches will be re-checked in - * cros_ec_keyb_resume() to be sure nothing is lost. - */ - if (queued_during_suspend) + if (device_may_wakeup(ckdev->dev)) + pm_wakeup_event(ckdev->dev, 0); + else if (queued_during_suspend) return NOTIFY_OK; if (ckdev->ec->event_data.event_type == EC_MKBP_EVENT_BUTTON) { @@ -639,6 +647,7 @@ static int cros_ec_keyb_probe(struct platform_device *pdev) return err; } + device_init_wakeup(ckdev->dev, true); return 0; } |