From patchwork Tue Jan 2 09:11:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Duan X-Patchwork-Id: 854469 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-i2c-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z9pM36f02z9rxj for ; Tue, 2 Jan 2018 20:15:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751274AbeABJPm (ORCPT ); Tue, 2 Jan 2018 04:15:42 -0500 Received: from mail-bn3nam01on0068.outbound.protection.outlook.com ([104.47.33.68]:47968 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751216AbeABJPk (ORCPT ); Tue, 2 Jan 2018 04:15:40 -0500 Received: from CY1PR03CA0041.namprd03.prod.outlook.com (10.174.128.51) by CO2PR03MB2359.namprd03.prod.outlook.com (10.166.93.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.366.8; Tue, 2 Jan 2018 09:15:38 +0000 Received: from BN1AFFO11FD037.protection.gbl (2a01:111:f400:7c10::174) by CY1PR03CA0041.outlook.office365.com (2603:10b6:600::51) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.366.8 via Frontend Transport; Tue, 2 Jan 2018 09:15:38 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1AFFO11FD037.mail.protection.outlook.com (10.58.52.241) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.345.12 via Frontend Transport; Tue, 2 Jan 2018 09:15:13 +0000 Received: from b54642-OptiPlex-3020.ap.freescale.net (b54642-OptiPlex-3020.ap.freescale.net [10.192.242.250]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id w029FYKU003762; Tue, 2 Jan 2018 02:15:35 -0700 From: Fugang Duan To: CC: , , , , Subject: [PATCH 1/1] i2c: imx-lpi2c: add runtime pm support Date: Tue, 2 Jan 2018 17:11:52 +0800 Message-ID: <1514884312-8535-1-git-send-email-fugang.duan@nxp.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131593581137891076; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(336005)(376002)(39860400002)(39380400002)(396003)(346002)(2980300002)(1110001)(1109001)(339900001)(199004)(189003)(39060400002)(97736004)(105606002)(305945005)(2906002)(50466002)(4326008)(53936002)(5660300001)(6916009)(6666003)(106466001)(2351001)(104016004)(48376002)(498600001)(47776003)(77096006)(51416003)(81166006)(86362001)(356003)(8656006)(575784001)(59450400001)(81156014)(8936002)(85426001)(68736007)(54906003)(50226002)(316002)(36756003)(16586007)(8676002); DIR:OUT; SFP:1101; SCL:1; SRVR:CO2PR03MB2359; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD037; 1:2RAy4T4KhTptVs1lxoR7iXoVxrsN7IwxGZQzcQ8bYBwRDed4ZmtMvX/qjf0Q4VkhuuRTRZl7AuT3waTGA9in8EVttn+WBD39fpExM8kePUEfJlL6Ffd2Bo2sXG3F5H6a MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 02669fe5-6b79-491c-0f04-08d551c154e9 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(4534020)(4628075)(201703131517081)(5600026)(4604075)(2017052603307); SRVR:CO2PR03MB2359; X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2359; 3:A33WgGmCN0UfhGOaskoslrUw/SoLTAb5CG1NTYzwJ7QKxEZ7bLUmSXfzmMNDYgWHKmGj13g9nQ6gB9MPi5is0NOqduDaPM/lzPOJDdH3QkHYdkVfu2njhFCATYuU+pSNYB0pQFJS2sF3EolJ3MqTQQxN2hwCpUrH68jBPaiRKqwJwonPCrevVz0Ry8EHyAQH50JQU4BoBI/bcHKuL15hg6PKxDhw26aZa01PVxG6ecFhI2C0CdU5xUPhvo+B+uSt05UUC7aPhggAWaWqjNE9ZIY+/J6lZAOZ2MbjkcBD+7GYF3lHWSY7XHeMe512igkiFjPVFALumSIeNseE3XhTUjdz21U0RpijaXgM82fHaF0=; 25:v2RHOZFNBlChy3aug2jMtaRE15/SZEIVXGzxrDcD+0J30qog8I0qXWRIJV/vIqfGxN9k0olkd2BMUhOCfe2PcoCl+kE35418yu3x5RXPorjm7QhkYfRQNVWNndfkWA7mCtbM7olV+uLJSEd6eUOrfvPlRZDn3bqvCnDVfSggs3LV545aPQIB4l19IMHa/casKTKdaXMKbGxiKIWzCfyu7txomXz2xxVPmb/pvRUJFRwzn46ydCl23AC3C25M+No2nwKmAm8u9priFPN/DaoM7IpGsweEcZ2NDYL3B+mRglxPEnyUFHTLWwYTmeOvqYUlCJimw8g0Ny9C7ArAZimeNA== X-MS-TrafficTypeDiagnostic: CO2PR03MB2359: X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2359; 31:5EcDE0Fcwy1eSfs5d2Ml1qQVDcuOav0EE1XKx9Je0jFd9qfC7pf6pgbLNewOcJEbCQiO49BZ63x06+6Hm2cCoLeKProYFGXJazx7P0NTeHbkf+XTih0xClSIcSs3BF/UG29d76Am5gyhIi7Dcb+HOnQRcLvqRxF69pdfW9J0mBf4huC4/YiAYm658pONYKU5WZ+1NrV18nee1RmrzmRWlQGEvNOGeX7hAUqV2r3F5fo=; 4:2tux0KUdGariAaoyo+q/eg+vKFMMOscUgwAHFqmUE4UvlZTo2e2Qyof5AOCP/LVPZPYB3MSOfNb8SN1Od9j1MaTHD5btild6TIhUNhueM4RveXgjy7ko0eKAB2ol00tq7J2meOAqSrZl4MAPrUtDVkB8zv0cBDXHjy44n+kBhna5rxgQapnKlxtUkmY8028BX9Ruae6JknQwVRUzNlSwgR2TnZvuA8OstmWaN1OJ0X/xnhOEEzghcrjCCe2gNJVgOlZ93PpMFOVbJLqTHEPs5WHM3VNbJ8xTV1qMSQJmnSnWIMqgt+UGIcJMBKgtPkU/ X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(10201501046)(3231023)(944510075)(944921075)(946801075)(946901075)(6055026)(6096035)(20161123565025)(20161123561025)(20161123559100)(20161123563025)(20161123556025)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(201708071742011); SRVR:CO2PR03MB2359; BCL:0; PCL:0; RULEID:(100000803101)(100110400095)(400006); SRVR:CO2PR03MB2359; X-Forefront-PRVS: 0540846A1D X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2359; 23:eb/ecf+A4YFROIEIvhi0dj7USeZ3rabZ4Em3pHv014+6s9SkRDpb0cKCIsBJed2Bluip8R8NV7m0zYWc4hKiP7ITkZrVuBruFyQ3twoXMgeHt9qP1xpehB3zT4cp1bUe18yk6jNr0gyXy3hszeGF1kGvM9vVtDgqPqKVrk8ojkEb5j6zGFesesU0JlTecP2YTQRQowVRpo9KNAhLcHIg41Fg1Umdznj2mq9vb4npUTPGLVaHuCyrBJe2w94WLUiHdE14zw+hzNdmnnjJ4lUpoQJS0u4btWTVfvKTq1fWCvi5ENBUWS/MjvIMRCrdOpRxHC0AWXjFrdaYRjZCcQL/x3+pJ1fLoI5fTYKrPRg2nyKoF5uS0SPIdSRolHVivBC22PrQG45Wdcj4AX3dEBjOwrFwwLHc1Nw/YVCZnWmh84dff5z1xYgWIUMBmEaRYa5mjs/wjuvzj2YEvLeR1uNlWzKXzya9xDdIgsXqu9zM0LAItl9W+9+KJI2acVyXiPlET2Wxkc6XpK43HYnYvfuLr1d36S25gXlRbZGoGMO8FmxCmoj/yymvojszkObP3xKYaZzk9jHkELLWXz2KvL3qPlkc1BtJ4lLXMq3n3BoXmcYHSlpIAD91+aNo+HYSUy2noftbPwuINNSNVKdyeklMUU0bRDuog4vHDD4isan+PcA4BLnD7VN4rcxcOo/2976z2glUnFgq9BnfX5V0gODJI56VqSHKnu2mVPk0mn5VUK75MnFV0YLKe5bKJ4lhXDkeIMFGpztQanGxS0WvLXHdlqULElmyZZtIplhwe/Hk72NOJPr6jMpbZNJHkEHaL8bty7JFtsUiU4A4kS3cpEvOl9rJ1LV4lChKZSD/zfQnKViJ0aKFmRUC4tnNiHB+xK9U7Xp6Tt870O2lokoN477LpZs/D0XbOkJ6xWRHcksCLzfeHNHIni9h76XYQ33zkuf0sPeFVwtc26Pt5qwHWpUNTT+IXVXgRjEeQgzWySwPQdaP4O26VvJYOG7o9MZjTLvTCPYICAY/3MjYjJA0LU+1c/ZZQuYXYFbkdGzyJoMg6pfBl7nSKbZ8jycddrVF+1QSHRYkbPk/N9ctPhg8KnaTrv5TVaxe5ASz77KlF53Ih7c= X-Microsoft-Exchange-Diagnostics: 1; CO2PR03MB2359; 6:H2ioaML2/N+JLl7CTB3uMAdNIwADbh+qjQaIZJlSl4+n4PcP/IScxJzk2hc4csq6vMxTx24jYhm9XF2S0xMGindJjvdggxp+R+gc8Kabsje7IbbA81n8D52HKqJ6cg+fn6rp6NlWa6rjlpnRN8ZFz9TaqkjqoPVtXqPrMW5GayWst5ROjupKaNvBL0zKJB98ECnwQzt4VFb/yQV49rsUiaE1Bqxy3zdDSSqXvKU8kzTL4KitznKzzsoF9Fto72ozUyY9LKEO42dMUqHwVnS1p50yixym6u3ubTl/zZELUDNeKVGe48RilMSYSZND+RJ3F3agepE+lVFXFXQd5aamDWYCqfuCm+TsJq4EBxgwO1A=; 5:fF+lGgh10z4T0zNCbbkZ8r4rn0lfflCXZ0GCZzw4sdIuUZ88pL7vjpSM8D+ImAJhfIUkAwaeRH5POKDoDuWXv4lEaqdXpuuNcGMermtEQ+Hc+qVFM8vH6y1sRAJFRE/pvK3Ke3x10oqlNN44pDQUv4vtbsqV9PiiwxgC2XJcTUM=; 24:kwfuxS/k+ciYaXcc/iq85NDcpzuH5R9/FrpEXgo6DL8amCgbPc64GzC0qOs/MleQVNOXZVDVrp97K6UyiK0M5YYs6i4WGFDKNPFL36+bENk=; 7:1oBGlxtoTp3QYBkJpR747cj3W8NIR/420w/yv7ngP4yk5wfVHkNY+TEb5f2oI/+ENvbSYT+Zl4BrWnHZzgdJWQ+4v5mnOpK0Sx//9xuNNbK0GvJZ8otwkNxU9wav+69VPfCVfsZO7tSB4txZ+2i/Z7oCzCSaYNtTcwvMwRAGxr19x7CAODaQql0gQnO8rOs3Yx5Cc2nPmSYnntf9P1hoa/eZrl7CgXl0lV1qvnFcHscX9lsDCIYWs0tHgCv3IceI SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jan 2018 09:15:13.6175 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 02669fe5-6b79-491c-0f04-08d551c154e9 X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO2PR03MB2359 Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Add runtime pm support to dynamically manage the clock to avoid enable/disable clock in frequently that can improve the i2c bus transfer performance. And use pm_runtime_force_suspend/resume() instead of lpi2c_imx_suspend/resume(). Signed-off-by: Fugang Duan --- drivers/i2c/busses/i2c-imx-lpi2c.c | 68 ++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/drivers/i2c/busses/i2c-imx-lpi2c.c b/drivers/i2c/busses/i2c-imx-lpi2c.c index e86801a..e6da2c7 100644 --- a/drivers/i2c/busses/i2c-imx-lpi2c.c +++ b/drivers/i2c/busses/i2c-imx-lpi2c.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -90,6 +91,8 @@ #define FAST_PLUS_MAX_BITRATE 3400000 #define HIGHSPEED_MAX_BITRATE 5000000 +#define I2C_PM_TIMEOUT 10 /* ms */ + enum lpi2c_imx_mode { STANDARD, /* 100+Kbps */ FAST, /* 400+Kbps */ @@ -274,8 +277,8 @@ static int lpi2c_imx_master_enable(struct lpi2c_imx_struct *lpi2c_imx) unsigned int temp; int ret; - ret = clk_enable(lpi2c_imx->clk); - if (ret) + ret = pm_runtime_get_sync(lpi2c_imx->adapter.dev.parent); + if (ret < 0) return ret; temp = MCR_RST; @@ -284,7 +287,7 @@ static int lpi2c_imx_master_enable(struct lpi2c_imx_struct *lpi2c_imx) ret = lpi2c_imx_config(lpi2c_imx); if (ret) - goto clk_disable; + goto rpm_put; temp = readl(lpi2c_imx->base + LPI2C_MCR); temp |= MCR_MEN; @@ -292,8 +295,9 @@ static int lpi2c_imx_master_enable(struct lpi2c_imx_struct *lpi2c_imx) return 0; -clk_disable: - clk_disable(lpi2c_imx->clk); +rpm_put: + pm_runtime_mark_last_busy(lpi2c_imx->adapter.dev.parent); + pm_runtime_put_autosuspend(lpi2c_imx->adapter.dev.parent); return ret; } @@ -306,7 +310,8 @@ static int lpi2c_imx_master_disable(struct lpi2c_imx_struct *lpi2c_imx) temp &= ~MCR_MEN; writel(temp, lpi2c_imx->base + LPI2C_MCR); - clk_disable(lpi2c_imx->clk); + pm_runtime_mark_last_busy(lpi2c_imx->adapter.dev.parent); + pm_runtime_put_autosuspend(lpi2c_imx->adapter.dev.parent); return 0; } @@ -606,22 +611,31 @@ static int lpi2c_imx_probe(struct platform_device *pdev) return ret; } + pm_runtime_set_autosuspend_delay(&pdev->dev, I2C_PM_TIMEOUT); + pm_runtime_use_autosuspend(&pdev->dev); + pm_runtime_get_noresume(&pdev->dev); + pm_runtime_set_active(&pdev->dev); + pm_runtime_enable(&pdev->dev); + temp = readl(lpi2c_imx->base + LPI2C_PARAM); lpi2c_imx->txfifosize = 1 << (temp & 0x0f); lpi2c_imx->rxfifosize = 1 << ((temp >> 8) & 0x0f); - clk_disable(lpi2c_imx->clk); - ret = i2c_add_adapter(&lpi2c_imx->adapter); if (ret) - goto clk_unprepare; + goto rpm_disable; + + pm_runtime_mark_last_busy(&pdev->dev); + pm_runtime_put_autosuspend(&pdev->dev); dev_info(&lpi2c_imx->adapter.dev, "LPI2C adapter registered\n"); return 0; -clk_unprepare: - clk_unprepare(lpi2c_imx->clk); +rpm_disable: + pm_runtime_put(&pdev->dev); + pm_runtime_disable(&pdev->dev); + pm_runtime_dont_use_autosuspend(&pdev->dev); return ret; } @@ -632,28 +646,48 @@ static int lpi2c_imx_remove(struct platform_device *pdev) i2c_del_adapter(&lpi2c_imx->adapter); - clk_unprepare(lpi2c_imx->clk); + pm_runtime_disable(&pdev->dev); + pm_runtime_dont_use_autosuspend(&pdev->dev); return 0; } #ifdef CONFIG_PM_SLEEP -static int lpi2c_imx_suspend(struct device *dev) +static int lpi2c_runtime_suspend(struct device *dev) { + struct lpi2c_imx_struct *lpi2c_imx = dev_get_drvdata(dev); + + clk_disable_unprepare(lpi2c_imx->clk); pinctrl_pm_select_sleep_state(dev); return 0; } -static int lpi2c_imx_resume(struct device *dev) +static int lpi2c_runtime_resume(struct device *dev) { + struct lpi2c_imx_struct *lpi2c_imx = dev_get_drvdata(dev); + int ret; + pinctrl_pm_select_default_state(dev); + ret = clk_prepare_enable(lpi2c_imx->clk); + if (ret) { + dev_err(dev, "failed to enable I2C clock, ret=%d\n", ret); + return ret; + } return 0; } -#endif -static SIMPLE_DEV_PM_OPS(imx_lpi2c_pm, lpi2c_imx_suspend, lpi2c_imx_resume); +static const struct dev_pm_ops lpi2c_pm_ops = { + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(lpi2c_runtime_suspend, + lpi2c_runtime_resume, NULL) +}; +#define IMX_LPI2C_PM (&lpi2c_pm_ops) +#else +#define IMX_LPI2C_PM NULL +#endif static struct platform_driver lpi2c_imx_driver = { .probe = lpi2c_imx_probe, @@ -661,7 +695,7 @@ static int lpi2c_imx_resume(struct device *dev) .driver = { .name = DRIVER_NAME, .of_match_table = lpi2c_imx_of_match, - .pm = &imx_lpi2c_pm, + .pm = IMX_LPI2C_PM, }, };