diff options
author | Sean Paul <seanpaul@chromium.org> | 2014-01-30 16:19:27 -0500 |
---|---|---|
committer | Inki Dae <daeinki@gmail.com> | 2014-03-24 00:36:36 +0900 |
commit | af65c804877078a58cb02cc0f2ce4198401402fc (patch) | |
tree | 1894a3b77ee5098bafe60f69694ca5d122a1be36 /drivers/gpu/drm/exynos/exynos_drm_fimd.c | |
parent | a43b933bcbbd6c7e2660b672a311345cea9524c1 (diff) | |
download | op-kernel-dev-af65c804877078a58cb02cc0f2ce4198401402fc.zip op-kernel-dev-af65c804877078a58cb02cc0f2ce4198401402fc.tar.gz |
drm/exynos: Consolidate suspend/resume in drm_drv
This patch removes all of the suspend/resume logic from the individual
drivers and consolidates it in drm_drv. This consolidation reduces the
number of functions which enable/disable the hardware to just one -- the
dpms callback. This ensures that we always power up/down in a consistent
manner.
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_fimd.c')
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fimd.c | 86 |
1 files changed, 9 insertions, 77 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 1efdcac..f78fbf4 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -732,6 +732,8 @@ static int fimd_poweron(struct exynos_drm_manager *mgr) ctx->suspended = false; + pm_runtime_get_sync(ctx->dev); + ret = clk_prepare_enable(ctx->bus_clk); if (ret < 0) { DRM_ERROR("Failed to prepare_enable the bus clk [%d]\n", ret); @@ -785,32 +787,24 @@ static int fimd_poweroff(struct exynos_drm_manager *mgr) clk_disable_unprepare(ctx->lcd_clk); clk_disable_unprepare(ctx->bus_clk); + pm_runtime_put_sync(ctx->dev); + ctx->suspended = true; return 0; } static void fimd_dpms(struct exynos_drm_manager *mgr, int mode) { - struct fimd_context *ctx = mgr->ctx; - - DRM_DEBUG_KMS("%d\n", mode); + DRM_DEBUG_KMS("%s, %d\n", __FILE__, mode); switch (mode) { case DRM_MODE_DPMS_ON: - /* - * enable fimd hardware only if suspended status. - * - * P.S. fimd_dpms function would be called at booting time so - * clk_enable could be called double time. - */ - if (ctx->suspended) - pm_runtime_get_sync(ctx->dev); + fimd_poweron(mgr); break; case DRM_MODE_DPMS_STANDBY: case DRM_MODE_DPMS_SUSPEND: case DRM_MODE_DPMS_OFF: - if (!ctx->suspended) - pm_runtime_put_sync(ctx->dev); + fimd_poweroff(mgr); break; default: DRM_DEBUG_KMS("unspecified mode %d\n", mode); @@ -929,7 +923,6 @@ static int fimd_probe(struct platform_device *pdev) exynos_drm_manager_register(&fimd_manager); pm_runtime_enable(dev); - pm_runtime_get_sync(dev); for (win = 0; win < WINDOWS_NR; win++) fimd_clear_win(ctx, win); @@ -939,84 +932,23 @@ static int fimd_probe(struct platform_device *pdev) static int fimd_remove(struct platform_device *pdev) { - struct device *dev = &pdev->dev; struct exynos_drm_manager *mgr = platform_get_drvdata(pdev); - struct fimd_context *ctx = mgr->ctx; exynos_drm_manager_unregister(&fimd_manager); - if (ctx->suspended) - goto out; - - pm_runtime_set_suspended(dev); - pm_runtime_put_sync(dev); + fimd_dpms(mgr, DRM_MODE_DPMS_OFF); -out: - pm_runtime_disable(dev); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int fimd_suspend(struct device *dev) -{ - struct exynos_drm_manager *mgr = get_fimd_manager(dev); - - /* - * do not use pm_runtime_suspend(). if pm_runtime_suspend() is - * called here, an error would be returned by that interface - * because the usage_count of pm runtime is more than 1. - */ - if (!pm_runtime_suspended(dev)) - return fimd_poweroff(mgr); + pm_runtime_disable(&pdev->dev); return 0; } -static int fimd_resume(struct device *dev) -{ - struct exynos_drm_manager *mgr = get_fimd_manager(dev); - - /* - * if entered to sleep when lcd panel was on, the usage_count - * of pm runtime would still be 1 so in this case, fimd driver - * should be on directly not drawing on pm runtime interface. - */ - if (pm_runtime_suspended(dev)) - return 0; - - return fimd_poweron(mgr); -} -#endif - -#ifdef CONFIG_PM_RUNTIME -static int fimd_runtime_suspend(struct device *dev) -{ - struct exynos_drm_manager *mgr = get_fimd_manager(dev); - - return fimd_poweroff(mgr); -} - -static int fimd_runtime_resume(struct device *dev) -{ - struct exynos_drm_manager *mgr = get_fimd_manager(dev); - - return fimd_poweron(mgr); -} -#endif - -static const struct dev_pm_ops fimd_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume) - SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL) -}; - struct platform_driver fimd_driver = { .probe = fimd_probe, .remove = fimd_remove, .driver = { .name = "exynos4-fb", .owner = THIS_MODULE, - .pm = &fimd_pm_ops, .of_match_table = fimd_driver_dt_match, }, }; |