Skip to content

Commit 38ba34a

Browse files
Ravi Chandra Sadinenidtor
authored andcommitted
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 <[email protected]> Signed-off-by: Dmitry Torokhov <[email protected]>
1 parent cbd606e commit 38ba34a

File tree

2 files changed

+28
-24
lines changed

2 files changed

+28
-24
lines changed

drivers/input/keyboard/cros_ec_keyb.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -244,37 +244,45 @@ static int cros_ec_keyb_work(struct notifier_block *nb,
244244

245245
switch (ckdev->ec->event_data.event_type) {
246246
case EC_MKBP_EVENT_KEY_MATRIX:
247-
/*
248-
* If EC is not the wake source, discard key state changes
249-
* during suspend.
250-
*/
251-
if (queued_during_suspend)
252-
return NOTIFY_OK;
247+
if (device_may_wakeup(ckdev->dev)) {
248+
pm_wakeup_event(ckdev->dev, 0);
249+
} else {
250+
/*
251+
* If keyboard is not wake enabled, discard key state
252+
* changes during suspend. Switches will be re-checked
253+
* in cros_ec_keyb_resume() to be sure nothing is lost.
254+
*/
255+
if (queued_during_suspend)
256+
return NOTIFY_OK;
257+
}
253258

254259
if (ckdev->ec->event_size != ckdev->cols) {
255260
dev_err(ckdev->dev,
256261
"Discarded incomplete key matrix event.\n");
257262
return NOTIFY_OK;
258263
}
264+
259265
cros_ec_keyb_process(ckdev,
260266
ckdev->ec->event_data.data.key_matrix,
261267
ckdev->ec->event_size);
262268
break;
263269

264270
case EC_MKBP_EVENT_SYSRQ:
271+
if (device_may_wakeup(ckdev->dev))
272+
pm_wakeup_event(ckdev->dev, 0);
273+
else if (queued_during_suspend)
274+
return NOTIFY_OK;
275+
265276
val = get_unaligned_le32(&ckdev->ec->event_data.data.sysrq);
266277
dev_dbg(ckdev->dev, "sysrq code from EC: %#x\n", val);
267278
handle_sysrq(val);
268279
break;
269280

270281
case EC_MKBP_EVENT_BUTTON:
271282
case EC_MKBP_EVENT_SWITCH:
272-
/*
273-
* If EC is not the wake source, discard key state
274-
* changes during suspend. Switches will be re-checked in
275-
* cros_ec_keyb_resume() to be sure nothing is lost.
276-
*/
277-
if (queued_during_suspend)
283+
if (device_may_wakeup(ckdev->dev))
284+
pm_wakeup_event(ckdev->dev, 0);
285+
else if (queued_during_suspend)
278286
return NOTIFY_OK;
279287

280288
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)
639647
return err;
640648
}
641649

650+
device_init_wakeup(ckdev->dev, true);
642651
return 0;
643652
}
644653

drivers/mfd/cros_ec.c

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ int cros_ec_suspend(struct cros_ec_device *ec_dev)
229229
}
230230
EXPORT_SYMBOL(cros_ec_suspend);
231231

232-
static void cros_ec_drain_events(struct cros_ec_device *ec_dev)
232+
static void cros_ec_report_events_during_suspend(struct cros_ec_device *ec_dev)
233233
{
234234
while (cros_ec_get_next_event(ec_dev, NULL) > 0)
235235
blocking_notifier_call_chain(&ec_dev->event_notifier,
@@ -253,21 +253,16 @@ int cros_ec_resume(struct cros_ec_device *ec_dev)
253253
dev_dbg(ec_dev->dev, "Error %d sending resume event to ec",
254254
ret);
255255

256-
/*
257-
* In some cases, we need to distinguish between events that occur
258-
* during suspend if the EC is not a wake source. For example,
259-
* keypresses during suspend should be discarded if it does not wake
260-
* the system.
261-
*
262-
* If the EC is not a wake source, drain the event queue and mark them
263-
* as "queued during suspend".
264-
*/
265256
if (ec_dev->wake_enabled) {
266257
disable_irq_wake(ec_dev->irq);
267258
ec_dev->wake_enabled = 0;
268-
} else {
269-
cros_ec_drain_events(ec_dev);
270259
}
260+
/*
261+
* Let the mfd devices know about events that occur during
262+
* suspend. This way the clients know what to do with them.
263+
*/
264+
cros_ec_report_events_during_suspend(ec_dev);
265+
271266

272267
return 0;
273268
}

0 commit comments

Comments
 (0)