From patchwork Fri Dec 23 12:24:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 88945 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp3296355qgi; Fri, 23 Dec 2016 04:25:51 -0800 (PST) X-Received: by 10.84.129.111 with SMTP id 102mr29355997plb.103.1482495951502; Fri, 23 Dec 2016 04:25:51 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y67si34013481pfb.71.2016.12.23.04.25.51; Fri, 23 Dec 2016 04:25:51 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-gpio-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-gpio-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-gpio-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S941656AbcLWMZt (ORCPT + 4 others); Fri, 23 Dec 2016 07:25:49 -0500 Received: from mailout1.samsung.com ([203.254.224.24]:52648 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S941354AbcLWMZp (ORCPT ); Fri, 23 Dec 2016 07:25:45 -0500 Received: from epcas1p1.samsung.com (unknown [182.195.41.45]) by mailout1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OIN02I0A16V2AB0@mailout1.samsung.com>; Fri, 23 Dec 2016 21:25:43 +0900 (KST) Received: from epsmges1p1.samsung.com (unknown [182.195.42.53]) by epcas1p4.samsung.com (KnoxPortal) with ESMTP id 20161223122542epcas1p4170b92a053085d86b5ede409e316885e~S4jSVmNQ71387513875epcas1p4p; Fri, 23 Dec 2016 12:25:42 +0000 (GMT) Received: from epcas1p2.samsung.com ( [182.195.41.46]) by epsmges1p1.samsung.com (Symantec Messaging Gateway) with SMTP id 7A.03.05883.6C71D585; Fri, 23 Dec 2016 21:25:42 +0900 (KST) Received: from epcpsbgm1new.samsung.com (u26.gpu120.samsung.co.kr [203.254.230.26]) by epcas1p4.samsung.com (KnoxPortal) with ESMTP id 20161223122542epcas1p444c9d8c91c2983f9934e68a6bb882726~S4jSEueWn1387513875epcas1p4o; Fri, 23 Dec 2016 12:25:42 +0000 (GMT) X-AuditID: b6c32a35-f799b6d0000016fb-1c-585d17c63b0a Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1new.samsung.com (EPCPMTA) with SMTP id 96.21.28252.6C71D585; Fri, 23 Dec 2016 21:25:42 +0900 (KST) Received: from AMDC2765.digital.local ([106.116.147.25]) by mmp2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OIN00JTK15R7DD0@mmp2.samsung.com>; Fri, 23 Dec 2016 21:25:42 +0900 (KST) From: Marek Szyprowski To: linux-gpio@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org, linux-samsung-soc@vger.kernel.org Cc: Marek Szyprowski , Sylwester Nawrocki , Krzysztof Kozlowski , Linus Walleij , Tomasz Figa , Ulf Hansson , Bartlomiej Zolnierkiewicz Subject: [PATCH 8/9] pinctrl: samsung: Add runtime PM support Date: Fri, 23 Dec 2016 13:24:48 +0100 Message-id: <1482495889-6201-9-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1482495889-6201-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrAIsWRmVeSWpSXmKPExsWy7bCmnu4x8dgIg1tT9S02zljPanH+/AZ2 iyl/ljNZbHp8jdVi8/w/jBafe48wWsw4v4/JYu2Ru+wWh9+0s1qs2gWUOL423IHbY+esu+we m1Z1snncubaHzWPzknqPvi2rGD0+b5ILYIvisklJzcksSy3St0vgyli6eBJjQYNMxbNljxgb GPeKdzFyckgImEjsbDjKCmGLSVy4t56ti5GLQ0hgB6PE4vZ/7CAJIYF2JomJc+JhGpau6maH KJrDKPHi2CMmiKJfjBKPz4WA2GwChhJdb7vAJokINDNKzLy7F6yDWWAbk8S2fVcYuxg5OIQF bCVWHhADaWARUJW4+fQh2CBeAXeJ2VMfM0Jsk5M4eWwy2HmcAh4SWze8ApsjITCdXeLTjb+s IHMkBGQlNh1ghjBdJE502kG0Cku8Or6FHcKWllj17xYThN3PKNHUqg1hz2CUOPeWF8K2ljh8 /CLYKmYBPol3X3ugpvNKdLQJQZR4SDQcmMQCYTtKnDzwmQUSDrMZJe6cu8U4gVFmASPDKkax 1ILi3PTUYsMCQ73ixNzi0rx0veT83E2M4HjXMt3BOOWczyFGAQ5GJR7eE2djIoRYE8uKK3MP MUpwMCuJ8E4Rjo0Q4k1JrKxKLcqPLyrNSS0+xCjNwaIkzru40TpCSCA9sSQ1OzW1ILUIJsvE wSnVwFi+snvrAYVQn2P3+F1bXpp07rLvu3B16Txn2xyT8+uWK5i/qK6YE2PNYPSq78KpYLfe vYunFcSwddz/+rji+lav14/Xr5bP/amye5fgtyUNXcsivky5b3FRYt7mx6y67WE35l1i7Qqc kKdYw8fPNM+0rVyU+eTnuvdzf3CxTTO+rZrBvYHzWq0SS3FGoqEWc1FxIgDDj6Pr8wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpmkeLIzCtJLcpLzFFi42I5/e+xoO4x8dgIgy/75S02zljPanH+/AZ2 iyl/ljNZbHp8jdVi8/w/jBafe48wWsw4v4/JYu2Ru+wWh9+0s1qs2gWUOL423IHbY+esu+we m1Z1snncubaHzWPzknqPvi2rGD0+b5ILYItys8lITUxJLVJIzUvOT8nMS7dVCg1x07VQUshL zE21VYrQ9Q0JUlIoS8wpBfKMDNCAg3OAe7CSvl2CW8bSxZMYCxpkKp4te8TYwLhXvIuRk0NC wERi6apudghbTOLCvfVsILaQwCxGidOvoiHsX4wSTzvMQWw2AUOJrrddQDVcHCICzYwSDUt6 wRxmgR1MEpPPrmHuYuTgEBawlVh5QAykgUVAVeLm04dMIDavgLvE7KmPGSGWyUmcPDaZFcTm FPCQ2LrhFTvEMneJC9sfsk9g5F3AyLCKUSK1ILmgOCk91zAvtVyvODG3uDQvXS85P3cTIzgC nkntYDy4y/0QowAHoxIP74mzMRFCrIllxZW5hxglOJiVRHinCMdGCPGmJFZWpRblxxeV5qQW H2I0BTpsIrOUaHI+MDrzSuINTcxNzI0NLMwtLU2MlMR5G2c/CxcSSE8sSc1OTS1ILYLpY+Lg lGpg3CO8+mPXvTrd/fPi0js4TVTfTTN+PHX5hztay3tvft/sNkfIe9G1GW+Xcql9tf7Nl9KS oRpXFXbB7r2jwNE574PdL56ut36ieG7dAakd506ILavjVG16maJT/Xu6Lofz1jeimRuPSiVf OlklU7HpT5TTl+NZSV+WfeTc8vzadMY1E2yr1uQVSCmxFGckGmoxFxUnAgDoyYOrlgIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20161223122542epcas1p444c9d8c91c2983f9934e68a6bb882726 X-Msg-Generator: CA X-Sender-IP: 203.254.230.26 X-Local-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRs=?= =?UTF-8?B?7IK87ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRtT?= =?UTF-8?B?YW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 101P X-HopCount: 7 X-CMS-RootMailID: 20161223122542epcas1p444c9d8c91c2983f9934e68a6bb882726 X-RootMTR: 20161223122542epcas1p444c9d8c91c2983f9934e68a6bb882726 References: <1482495889-6201-1-git-send-email-m.szyprowski@samsung.com> Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org This patch adds runtime power management support to Samsung pin controller driver. It uses recently introduced property to mark some pin states as suitable for power off. When all pins for given controller are set to this special state, the controller is able to enter runtime suspend state. This in turn might allow to turn respective power domain off to reduce power consumption. This patch moves saving driver state to runtime pm callbacks and implements system sleep suspend/resume callbacks with pm_runtime_force_suspend/resume helpers to keep the runtime pm state consistent with the hardware both during runtime and system sleep transitions. Signed-off-by: Marek Szyprowski --- drivers/pinctrl/samsung/pinctrl-samsung.c | 24 ++++++++++++++++++++++-- drivers/pinctrl/samsung/pinctrl-samsung.h | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Reviewed-by: Krzysztof Kozlowski diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c index 301169d2b6e1..c741e93d65b8 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.c +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "../core.h" @@ -378,6 +379,17 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector, shift -= 32; reg += 4; } + if (func->rpm_active) { + if (!(bank->rpm_map & (1 << pin_offset))) { + bank->rpm_map |= 1 << pin_offset; + pm_runtime_get_sync(drvdata->dev); + } + } else { + if ((bank->rpm_map & (1 << pin_offset))) { + bank->rpm_map &= ~(1 << pin_offset); + pm_runtime_put(drvdata->dev); + } + } spin_lock_irqsave(&bank->slock, flags); @@ -427,6 +439,8 @@ static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin, if (cfg_type >= PINCFG_TYPE_NUM || !type->fld_width[cfg_type]) return -EINVAL; + pm_runtime_get_sync(drvdata->dev); + width = type->fld_width[cfg_type]; cfg_reg = type->reg_offset[cfg_type]; @@ -449,6 +463,8 @@ static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin, spin_unlock_irqrestore(&bank->slock, flags); + pm_runtime_put(drvdata->dev); + return 0; } @@ -1096,6 +1112,8 @@ static int samsung_pinctrl_probe(struct platform_device *pdev) ctrl->retention_init(drvdata); platform_set_drvdata(pdev, drvdata); + pm_runtime_set_active(dev); + pm_runtime_enable(dev); return 0; } @@ -1242,8 +1260,10 @@ static int samsung_pinctrl_resume(struct device *dev) MODULE_DEVICE_TABLE(of, samsung_pinctrl_dt_match); static const struct dev_pm_ops samsung_pinctrl_pm_ops = { - SET_LATE_SYSTEM_SLEEP_PM_OPS(samsung_pinctrl_suspend, - samsung_pinctrl_resume) + SET_RUNTIME_PM_OPS(samsung_pinctrl_suspend, + samsung_pinctrl_resume, NULL) + SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) }; static struct platform_driver samsung_pinctrl_driver = { diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h index edeafa00abd3..ccb24ec46796 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.h +++ b/drivers/pinctrl/samsung/pinctrl-samsung.h @@ -172,6 +172,7 @@ struct samsung_pin_bank { const char *name; u32 pin_base; + u32 rpm_map; void *soc_priv; struct device_node *of_node; struct samsung_pinctrl_drv_data *drvdata;