Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp1177663imm; Wed, 23 May 2018 11:31:54 -0700 (PDT) X-Google-Smtp-Source: AB8JxZq0AXz9m7vC9FKVXrGH7yy0z6kGrDqOPgjiSoX39Xhgh7jzJw607ui4a3ZrhN9BifAq8e5m X-Received: by 2002:a65:4b49:: with SMTP id k9-v6mr3140836pgt.369.1527100314293; Wed, 23 May 2018 11:31:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527100314; cv=none; d=google.com; s=arc-20160816; b=Q8i2UInrI/oVPg+06EVOnLCV4egHzpHHVTjdSAnsjYlqcLPZkBo06HlxRRZ4DGaJq9 7eyyBEgBKMLM5WIvxBrehfn1W+9F1nj6bhfQ0dNSVW75YkDu/BIOiOzlBwV7BKheVQTT 6oqglBTbO+6rl6kc1YZNFbIenBwALdKpWked5IHfgU0/NzGqhmIF8tKBNvX7h5kbbl30 RtEzRgnzjwi+aZiAqKusb4OJhQXXI1mhM58lXHAouLbcppz67+MICTFkq7R2nXSnmcs9 lXnhoB+fE7QUP64JCJPUxjooapdMti+7jAwgA44wVF2eE+DJZ1ccl5YFq8OVbiqmilCQ A0DA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=zmnoAhTTRhXeJ9lF8QLMRP1Rxh5H864FyY9IIffgPrY=; b=K5irYNOcYO6lhuQen8xrI+3XqUim54PRenOZss/5L8WRh7offoudsvNOoNvOJrUTH5 JaU4hw6W4EqiVuSpKUmtzKY+uMSODCVPL9qQmVtLBJhajBrYZpoch4HeWgAXu8fWlUnG cNTWG9hQcSHs7p6oEyVNTVH1MeMQwQh2Go3V9ushAmuy+wW9WeMSOSSZxG8py+hLuUV+ /+5x7MHOWBOOR1syw/PHxLOvO38h+H3jDAg0LAxiCSJbXhKve2y5CiU7cOt/bqu2kptT vtq4Kcs5Ja8YeaE/neqcYkrQB2SSC9UE6FLP72/TZq6ICSZEuCEft3ZGgYq+wbzPZPY5 iGZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=J/4piaB+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p83-v6si20263322pfl.279.2018.05.23.11.31.38; Wed, 23 May 2018 11:31:54 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=J/4piaB+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933897AbeEWSaY (ORCPT + 99 others); Wed, 23 May 2018 14:30:24 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:33632 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933638AbeEWSaV (ORCPT ); Wed, 23 May 2018 14:30:21 -0400 Received: by mail-pl0-f66.google.com with SMTP id n10-v6so13542461plp.0 for ; Wed, 23 May 2018 11:30:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id; bh=zmnoAhTTRhXeJ9lF8QLMRP1Rxh5H864FyY9IIffgPrY=; b=J/4piaB+n5o3JTFYusgPolvIioDR+BuPRJtAq0aGmPTRAfaoZMajrcYjbNU2P62lJA /7g9nG4qjtC5ewmGeCsR7W7H0DfOMJC0IzNVIW6wGi1x4sHiocKYMfMT/NpXuFnJnpGf BOOD09JTv4/9a7knQFseSebSRM3OGhLMCJxYY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=zmnoAhTTRhXeJ9lF8QLMRP1Rxh5H864FyY9IIffgPrY=; b=jCL+xX7EZ3qa0pj8o4pOf3WpxD0Ma8eWi68OerFiReDXwRVNmHoUvYMCrw88A8ddhO AopU7hpMCRFkL8Gg+Ee9Y+T//C3kBCYYTWjkqFTM7+Qnms//APPP9+C0RL/MmBDzOMls fKlPJJQFt06+Kq2b3TFIV7EqT5s+j0hkrjUimKlzE3bNnjfrnqHLHagHkq6vqEnJkfYZ VgIxhH7ey4Kv6fETdfi+5a4pM1grePMyBJa9BWnWsNwTWZAbDm9lcjZXJqvIGPjs0Gxl EDIvQ3pu3UWvAeEq0Pr1W9vATTt5CMw1ZY6P9nCJec04eQD/xDg6Tchz+dxPSEo9dOW+ KdOQ== X-Gm-Message-State: ALKqPwctyydY9znwItlLGyQiFrOJTeSA2YVIcZRizXIsWgbikNtBkpoU 0Se/WC5qnj/z3ij5q7it8qGLAw== X-Received: by 2002:a17:902:a512:: with SMTP id s18-v6mr3969260plq.223.1527100221209; Wed, 23 May 2018 11:30:21 -0700 (PDT) Received: from ravisadineni0.mtv.corp.google.com ([2620:0:1000:1501:1f1:adfa:a458:823f]) by smtp.gmail.com with ESMTPSA id u86-v6sm41880109pfg.71.2018.05.23.11.30.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 23 May 2018 11:30:20 -0700 (PDT) From: Ravi Chandra Sadineni To: dmitry.torokhov@gmail.com, lee.jones@linaro.org, ravisadineni@chromium.org, ravisadineni@google.com, dtor@google.com Cc: tbroch@google.com, linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, rajatja@google.com, bleung@google.com Subject: [PATCH] cros_ec_keyb: Increment the wakeup count to the specific mfd device. Date: Wed, 23 May 2018 11:29:58 -0700 Message-Id: <20180523182958.25195-1-ravisadineni@chromium.org> X-Mailer: git-send-email 2.13.5 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If the IRQ is processed during resume, increment the wakeup count to the specific mfd device based on the event, if the mfd device is wake enabled. This helps in identifying the specific device that caused the wake. Signed-off-by: Ravi Chandra Sadineni --- drivers/input/keyboard/cros_ec_keyb.c | 20 +++++++++++++++----- drivers/mfd/cros_ec.c | 25 +++++++++++-------------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c index 79eb29550c348..9b39289774405 100644 --- a/drivers/input/keyboard/cros_ec_keyb.c +++ b/drivers/input/keyboard/cros_ec_keyb.c @@ -245,12 +245,16 @@ 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 keyb input device is not wake enabled, discard key + * state changes during suspend. */ - if (queued_during_suspend) + if (queued_during_suspend && ckdev->idev + && !device_may_wakeup(&ckdev->idev->dev)) return NOTIFY_OK; + else if (queued_during_suspend && ckdev->idev) + pm_wakeup_event(&ckdev->idev->dev, 0); + if (ckdev->ec->event_size != ckdev->cols) { dev_err(ckdev->dev, "Discarded incomplete key matrix event.\n"); @@ -270,13 +274,17 @@ 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 + * If bs 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) + if (queued_during_suspend && ckdev->bs_idev + && !device_may_wakeup(&ckdev->bs_idev->dev)) return NOTIFY_OK; + else if (queued_during_suspend && ckdev->bs_idev) + pm_wakeup_event(&ckdev->bs_idev->dev, 0); + if (ckdev->ec->event_data.event_type == EC_MKBP_EVENT_BUTTON) { val = get_unaligned_le32( &ckdev->ec->event_data.data.buttons); @@ -522,6 +530,7 @@ static int cros_ec_keyb_register_bs(struct cros_ec_keyb *ckdev) return ret; } + device_init_wakeup(&idev->dev, true); return 0; } @@ -598,6 +607,7 @@ static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev) return err; } + device_init_wakeup(&idev->dev, true); return 0; } diff --git a/drivers/mfd/cros_ec.c b/drivers/mfd/cros_ec.c index d61024141e2b6..df9520365e54b 100644 --- a/drivers/mfd/cros_ec.c +++ b/drivers/mfd/cros_ec.c @@ -64,12 +64,14 @@ static irqreturn_t ec_irq_thread(int irq, void *data) * cros_ec_get_next_event() returned an error (default value for * wake_event is true) */ - if (wake_event && device_may_wakeup(ec_dev->dev)) + if (device_may_wakeup(ec_dev->dev) && wake_event + && ec_dev->wake_enabled) pm_wakeup_event(ec_dev->dev, 0); if (ret > 0) blocking_notifier_call_chain(&ec_dev->event_notifier, - 0, ec_dev); + wake_event && ec_dev->wake_enabled, + ec_dev); return IRQ_HANDLED; } @@ -229,7 +231,7 @@ int cros_ec_suspend(struct cros_ec_device *ec_dev) } EXPORT_SYMBOL(cros_ec_suspend); -static void cros_ec_drain_events(struct cros_ec_device *ec_dev) +static void cros_ec_report_events_during_suspend(struct cros_ec_device *ec_dev) { while (cros_ec_get_next_event(ec_dev, NULL) > 0) blocking_notifier_call_chain(&ec_dev->event_notifier, @@ -253,21 +255,16 @@ int cros_ec_resume(struct cros_ec_device *ec_dev) dev_dbg(ec_dev->dev, "Error %d sending resume event to ec", ret); - /* - * In some cases, we need to distinguish between events that occur - * during suspend if the EC is not a wake source. For example, - * keypresses during suspend should be discarded if it does not wake - * the system. - * - * If the EC is not a wake source, drain the event queue and mark them - * as "queued during suspend". - */ if (ec_dev->wake_enabled) { disable_irq_wake(ec_dev->irq); ec_dev->wake_enabled = 0; - } else { - cros_ec_drain_events(ec_dev); } + /* + * Let the mfd devices know about events that occur during + * suspend. This way the clients know what to do with them. + */ + cros_ec_report_events_during_suspend(ec_dev); + return 0; } -- 2.17.0.441.gb46fe60e1d-goog