From patchwork Thu Jan 26 09:29:24 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 9538657 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 96F73604A9 for ; Thu, 26 Jan 2017 09:30:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8913927F99 for ; Thu, 26 Jan 2017 09:30:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7D9BD281C3; Thu, 26 Jan 2017 09:30:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1797C27F99 for ; Thu, 26 Jan 2017 09:30:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753157AbdAZJac (ORCPT ); Thu, 26 Jan 2017 04:30:32 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:34105 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753262AbdAZJaG (ORCPT ); Thu, 26 Jan 2017 04:30:06 -0500 Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OKD0072JRQ2DU70@mailout2.w1.samsung.com>; Thu, 26 Jan 2017 09:30:02 +0000 (GMT) Received: from eusmges3.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170126093002eucas1p23e781aecceea061b5e7abc863a328623~dSFm28Hhp0735707357eucas1p2j; Thu, 26 Jan 2017 09:30:02 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3.samsung.com (EUCPMTA) with SMTP id 87.A5.09557.991C9885; Thu, 26 Jan 2017 09:30:02 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170126093001eucas1p2531400b718191fd5fadd71d9f0c83597~dSFmNbVwi3033330333eucas1p2S; Thu, 26 Jan 2017 09:30:01 +0000 (GMT) X-AuditID: cbfec7f2-f790f6d000002555-8d-5889c1993882 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 5C.FC.06687.9D1C9885; Thu, 26 Jan 2017 09:31:05 +0000 (GMT) Received: from AMDC2765.digital.local ([106.116.147.25]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OKD007J9RPVXW40@eusync3.samsung.com>; Thu, 26 Jan 2017 09:30:01 +0000 (GMT) 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 , Bartlomiej Zolnierkiewicz Subject: [PATCH v3 REBASED 10/13] pinctrl: samsung: Add infrastructure for pin-bank retention control Date: Thu, 26 Jan 2017 10:29:24 +0100 Message-id: <1485422967-30643-7-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1485422967-30643-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrDIsWRmVeSWpSXmKPExsWy7djPc7qzDnZGGBx0sNg4Yz2rxfnzG9gt pvxZzmSx6fE1VovN8/8wWnzuPcJoMeP8PiaLtUfuslscftPOarFq1x9GBy6PnbPusntsWtXJ 5nHn2h42j81L6j36tqxi9Pi8SS6ALYrLJiU1J7MstUjfLoEr4+Bvn4ImjYpfHxcyNTBuVuxi 5OSQEDCRuHN5JROELSZx4d56ti5GLg4hgaWMEt3XLjBCOJ8ZJS7vnsQG09F+9DcTRGIZo8Sq 4xOhWhqYJH4eXsQCUsUmYCjR9bYLLCEi0MwoMfPuXnYQh1mgj0ni8+a9jCBVwgLpEmsebgeb yyKgKjFn6VWwS3gFPCSaJy9lh9gnJ3Hy2GRWEJtTwFNif9M2sEESAv3sEp1XJgCt4wByZCU2 HWCGqHeRmLmoGeojYYlXx7dAzZGR6Ow4CBXvZ5RoatWGsGcwSpx7ywthW0scPn4RbBezAJ/E pG3TmSHG80p0tAlBlHhI3F15DmqMo8TpcxvYIb5/zChxct4HlgmMMgsYGVYxiqSWFuempxYb 6xUn5haX5qXrJefnbmIExvnpf8c/7WD8esLqEKMAB6MSD++BHR0RQqyJZcWVuYcYJTiYlUR4 D+3rjBDiTUmsrEotyo8vKs1JLT7EKM3BoiTOu2fBlXAhgfTEktTs1NSC1CKYLBMHp1QDo3Z0 dNyRSaHvFqeYbbt12mP+qpKCnNQXLSd+f7UqdfmWWz3x18reczManqld+Vrhp7vS/WvsvpSO 3JNyTT2vot9FXzC9wb42airfQz8uPvWQS5P+m12YolF9ekOd8lGfLbcX5F25ffeHWvsJPW5h tj8iybq5X5f9+7Hj95J969h4KxbJnJuzdJMSS3FGoqEWc1FxIgC0jCU87wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrDLMWRmVeSWpSXmKPExsVy+t/xq7o3D3ZGGMxcLm+xccZ6Vovz5zew W0z5s5zJYtPja6wWm+f/YbT43HuE0WLG+X1MFmuP3GW3OPymndVi1a4/jA5cHjtn3WX32LSq k83jzrU9bB6bl9R79G1ZxejxeZNcAFuUm01GamJKapFCal5yfkpmXrqtUmiIm66FkkJeYm6q rVKErm9IkJJCWWJOKZBnZIAGHJwD3IOV9O0S3DIO/vYpaNKo+PVxIVMD42bFLkZODgkBE4n2 o7+ZIGwxiQv31rN1MXJxCAksYZTYsPMWC0hCSKCJSWLPBGkQm03AUKLrbRdYkYhAM6NEw5Je MIdZYAKTxMxPDWCjhAXSJdY83M4GYrMIqErMWXoVLM4r4CHRPHkpO8Q6OYmTxyazgticAp4S +5u2sUNsm8gocXR29gRG3gWMDKsYRVJLi3PTc4sN9YoTc4tL89L1kvNzNzECQ37bsZ+bdzBe 2hh8iFGAg1GJh/fAjo4IIdbEsuLK3EOMEhzMSiK8h/Z1RgjxpiRWVqUW5ccXleakFh9iNAU6 aiKzlGhyPjAe80riDU0MzS0NjYwtLMyNjJTEeUs+XAkXEkhPLEnNTk0tSC2C6WPi4JRqYIz/ Kv5h04dTistX5Uk4i5xdsefirSiF7UtTctbPtDnwxaRqxtPalzINV/nV+05lPf/+7jlXiOTm dz7Omh+29y3UqpyjwvCzvN9ex7Or1Ws932ulljDL9XyLC5fK2W6OP9HIpRlonGyxeovPPNHj 7H0aP/c0z/0ySbe+gj3miLDxhtuLnY7ZFCixFGckGmoxFxUnAgCnygpgjwIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170126093001eucas1p2531400b718191fd5fadd71d9f0c83597 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 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: 201P X-HopCount: 7 X-CMS-RootMailID: 20170126093001eucas1p2531400b718191fd5fadd71d9f0c83597 X-RootMTR: 20170126093001eucas1p2531400b718191fd5fadd71d9f0c83597 References: <1485422967-30643-1-git-send-email-m.szyprowski@samsung.com> Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Pad retention control after suspend/resume cycle should be done from pin controller driver instead of PMU (power management unit) driver to avoid possible ordering and logical dependencies. Till now it worked fine only because PMU driver registered its sys_ops after pin controller. This patch adds infrastructure to handle pad retention during pin control driver resume. Signed-off-by: Marek Szyprowski Reviewed-by: Krzysztof Kozlowski Acked-by: Tomasz Figa --- drivers/pinctrl/samsung/pinctrl-samsung.c | 12 +++++++++ drivers/pinctrl/samsung/pinctrl-samsung.h | 42 +++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c index 59f99ea7e65b..021abd7221f8 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.c +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c @@ -1060,6 +1060,13 @@ static int samsung_pinctrl_probe(struct platform_device *pdev) if (res) drvdata->irq = res->start; + if (ctrl->retention_data) { + drvdata->retention_ctrl = ctrl->retention_data->init(drvdata, + ctrl->retention_data); + if (IS_ERR(drvdata->retention_ctrl)) + return PTR_ERR(drvdata->retention_ctrl); + } + ret = samsung_gpiolib_register(pdev, drvdata); if (ret) return ret; @@ -1126,6 +1133,8 @@ static void samsung_pinctrl_suspend_dev( if (drvdata->suspend) drvdata->suspend(drvdata); + if (drvdata->retention_ctrl && drvdata->retention_ctrl->enable) + drvdata->retention_ctrl->enable(drvdata); } /** @@ -1173,6 +1182,9 @@ static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata) if (widths[type]) writel(bank->pm_save[type], reg + offs[type]); } + + if (drvdata->retention_ctrl && drvdata->retention_ctrl->disable) + drvdata->retention_ctrl->disable(drvdata); } /** diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h index 6f7ce7539a00..515a61035e54 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.h +++ b/drivers/pinctrl/samsung/pinctrl-samsung.h @@ -185,10 +185,48 @@ struct samsung_pin_bank { }; /** + * struct samsung_retention_data: runtime pin-bank retention control data. + * @regs: array of PMU registers to control pad retention. + * @nr_regs: number of registers in @regs array. + * @value: value to store to registers to turn off retention. + * @refcnt: atomic counter if retention control affects more than one bank. + * @priv: retention control code private data + * @enable: platform specific callback to enter retention mode. + * @disable: platform specific callback to exit retention mode. + **/ +struct samsung_retention_ctrl { + const u32 *regs; + int nr_regs; + u32 value; + atomic_t *refcnt; + void *priv; + void (*enable)(struct samsung_pinctrl_drv_data *); + void (*disable)(struct samsung_pinctrl_drv_data *); +}; + +/** + * struct samsung_retention_data: represent a pin-bank retention control data. + * @regs: array of PMU registers to control pad retention. + * @nr_regs: number of registers in @regs array. + * @value: value to store to registers to turn off retention. + * @refcnt: atomic counter if retention control affects more than one bank. + * @init: platform specific callback to initialize retention control. + **/ +struct samsung_retention_data { + const u32 *regs; + int nr_regs; + u32 value; + atomic_t *refcnt; + struct samsung_retention_ctrl *(*init)(struct samsung_pinctrl_drv_data *, + const struct samsung_retention_data *); +}; + +/** * struct samsung_pin_ctrl: represent a pin controller. * @pin_banks: list of pin banks included in this controller. * @nr_banks: number of pin banks. * @nr_ext_resources: number of the extra base address for pin banks. + * @retention_data: configuration data for retention control. * @eint_gpio_init: platform specific callback to setup the external gpio * interrupts for the controller. * @eint_wkup_init: platform specific callback to setup the external wakeup @@ -198,6 +236,7 @@ struct samsung_pin_ctrl { const struct samsung_pin_bank_data *pin_banks; u32 nr_banks; int nr_ext_resources; + const struct samsung_retention_data *retention_data; int (*eint_gpio_init)(struct samsung_pinctrl_drv_data *); int (*eint_wkup_init)(struct samsung_pinctrl_drv_data *); @@ -219,6 +258,7 @@ struct samsung_pin_ctrl { * @nr_function: number of such pin functions. * @pin_base: starting system wide pin number. * @nr_pins: number of pins supported by the controller. + * @retention_ctrl: retention control runtime data. */ struct samsung_pinctrl_drv_data { struct list_head node; @@ -238,6 +278,8 @@ struct samsung_pinctrl_drv_data { unsigned int pin_base; unsigned int nr_pins; + struct samsung_retention_ctrl *retention_ctrl; + void (*suspend)(struct samsung_pinctrl_drv_data *); void (*resume)(struct samsung_pinctrl_drv_data *); };