Skip to content

Commit

Permalink
drm/exynos: added pm support.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Inki Dae committed Dec 29, 2011
1 parent e1533c0 commit e30d4bc
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions drivers/gpu/drm/exynos/exynos_drm_fimd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -885,6 +891,51 @@ static int __devexit fimd_remove(struct platform_device *pdev)
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)
{
Expand Down Expand Up @@ -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)
};

Expand Down

0 comments on commit e30d4bc

Please sign in to comment.