Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp3316972rdg; Tue, 17 Oct 2023 10:42:04 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEz6AFhZLw459XbDhqq+RBYBzrK1Oxw6PkW2uY4VIyV+SVhhywBO3tk7f5Gu24c36KVuVdb X-Received: by 2002:a17:902:e74b:b0:1c5:cbfb:c166 with SMTP id p11-20020a170902e74b00b001c5cbfbc166mr3843602plf.37.1697564524171; Tue, 17 Oct 2023 10:42:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697564524; cv=none; d=google.com; s=arc-20160816; b=teLVsB+DLphgJuZv0d0rCVnzxShxuXAGxLDo+5CljmKuHfCY9+OLOYgAr1L/N3Ti7P +d4OKVToUNohlIbvUhNXTZQfY5fJdkOrazAKm596F365oLnlVOY9QRPNlSi2Lhd0nBaQ k9oQzHX0Cb3bgUAdFPBV0Tz/ic1E34hD0g4zxRsIHRkIaM+OLeLbiNNg+HO9YoavnvwY JEHW3OHW9CgkLAz89m9UIJ+hNi12KZ/a8v8stRWAnmAwWFqw+QWrRZl/e1LY9m8hvQUM uvicno9X4I3At34grvgVDwUDqZKF0h+IO0R4EGy/ymyVK80Z3/ZlbzGE5LLxSi1ctyDc s4jA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=1Pn9eJVdwl+J/sFLPoMCtNv2U3ugpV05N/p/0aVkH1Y=; fh=W1TmXGI3DemDjtbW3Wndkl3aq8lkX1y/lWa61RkOC18=; b=wlW61aU0ydRbb1vtLrDO8fmzrboSI10GnoDeKm4YcPXYvgRLoFXLq7yruoFvqks2PM ZinxNq+sSxT/Iy8pREv7+OidWdMIKnlrF2NNlKvz+/5NAPhxTVkJQblWGYlVNe1FEZqO pQOdZyrumG46UAvPn24HL6Cdx9KZAWjJWc0FJwGrYIuPB5zjbuDkub70GvnuIRtYvPCD 2irDxqUDrUmr0JAGHcSNqoMzybnlkRshNzSvZrEflCDB+OP4llgxfUc9IVWdepOGCm7s 959sRlG2fWYfz6oay1NEaAE3CtKL1J1+IwkDnCHhyxVzYqnvwGZGwpTrFQIHuqFt5XB5 xZQA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=EQqsSkgE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 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 howler.vger.email (howler.vger.email. [23.128.96.34]) by mx.google.com with ESMTPS id s24-20020a170902b19800b001bdd35033ebsi2021324plr.361.2023.10.17.10.42.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Oct 2023 10:42:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) client-ip=23.128.96.34; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=EQqsSkgE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 2FA7E80C9DC1; Tue, 17 Oct 2023 10:42:01 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343812AbjJQRlx (ORCPT + 99 others); Tue, 17 Oct 2023 13:41:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58974 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231868AbjJQRlw (ORCPT ); Tue, 17 Oct 2023 13:41:52 -0400 Received: from mail-ot1-x32e.google.com (mail-ot1-x32e.google.com [IPv6:2607:f8b0:4864:20::32e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B2939B0 for ; Tue, 17 Oct 2023 10:41:49 -0700 (PDT) Received: by mail-ot1-x32e.google.com with SMTP id 46e09a7af769-6c63117a659so3617982a34.0 for ; Tue, 17 Oct 2023 10:41:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1697564509; x=1698169309; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=1Pn9eJVdwl+J/sFLPoMCtNv2U3ugpV05N/p/0aVkH1Y=; b=EQqsSkgEz73UpHuuW8bi4OGC+Dy4Ytc+u56FiG+l2PmWzrAEEah3bDK3TJ6CyNKYvJ jqyUQK1OXZ/DibnIMY7iFCYBWm7TtUKtrr55u4lfcCGHCPOdHtP3rDTCPJI5y/sl2/+2 k9D7vBkBI9aroT575VbSvQ9WMAy4X1Xf4nHAo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697564509; x=1698169309; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=1Pn9eJVdwl+J/sFLPoMCtNv2U3ugpV05N/p/0aVkH1Y=; b=XurUN+d+j3dDRC3dtuZBhusvjd44WKmZkmCnO8pO1pBl6/sabIhz3xx+TE+TE2WKRI 9656BvH0UIeRwrNMTR6JVz0VOMp57Y+OMYiZbT+WeHShkEBhBhMO7Hoizkvv/kh7Tqer ajd43wr12RS36y9jxkp97hVGsfBTiEUAIXQehoSdZy8NRTaXMuu3cxsikNiMOTPtDtnS o8Qkf/lxRUF/Ccrvih+dw8bYIkN31sec3aC6BUrWltIts76qdheZZzKYOteIXNu4pQXe BDvfEcFtF4WI759Gw2GwaPlR0qs4x0y6v2Nhd98xZH4KHJrRNK9i82su4OTZCexL0QBX oNhA== X-Gm-Message-State: AOJu0Yz05lT+B0wrMUlJCuco/ZWYwYA1G5BFjczZezCkE3+LRXiUUtUZ itZf25LFSIQClyC0RUJvjPQeXO5BxntXUTOe/vQ= X-Received: by 2002:a05:6830:118b:b0:6b9:62f5:ac62 with SMTP id u11-20020a056830118b00b006b962f5ac62mr2715609otq.35.1697564508798; Tue, 17 Oct 2023 10:41:48 -0700 (PDT) Received: from lalithkraj-glaptop.corp.google.com ([2620:15c:2a:201:f4f7:57a:9a7d:3e2e]) by smtp.gmail.com with ESMTPSA id m16-20020a9d6090000000b006c20f55525esm339246otj.1.2023.10.17.10.41.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Oct 2023 10:41:48 -0700 (PDT) From: Lalith Rajendran To: LKML Cc: Lalith Rajendran , Benson Leung , Guenter Roeck , Tzung-Bi Shih , chrome-platform@lists.linux.dev Subject: [PATCH v1] FROMLIST: platform/chrome: cros_ec_lpc: Separate host command and irq disable Date: Tue, 17 Oct 2023 12:40:48 -0500 Message-ID: <20231017124047.1.Icc99145043c8d44142bb5ca64ea4c63a417c267b@changeid> X-Mailer: git-send-email 2.42.0.655.g421f12c284-goog MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Tue, 17 Oct 2023 10:42:01 -0700 (PDT) Both cros host command and irq disable were moved to suspend prepare stage from late suspend recently. This is causing EC to report MKBP event timeouts during suspend stress testing. When the MKBP event timeouts happen during suspend, subsequent wakeup of AP by EC using MKBP doesn't happen properly. Although there are other issues to debug here, this change move the irq disabling part back to late suspend stage which is a general suggestion from the suspend kernel documentaiton to do irq disable as late as possible. Signed-off-by: Lalith Rajendran --- drivers/platform/chrome/cros_ec.c | 120 +++++++++++++++++++++----- drivers/platform/chrome/cros_ec.h | 4 + drivers/platform/chrome/cros_ec_lpc.c | 22 ++++- 3 files changed, 120 insertions(+), 26 deletions(-) diff --git a/drivers/platform/chrome/cros_ec.c b/drivers/platform/chrome/cros_ec.c index 5d36fbc75e1b..e18ee397bf0e 100644 --- a/drivers/platform/chrome/cros_ec.c +++ b/drivers/platform/chrome/cros_ec.c @@ -321,17 +321,8 @@ void cros_ec_unregister(struct cros_ec_device *ec_dev) EXPORT_SYMBOL(cros_ec_unregister); #ifdef CONFIG_PM_SLEEP -/** - * cros_ec_suspend() - Handle a suspend operation for the ChromeOS EC device. - * @ec_dev: Device to suspend. - * - * This can be called by drivers to handle a suspend event. - * - * Return: 0 on success or negative error code. - */ -int cros_ec_suspend(struct cros_ec_device *ec_dev) +static int cros_ec_send_suspend_event(struct cros_ec_device *ec_dev) { - struct device *dev = ec_dev->dev; int ret; u8 sleep_event; @@ -343,7 +334,26 @@ int cros_ec_suspend(struct cros_ec_device *ec_dev) if (ret < 0) dev_dbg(ec_dev->dev, "Error %d sending suspend event to ec\n", ret); + return 0; +} +/** + * cros_ec_suspend_prepare() - Handle a suspend prepare operation for the ChromeOS EC device. + * @ec_dev: Device to suspend. + * + * This can be called by drivers to handle a suspend prepare stage of suspend. + * + * Return: 0 on success or negative error code. + */ +int cros_ec_suspend_prepare(struct cros_ec_device *ec_dev) +{ + return cros_ec_send_suspend_event(ec_dev); +} +EXPORT_SYMBOL(cros_ec_suspend_prepare); + +static int cros_ec_disable_irq(struct cros_ec_device *ec_dev) +{ + struct device *dev = ec_dev->dev; if (device_may_wakeup(dev)) ec_dev->wake_enabled = !enable_irq_wake(ec_dev->irq); else @@ -354,6 +364,35 @@ int cros_ec_suspend(struct cros_ec_device *ec_dev) return 0; } + +/** + * cros_ec_suspend_late() - Handle a suspend late operation for the ChromeOS EC device. + * @ec_dev: Device to suspend. + * + * This can be called by drivers to handle a suspend late stage of suspend. + * + * Return: 0 on success or negative error code. + */ +int cros_ec_suspend_late(struct cros_ec_device *ec_dev) +{ + return cros_ec_disable_irq(ec_dev); +} +EXPORT_SYMBOL(cros_ec_suspend_late); + +/** + * cros_ec_suspend() - Handle a suspend operation for the ChromeOS EC device. + * @ec_dev: Device to suspend. + * + * This can be called by drivers to handle a suspend event. + * + * Return: 0 on success or negative error code. + */ +int cros_ec_suspend(struct cros_ec_device *ec_dev) +{ + cros_ec_send_suspend_event(ec_dev); + cros_ec_disable_irq(ec_dev); + return 0; +} EXPORT_SYMBOL(cros_ec_suspend); static void cros_ec_report_events_during_suspend(struct cros_ec_device *ec_dev) @@ -370,22 +409,11 @@ static void cros_ec_report_events_during_suspend(struct cros_ec_device *ec_dev) } } -/** - * cros_ec_resume() - Handle a resume operation for the ChromeOS EC device. - * @ec_dev: Device to resume. - * - * This can be called by drivers to handle a resume event. - * - * Return: 0 on success or negative error code. - */ -int cros_ec_resume(struct cros_ec_device *ec_dev) +static int cros_ec_send_resume_event(struct cros_ec_device *ec_dev) { int ret; u8 sleep_event; - ec_dev->suspended = false; - enable_irq(ec_dev->irq); - sleep_event = (!IS_ENABLED(CONFIG_ACPI) || pm_suspend_via_firmware()) ? HOST_SLEEP_EVENT_S3_RESUME : HOST_SLEEP_EVENT_S0IX_RESUME; @@ -394,6 +422,25 @@ int cros_ec_resume(struct cros_ec_device *ec_dev) if (ret < 0) dev_dbg(ec_dev->dev, "Error %d sending resume event to ec\n", ret); + return 0; +} + +/** + * cros_ec_resume_complete() - Handle a resume complete operation for the ChromeOS EC device. + * @ec_dev: Device to resume. + * + * This can be called by drivers to handle a resume complete stage of resume. + */ +void cros_ec_resume_complete(struct cros_ec_device *ec_dev) +{ + cros_ec_send_resume_event(ec_dev); +} +EXPORT_SYMBOL(cros_ec_resume_complete); + +static int cros_ec_enable_irq(struct cros_ec_device *ec_dev) +{ + ec_dev->suspended = false; + enable_irq(ec_dev->irq); if (ec_dev->wake_enabled) disable_irq_wake(ec_dev->irq); @@ -407,6 +454,35 @@ int cros_ec_resume(struct cros_ec_device *ec_dev) return 0; } + +/** + * cros_ec_resume_early() - Handle a resume early operation for the ChromeOS EC device. + * @ec_dev: Device to resume. + * + * This can be called by drivers to handle a resume early stage of resume. + * + * Return: 0 on success or negative error code. + */ +int cros_ec_resume_early(struct cros_ec_device *ec_dev) +{ + return cros_ec_enable_irq(ec_dev); +} +EXPORT_SYMBOL(cros_ec_resume_early); + +/** + * cros_ec_resume() - Handle a resume operation for the ChromeOS EC device. + * @ec_dev: Device to resume. + * + * This can be called by drivers to handle a resume event. + * + * Return: 0 on success or negative error code. + */ +int cros_ec_resume(struct cros_ec_device *ec_dev) +{ + cros_ec_enable_irq(ec_dev); + cros_ec_send_resume_event(ec_dev); + return 0; +} EXPORT_SYMBOL(cros_ec_resume); #endif diff --git a/drivers/platform/chrome/cros_ec.h b/drivers/platform/chrome/cros_ec.h index bbca0096868a..566332f48789 100644 --- a/drivers/platform/chrome/cros_ec.h +++ b/drivers/platform/chrome/cros_ec.h @@ -14,7 +14,11 @@ int cros_ec_register(struct cros_ec_device *ec_dev); void cros_ec_unregister(struct cros_ec_device *ec_dev); int cros_ec_suspend(struct cros_ec_device *ec_dev); +int cros_ec_suspend_late(struct cros_ec_device *ec_dev); +int cros_ec_suspend_prepare(struct cros_ec_device *ec_dev); int cros_ec_resume(struct cros_ec_device *ec_dev); +int cros_ec_resume_early(struct cros_ec_device *ec_dev); +void cros_ec_resume_complete(struct cros_ec_device *ec_dev); irqreturn_t cros_ec_irq_thread(int irq, void *data); diff --git a/drivers/platform/chrome/cros_ec_lpc.c b/drivers/platform/chrome/cros_ec_lpc.c index 9083a7d58d53..ed498278a223 100644 --- a/drivers/platform/chrome/cros_ec_lpc.c +++ b/drivers/platform/chrome/cros_ec_lpc.c @@ -560,22 +560,36 @@ MODULE_DEVICE_TABLE(dmi, cros_ec_lpc_dmi_table); static int cros_ec_lpc_prepare(struct device *dev) { struct cros_ec_device *ec_dev = dev_get_drvdata(dev); - - return cros_ec_suspend(ec_dev); + return cros_ec_suspend_prepare(ec_dev); } static void cros_ec_lpc_complete(struct device *dev) { struct cros_ec_device *ec_dev = dev_get_drvdata(dev); - cros_ec_resume(ec_dev); + cros_ec_resume_complete(ec_dev); +} + +static int cros_ec_lpc_suspend_late(struct device *dev) +{ + struct cros_ec_device *ec_dev = dev_get_drvdata(dev); + + return cros_ec_suspend_late(ec_dev); +} + +static int cros_ec_lpc_resume_early(struct device *dev) +{ + struct cros_ec_device *ec_dev = dev_get_drvdata(dev); + + return cros_ec_resume_early(ec_dev); } #endif static const struct dev_pm_ops cros_ec_lpc_pm_ops = { #ifdef CONFIG_PM_SLEEP .prepare = cros_ec_lpc_prepare, - .complete = cros_ec_lpc_complete + .complete = cros_ec_lpc_complete, #endif + SET_LATE_SYSTEM_SLEEP_PM_OPS(cros_ec_lpc_suspend_late, cros_ec_lpc_resume_early) }; static struct platform_driver cros_ec_lpc_driver = { -- 2.42.0.655.g421f12c284-goog