From patchwork Wed Jun 21 19:21:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 106123 Delivered-To: patches@linaro.org Received: by 10.140.91.2 with SMTP id y2csp2092701qgd; Wed, 21 Jun 2017 12:22:00 -0700 (PDT) X-Received: by 10.46.5.20 with SMTP id 20mr10798572ljf.34.1498072920146; Wed, 21 Jun 2017 12:22:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1498072920; cv=none; d=google.com; s=arc-20160816; b=DwUv1lCSdoU/PdJDDKjr0muLvnt9t2TqG49QAZNmZ9mSlfTcWIM3vqs79Ekqg53H62 XdTq2EQX6n8nWQCavV3fW6R6r1/SkE6/uFg+IezlfntCksBtjDILAsVJkgop4YTui032 wlzvhrwGjalwXyAWLSggrVO8SSd4BxQf1sKAROWvCWiY98bGk9L85adIK1wZ1rWU96md NPAvso8ePtjcAQt5t7zWXkGvwqBan3TDTSwRkcynwtMtEd+GEu5hinzh0NCn4Xe+QYba LLyc3NQe98Yb1d2g3KiFRDtCRWP6i/y5TtqIt1WrmckDHaYz25Itmz74cPyWZP7rlP2d 6oTw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=gQ0z6uQZXEMVLPfg2GRn6Y71LvqWlZHeak/YrTUGnt4=; b=t7I4oePds1aKzmYnLQw5d49m1aKqS5dnLMBqC2CSFvRAGlnaG5DD6VaRmS8HjBNIOH rKyGj9IlzLXTi7KKQTXo/KKgtkCVudQqKyDIwseo1nSjwRTgHwJdFlB2FP7C1VtFiemO vEsh83ZWLW/kCy/Y6yFUIp4yi5leyJvCy/JMW6hBkMQ27aEbpM/XFZO2nXoEC9QeS88e 1AaoLF572o4PrBkMmtXKfNCsxQDVkhu3MY3VJF49XpDwcBPvQdXhZsrRgQmQUqtKP0tJ P7oNhgXMusu+bnwOHHRbZv2Mrm8OPPTiWB4n26nTEr+6ryZXFn5bNeVUKcET0dPwAw48 TwFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=SPk29lmN; spf=pass (google.com: domain of ulf.hansson@linaro.org designates 2a00:1450:4010:c07::230 as permitted sender) smtp.mailfrom=ulf.hansson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-lf0-x230.google.com (mail-lf0-x230.google.com. [2a00:1450:4010:c07::230]) by mx.google.com with ESMTPS id x5si8979074lfa.188.2017.06.21.12.21.59 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Jun 2017 12:22:00 -0700 (PDT) Received-SPF: pass (google.com: domain of ulf.hansson@linaro.org designates 2a00:1450:4010:c07::230 as permitted sender) client-ip=2a00:1450:4010:c07::230; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.b=SPk29lmN; spf=pass (google.com: domain of ulf.hansson@linaro.org designates 2a00:1450:4010:c07::230 as permitted sender) smtp.mailfrom=ulf.hansson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: by mail-lf0-x230.google.com with SMTP id p189so102986166lfe.2 for ; Wed, 21 Jun 2017 12:21:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gQ0z6uQZXEMVLPfg2GRn6Y71LvqWlZHeak/YrTUGnt4=; b=SPk29lmNM/olTnoR6riPwVRdcsRAEOODzwFzN7MaybsAnsZhxnNYpc41QGwDSXhk9u uGuIFltxl3D7vuzACyyGt8MkpvMV4+MQxJZ7OdZLMtfkyKx8P8VB8BdslWqqoorfhvIt xUfj2GF0Qjd9Y7xrZQlqPo/d1+QWALNgbyOr0= 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:in-reply-to :references; bh=gQ0z6uQZXEMVLPfg2GRn6Y71LvqWlZHeak/YrTUGnt4=; b=Mub5usSgyWv3BLpNOIu9FVTHA+VSGZQR50IST0VsCy97qUnKmzgqGRcBvj3zUP6AYW XbW6xIn7lStdwNKzpQEqMaMJZ8ETBXdAM5d9c2j94dDsz5HRs4V7rnnkIJufZbtJljhU v+c2wBGbgErWOSioyiTlltZvIADHVNYBOLDMECZlt91eae+sNhA00WWINnRxrCiTBEzR 2j28/0YWkIcrQVV+ZQ8Z0pxVplofjzsMlYRjpxnDJy6+xGik0cM2eioTw8RPD6P4cl+b l4dfaAEwkn8UR8T3QFCxRaAgfeBaEu9AaOFONh4iwp5yWJz/bepKh4RoSBZMd3KguzJC w1ZA== X-Gm-Message-State: AKS2vOwq77yyl5U/6+3PEnINEF/8FTDCcJcdr1ssQkCMDGul4Yvk78tB W3hqsU5ys9x4njsN4r8= X-Received: by 10.46.69.212 with SMTP id s203mr11199810lja.67.1498072919669; Wed, 21 Jun 2017 12:21:59 -0700 (PDT) Return-Path: Received: from localhost.localdomain (h-158-174-22-67.NA.cust.bahnhof.se. [158.174.22.67]) by smtp.gmail.com with ESMTPSA id t24sm3920047ljd.1.2017.06.21.12.21.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 21 Jun 2017 12:21:58 -0700 (PDT) From: Ulf Hansson To: Wolfram Sang , "Rafael J . Wysocki" , Len Brown , linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org Cc: Kevin Hilman , Jarkko Nikula , Andy Shevchenko , Mika Westerberg , Jisheng Zhang , John Stultz , Guodong Xu , Sumit Semwal , Haojian Zhuang , linux-arm-kernel@lists.infradead.org, linux-i2c@vger.kernel.org, Ulf Hansson Subject: [PATCH 9/9] i2c: designware: Deploy the runtime PM centric approach for system sleep Date: Wed, 21 Jun 2017 21:21:28 +0200 Message-Id: <1498072888-14782-10-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1498072888-14782-1-git-send-email-ulf.hansson@linaro.org> References: <1498072888-14782-1-git-send-email-ulf.hansson@linaro.org> Currently we runtime resume the device in the ->prepare() callback to make sure we manage system sleep properly. The earlier attempt to avoid that, as it's surely a waste in many situations, was based upon using the direct_complete path during system sleep. However, that failed because we could end up having the ->suspend() callback being invoked when the device was runtime suspended, causing calls for clock enable/disable and clock prepare/unprepare to become unbalanced. Deploying the runtime PM centric approach, via using the pm_runtime_force_suspend|resume() helpers as the system sleep callbacks, improves the behavior in the following regards: *) It avoids runtime resuming the device in the ->prepare() callback. **) The device remains runtime PM enabled during the device_suspend() phase, which thus makes it possible for users to send i2c transfers this entire phase. ***) It doesn't unnecessary runtime resume the device during system suspend, but allows the device to remain runtime suspended if that is possible. ****) It avoids to bring the device back to full power during system resume, unless really needed. Instead this task may get postponed to be managed by runtime PM. In case when the i2c device is attached to the ACPI PM domain, we need to inform ACPI to adapt its behavior for the runtime PM centric path during system sleep, which is done by calling acpi_dev_disable_direct_complete(). Worth to notice, comparing the earlier attempt of using the direct_complete() approach is that **) couldn't be supported and ****) relied on the device to be runtime suspended in the device_suspend() phase. Signed-off-by: Ulf Hansson --- drivers/i2c/busses/i2c-designware-platdrv.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) -- 2.7.4 diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 2b7fa75..b6e05ba 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -331,6 +331,8 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) if (r) goto exit_probe; + acpi_dev_disable_direct_complete(&pdev->dev); + return r; exit_probe: @@ -346,6 +348,7 @@ static int dw_i2c_plat_remove(struct platform_device *pdev) { struct dw_i2c_dev *dev = platform_get_drvdata(pdev); + acpi_dev_enable_direct_complete(&pdev->dev); pm_runtime_get_sync(&pdev->dev); i2c_del_adapter(&dev->adapter); @@ -372,18 +375,8 @@ static const struct of_device_id dw_i2c_of_match[] = { MODULE_DEVICE_TABLE(of, dw_i2c_of_match); #endif -#ifdef CONFIG_PM_SLEEP -static int dw_i2c_plat_prepare(struct device *dev) -{ - pm_runtime_resume(dev); - return 0; -} -#else -#define dw_i2c_plat_prepare NULL -#endif - #ifdef CONFIG_PM -static int dw_i2c_plat_suspend(struct device *dev) +static int dw_i2c_plat_runtime_suspend(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev); @@ -394,7 +387,7 @@ static int dw_i2c_plat_suspend(struct device *dev) return 0; } -static int dw_i2c_plat_resume(struct device *dev) +static int dw_i2c_plat_runtime_resume(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev); @@ -406,9 +399,11 @@ static int dw_i2c_plat_resume(struct device *dev) } static const struct dev_pm_ops dw_i2c_dev_pm_ops = { - .prepare = dw_i2c_plat_prepare, - SET_SYSTEM_SLEEP_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume) - SET_RUNTIME_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume, NULL) + SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(dw_i2c_plat_runtime_suspend, + dw_i2c_plat_runtime_resume, + NULL) }; #define DW_I2C_DEV_PMOPS (&dw_i2c_dev_pm_ops)