From patchwork Fri Jan 13 08:30:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 91287 Delivered-To: patch@linaro.org Received: by 10.140.20.99 with SMTP id 90csp83546qgi; Fri, 13 Jan 2017 00:30:11 -0800 (PST) X-Received: by 10.98.33.66 with SMTP id h63mr21311249pfh.142.1484296211608; Fri, 13 Jan 2017 00:30:11 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r4si11988207pgr.239.2017.01.13.00.30.11; Fri, 13 Jan 2017 00:30:11 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-samsung-soc-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-samsung-soc-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-samsung-soc-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751184AbdAMIaK (ORCPT + 4 others); Fri, 13 Jan 2017 03:30:10 -0500 Received: from mailout1.w1.samsung.com ([210.118.77.11]:63103 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751157AbdAMIaK (ORCPT ); Fri, 13 Jan 2017 03:30:10 -0500 Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OJP006MRMA73E40@mailout1.w1.samsung.com> for linux-samsung-soc@vger.kernel.org; Fri, 13 Jan 2017 08:30:07 +0000 (GMT) Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20170113083006eucas1p1b2474fd6a4a86cc2214b01bfea0e5dff~ZR4kZh6XD2892728927eucas1p1J; Fri, 13 Jan 2017 08:30:06 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges5.samsung.com (EUCPMTA) with SMTP id 72.D6.17477.E0098785; Fri, 13 Jan 2017 08:30:06 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170113083005eucas1p29fc6abb79e866c1e613a522190118de5~ZR4jx6OGD0921109211eucas1p2a; Fri, 13 Jan 2017 08:30:05 +0000 (GMT) X-AuditID: cbfec7f5-f79d06d000004445-39-5878900e708e Received: from eusync1.samsung.com ( [203.254.199.211]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 2B.16.10233.60098785; Fri, 13 Jan 2017 08:29:58 +0000 (GMT) Received: from AMDC2765.digital.local ([106.116.147.25]) by eusync1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OJP00KX4MA25Y60@eusync1.samsung.com>; Fri, 13 Jan 2017 08:30:05 +0000 (GMT) From: Marek Szyprowski To: dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org Cc: Marek Szyprowski , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Andrzej Hajda Subject: [PATCH v2] drm/exynos: mic: Add runtime PM support Date: Fri, 13 Jan 2017 09:30:00 +0100 Message-id: <1484296200-5321-1-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrIIsWRmVeSWpSXmKPExsWy7djP87p8EyoiDO58ZbO4te4cq8WVr+/Z LCbdn8Bi8eLeRRaLGef3MVmsPXKX3WLG5JdsDuwe97uPM3n0bVnF6PF5k1wAcxSXTUpqTmZZ apG+XQJXRvf+F4wFj9QrWt97NDD2KHQxcnJICJhIbDj0lA3CFpO4cG89kM3FISSwlFFi3rcV zBDOZ0aJIxcns8N0tDZMZYdILGOUuH38JBOE08AkMfnOJyaQKjYBQ4mut11gc0UE3CSaDs9k BSliFjjNKPHr005GkISwgLXErEurgWwODhYBVYmd11NAwrwC7hIt13dA3SQncfLYZLBeCYEz bBI9/RfYQOolBGQlNh1ghqhxkdjbdZQRwhaWeHV8C9SlMhKXJ3ezQNj9jBJNrdoQ9gxGiXNv eSFsa4nDxy+ygtjMAnwSk7ZNZ4YYzyvR0SYEUeIhcXvWCagxjhIfPk0HWyskECux79tvlgmM 0gsYGVYxiqSWFuempxab6hUn5haX5qXrJefnbmIERuTpf8e/7mBceszqEKMAB6MSD++E2+UR QqyJZcWVuYcYJTiYlUR4RXsqIoR4UxIrq1KL8uOLSnNSiw8xSnOwKInz7llwJVxIID2xJDU7 NbUgtQgmy8TBKdXAqJ0iVZgZ8U/N8ZBwzq4rbQ+KXhg+3xj7Jj5dq3/z1QapSxekHpW9mpb1 /XWLb9G6unvtj0+n/NvP6Pss7gnX+b5MnqNOZiZX65ICPqdx2iUkrbp7r7d/u1Ot19a87aWX 9rXO1/z9doFbSfRj7f+vRV4wZESH6Uv4PNNhlFl6W8vLPCuvM+WVEktxRqKhFnNRcSIA/fzX 1sQCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrKLMWRmVeSWpSXmKPExsVy+t/xy7psEyoiDJ7NM7C4te4cq8WVr+/Z LCbdn8Bi8eLeRRaLGef3MVmsPXKX3WLG5JdsDuwe97uPM3n0bVnF6PF5k1wAc5SbTUZqYkpq kUJqXnJ+SmZeuq1SaIibroWSQl5ibqqtUoSub0iQkkJZYk4pkGdkgAYcnAPcg5X07RLcMrr3 v2AseKRe0freo4GxR6GLkZNDQsBEorVhKjuELSZx4d56ti5GLg4hgSWMEocWz2cDSQgJNDFJ vJgaBGKzCRhKdL3tAouLCLhJNB2eyQrSwCxwmlHi2KcHzCAJYQFriVmXVjN2MXJwsAioSuy8 ngIS5hVwl2i5voMNYpmcxMljk1knMHIvYGRYxSiSWlqcm55bbKRXnJhbXJqXrpecn7uJERiE 24793LKDsetd8CFGAQ5GJR7eCbfLI4RYE8uKK3MPMUpwMCuJ8Ir2VEQI8aYkVlalFuXHF5Xm pBYfYjQF2j2RWUo0OR8YIXkl8YYmhuaWhkbGFhbmRkZK4rxTP1wJFxJITyxJzU5NLUgtgulj 4uCUamBcl2OZ3awpqZ+yxYnffemWqoKpx09dKkm0dj5/akv4DQXml6/u9U+4bhlsXHY7IkJv jcWWPtk/X/PeSTh90Gg2Zmr8o3Hf9s8c/6YX+mW19yUc8/z3WcqdLHt/de81aa7q5Dff5pvE xNcoN3hVu9h7CJ523NG+bFOsRJP+/caZk/q3PmeZYK/EUpyRaKjFXFScCAAqh0IUWAIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170113083005eucas1p29fc6abb79e866c1e613a522190118de5 X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 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: 20170113083005eucas1p29fc6abb79e866c1e613a522190118de5 X-RootMTR: 20170113083005eucas1p29fc6abb79e866c1e613a522190118de5 References: Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org This patch adds runtime support calls to notify device core when MIC device is really in use. Runtime PM is implemented by enabling and disabling clocks like in other Exynos DRM subdrivers. Adding runtime PM support is needed to let power domain with this device to be turned off when display is not used. Signed-off-by: Marek Szyprowski --- Changelog: v2: - moved clock control to runtime PM callbacks as requested by Inki Dae v1: http://www.spinics.net/lists/dri-devel/msg129095.html - initial version --- drivers/gpu/drm/exynos/exynos_drm_mic.c | 82 ++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 23 deletions(-) -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/gpu/drm/exynos/exynos_drm_mic.c b/drivers/gpu/drm/exynos/exynos_drm_mic.c index a0def0be6d65..430f67c63707 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_mic.c +++ b/drivers/gpu/drm/exynos/exynos_drm_mic.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -312,7 +313,6 @@ static void mic_disable(struct drm_bridge *bridge) { } static void mic_post_disable(struct drm_bridge *bridge) { struct exynos_mic *mic = bridge->driver_private; - int i; mutex_lock(&mic_mutex); if (!mic->enabled) @@ -320,9 +320,7 @@ static void mic_post_disable(struct drm_bridge *bridge) mic_set_path(mic, 0); - for (i = NUM_CLKS - 1; i > -1; i--) - clk_disable_unprepare(mic->clks[i]); - + pm_runtime_put(mic->dev); mic->enabled = 0; already_disabled: @@ -332,27 +330,22 @@ static void mic_post_disable(struct drm_bridge *bridge) static void mic_pre_enable(struct drm_bridge *bridge) { struct exynos_mic *mic = bridge->driver_private; - int ret, i; + int ret; mutex_lock(&mic_mutex); if (mic->enabled) - goto already_enabled; + goto unlock; - for (i = 0; i < NUM_CLKS; i++) { - ret = clk_prepare_enable(mic->clks[i]); - if (ret < 0) { - DRM_ERROR("Failed to enable clock (%s)\n", - clk_names[i]); - goto turn_off_clks; - } - } + ret = pm_runtime_get_sync(mic->dev); + if (ret < 0) + goto unlock; mic_set_path(mic, 1); ret = mic_sw_reset(mic); if (ret) { DRM_ERROR("Failed to reset\n"); - goto turn_off_clks; + goto turn_off; } if (!mic->i80_mode) @@ -365,10 +358,9 @@ static void mic_pre_enable(struct drm_bridge *bridge) return; -turn_off_clks: - while (--i > -1) - clk_disable_unprepare(mic->clks[i]); -already_enabled: +turn_off: + pm_runtime_put(mic->dev); +unlock: mutex_unlock(&mic_mutex); } @@ -401,14 +393,12 @@ static void exynos_mic_unbind(struct device *dev, struct device *master, void *data) { struct exynos_mic *mic = dev_get_drvdata(dev); - int i; mutex_lock(&mic_mutex); if (!mic->enabled) goto already_disabled; - for (i = NUM_CLKS - 1; i > -1; i--) - clk_disable_unprepare(mic->clks[i]); + pm_runtime_put(mic->dev); already_disabled: mutex_unlock(&mic_mutex); @@ -421,6 +411,41 @@ static void exynos_mic_unbind(struct device *dev, struct device *master, .unbind = exynos_mic_unbind, }; +#ifdef CONFIG_PM +static int exynos_mic_suspend(struct device *dev) +{ + struct exynos_mic *mic = dev_get_drvdata(dev); + int i; + + for (i = NUM_CLKS - 1; i > -1; i--) + clk_disable_unprepare(mic->clks[i]); + + return 0; +} + +static int exynos_mic_resume(struct device *dev) +{ + struct exynos_mic *mic = dev_get_drvdata(dev); + int ret, i; + + for (i = 0; i < NUM_CLKS; i++) { + ret = clk_prepare_enable(mic->clks[i]); + if (ret < 0) { + DRM_ERROR("Failed to enable clock (%s)\n", + clk_names[i]); + while (--i > -1) + clk_disable_unprepare(mic->clks[i]); + return ret; + } + } + return 0; +} +#endif + +static const struct dev_pm_ops exynos_mic_pm_ops = { + SET_RUNTIME_PM_OPS(exynos_mic_suspend, exynos_mic_resume, NULL) +}; + static int exynos_mic_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -473,9 +498,18 @@ static int exynos_mic_probe(struct platform_device *pdev) platform_set_drvdata(pdev, mic); + pm_runtime_enable(dev); + + ret = component_add(dev, &exynos_mic_component_ops); + if (ret) + goto err_pm; + DRM_DEBUG_KMS("MIC has been probed\n"); - return component_add(dev, &exynos_mic_component_ops); + return 0; + +err_pm: + pm_runtime_disable(dev); err: return ret; } @@ -483,6 +517,7 @@ static int exynos_mic_probe(struct platform_device *pdev) static int exynos_mic_remove(struct platform_device *pdev) { component_del(&pdev->dev, &exynos_mic_component_ops); + pm_runtime_disable(&pdev->dev); return 0; } @@ -497,6 +532,7 @@ struct platform_driver mic_driver = { .remove = exynos_mic_remove, .driver = { .name = "exynos-mic", + .pm = &exynos_mic_pm_ops, .owner = THIS_MODULE, .of_match_table = exynos_mic_of_match, },