aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorInki Dae <inki.dae@samsung.com>2012-08-17 05:35:47 -0400
committerInki Dae <inki.dae@samsung.com>2012-10-03 21:06:00 -0400
commit3d05859fd78bbc0b04cca929aea494f5e6b8235b (patch)
treeaaafec776f63997bfa6c3ea116051c552ce787d7
parent479cbc3eeed060879dc89652e497d7719f7ee1dc (diff)
drm/exynos: make sure that hardware overlay for hdmi is disabled
the values set to registers will be updated into real registers at vsync so dma operation could be malfunctioned when accessed to memory after gem buffer was released. this patch makes sure that hw overlay is disabled before the gem buffer is released. Signed-off-by: Inki Dae <inki.dae@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_hdmi.c11
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_hdmi.h1
-rw-r--r--drivers/gpu/drm/exynos/exynos_mixer.c13
3 files changed, 25 insertions, 0 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
index 3fdf0b65f47e..0584132dc608 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
@@ -274,10 +274,21 @@ static void drm_mixer_disable(struct device *subdrv_dev, int zpos)
274 ctx->enabled[win] = false; 274 ctx->enabled[win] = false;
275} 275}
276 276
277static void drm_mixer_wait_for_vblank(struct device *subdrv_dev)
278{
279 struct drm_hdmi_context *ctx = to_context(subdrv_dev);
280
281 DRM_DEBUG_KMS("%s\n", __FILE__);
282
283 if (mixer_ops && mixer_ops->wait_for_vblank)
284 mixer_ops->wait_for_vblank(ctx->mixer_ctx->ctx);
285}
286
277static struct exynos_drm_overlay_ops drm_hdmi_overlay_ops = { 287static struct exynos_drm_overlay_ops drm_hdmi_overlay_ops = {
278 .mode_set = drm_mixer_mode_set, 288 .mode_set = drm_mixer_mode_set,
279 .commit = drm_mixer_commit, 289 .commit = drm_mixer_commit,
280 .disable = drm_mixer_disable, 290 .disable = drm_mixer_disable,
291 .wait_for_vblank = drm_mixer_wait_for_vblank,
281}; 292};
282 293
283static struct exynos_drm_manager hdmi_manager = { 294static struct exynos_drm_manager hdmi_manager = {
diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h
index a91c42088e42..d9f9e9fcc2b6 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.h
@@ -67,6 +67,7 @@ struct exynos_mixer_ops {
67 void (*dpms)(void *ctx, int mode); 67 void (*dpms)(void *ctx, int mode);
68 68
69 /* overlay */ 69 /* overlay */
70 void (*wait_for_vblank)(void *ctx);
70 void (*win_mode_set)(void *ctx, struct exynos_drm_overlay *overlay); 71 void (*win_mode_set)(void *ctx, struct exynos_drm_overlay *overlay);
71 void (*win_commit)(void *ctx, int zpos); 72 void (*win_commit)(void *ctx, int zpos);
72 void (*win_disable)(void *ctx, int zpos); 73 void (*win_disable)(void *ctx, int zpos);
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
index 25b97d5e5fcb..8a43ee17039e 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -726,6 +726,18 @@ static void mixer_dpms(void *ctx, int mode)
726 } 726 }
727} 727}
728 728
729static void mixer_wait_for_vblank(void *ctx)
730{
731 struct mixer_context *mixer_ctx = ctx;
732 struct mixer_resources *res = &mixer_ctx->mixer_res;
733 int ret;
734
735 ret = wait_for((mixer_reg_read(res, MXR_INT_STATUS) &
736 MXR_INT_STATUS_VSYNC), 50);
737 if (ret < 0)
738 DRM_DEBUG_KMS("vblank wait timed out.\n");
739}
740
729static void mixer_win_mode_set(void *ctx, 741static void mixer_win_mode_set(void *ctx,
730 struct exynos_drm_overlay *overlay) 742 struct exynos_drm_overlay *overlay)
731{ 743{
@@ -818,6 +830,7 @@ static struct exynos_mixer_ops mixer_ops = {
818 .dpms = mixer_dpms, 830 .dpms = mixer_dpms,
819 831
820 /* overlay */ 832 /* overlay */
833 .wait_for_vblank = mixer_wait_for_vblank,
821 .win_mode_set = mixer_win_mode_set, 834 .win_mode_set = mixer_win_mode_set,
822 .win_commit = mixer_win_commit, 835 .win_commit = mixer_win_commit,
823 .win_disable = mixer_win_disable, 836 .win_disable = mixer_win_disable,