diff options
-rw-r--r-- | drivers/mfd/cros_ec.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/mfd/cros_ec.c b/drivers/mfd/cros_ec.c index c982b81af926..d770843714ec 100644 --- a/drivers/mfd/cros_ec.c +++ b/drivers/mfd/cros_ec.c @@ -406,15 +406,25 @@ u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev) static irqreturn_t ec_irq_thread(int irq, void *data) { struct cros_ec_device *ec_dev = data; - int ret; - - if (device_may_wakeup(ec_dev->dev)) - pm_wakeup_event(ec_dev->dev, 0); + int ret, wake_event = 1; - if (ec_dev->mkbp_event_supported) + if (ec_dev->mkbp_event_supported) { ret = cros_ec_get_next_event(ec_dev); - else + if (ec_dev->event_data.event_type == EC_MKBP_EVENT_SENSOR_FIFO) { + /* + * While we are suspending, we may still receive + * sensor information on the wake up interrupt line. + * Ignore wake up event (significant motion) until we + * are fully suspended. + */ + wake_event = 0; + } + } else { ret = cros_ec_get_keyboard_state_event(ec_dev); + } + + if (device_may_wakeup(ec_dev->dev) && wake_event) + pm_wakeup_event(ec_dev->dev, 0); if (ret > 0) blocking_notifier_call_chain(&ec_dev->event_notifier, |