drm/exynos: added pm support.
authorInki Dae <inki.dae@samsung.com>
Mon, 12 Dec 2011 07:35:20 +0000 (16:35 +0900)
committerInki Dae <inki.dae@samsung.com>
Thu, 29 Dec 2011 02:21:41 +0000 (11:21 +0900)
this patch adds pm feature for fimd driver.

Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_fimd.c

index fe4172e48ad2da45b397dfabafeef0fe2a50362d..95c6210184432b899e5add796dca226a05e5a45f 100644 (file)
@@ -181,6 +181,9 @@ static void fimd_commit(struct device *dev)
        struct fb_videomode *timing = ctx->timing;
        u32 val;
 
+       if (ctx->suspended)
+               return;
+
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
        /* setup polarity values from machine code. */
@@ -414,6 +417,9 @@ static void fimd_win_commit(struct device *dev, int zpos)
 
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
+       if (ctx->suspended)
+               return;
+
        if (win == DEFAULT_ZPOS)
                win = ctx->default_win;
 
@@ -885,6 +891,51 @@ out:
        return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int fimd_suspend(struct device *dev)
+{
+       struct fimd_context *ctx = get_fimd_context(dev);
+       int ret;
+
+       if (pm_runtime_suspended(dev))
+               return 0;
+
+       ret = pm_runtime_suspend(dev);
+       if (ret < 0)
+               return ret;
+
+       ctx->suspended = true;
+       return 0;
+}
+
+static int fimd_resume(struct device *dev)
+{
+       struct fimd_context *ctx = get_fimd_context(dev);
+       int ret;
+
+       ret = pm_runtime_resume(dev);
+       if (ret < 0) {
+               DRM_ERROR("failed to resume runtime pm.\n");
+               return ret;
+       }
+
+       pm_runtime_disable(dev);
+
+       ret = pm_runtime_set_active(dev);
+       if (ret < 0) {
+               DRM_ERROR("failed to active runtime pm.\n");
+               pm_runtime_enable(dev);
+               pm_runtime_suspend(dev);
+               return ret;
+       }
+
+       pm_runtime_enable(dev);
+
+       ctx->suspended = false;
+       return 0;
+}
+#endif
+
 #ifdef CONFIG_PM_RUNTIME
 static int fimd_runtime_suspend(struct device *dev)
 {
@@ -917,11 +968,19 @@ static int fimd_runtime_resume(struct device *dev)
        }
 
        ctx->suspended = false;
+
+       /* if vblank was enabled status, enable it again. */
+       if (test_and_clear_bit(0, &ctx->irq_flags))
+               fimd_enable_vblank(dev);
+
+       fimd_apply(dev);
+
        return 0;
 }
 #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)
 };