aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustavo Padovan <gustavo.padovan@collabora.co.uk>2015-04-01 12:02:05 -0400
committerInki Dae <inki.dae@samsung.com>2015-04-12 22:39:39 -0400
commit453b44a3f6f3f43f50387a9af27c5356c273e831 (patch)
tree403d076fa884eabc865d4540a822c9c357573d4b
parent1d8ac08d498d579aae36221a80b4b724b2f52f39 (diff)
drm/exynos: fimd: fix alpha setting for XR24 pixel format
XR24 planes were not shown properly, so now set the right registers to correctly enable displaying these planes. It also moves the alpha register settings to fimd_win_set_pixfmt() to keep all pixel format stuff together. v2: remove leftover var alpha Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk> Signed-off-by: Inki Dae <inki.dae@samsung.com>
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fimd.c33
-rw-r--r--include/video/samsung_fimd.h5
2 files changed, 27 insertions, 11 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index 33a10ce967ea..6f51d3d7ef6f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -54,6 +54,9 @@
54/* size control register for hardware windows 1 ~ 2. */ 54/* size control register for hardware windows 1 ~ 2. */
55#define VIDOSD_D(win) (VIDOSD_BASE + 0x0C + (win) * 16) 55#define VIDOSD_D(win) (VIDOSD_BASE + 0x0C + (win) * 16)
56 56
57#define VIDWnALPHA0(win) (VIDW_ALPHA + 0x00 + (win) * 8)
58#define VIDWnALPHA1(win) (VIDW_ALPHA + 0x04 + (win) * 8)
59
57#define VIDWx_BUF_START(win, buf) (VIDW_BUF_START(buf) + (win) * 8) 60#define VIDWx_BUF_START(win, buf) (VIDW_BUF_START(buf) + (win) * 8)
58#define VIDWx_BUF_END(win, buf) (VIDW_BUF_END(buf) + (win) * 8) 61#define VIDWx_BUF_END(win, buf) (VIDW_BUF_END(buf) + (win) * 8)
59#define VIDWx_BUF_SIZE(win, buf) (VIDW_BUF_SIZE(buf) + (win) * 4) 62#define VIDWx_BUF_SIZE(win, buf) (VIDW_BUF_SIZE(buf) + (win) * 4)
@@ -620,6 +623,24 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win)
620 } 623 }
621 624
622 writel(val, ctx->regs + WINCON(win)); 625 writel(val, ctx->regs + WINCON(win));
626
627 /* hardware window 0 doesn't support alpha channel. */
628 if (win != 0) {
629 /* OSD alpha */
630 val = VIDISD14C_ALPHA0_R(0xf) |
631 VIDISD14C_ALPHA0_G(0xf) |
632 VIDISD14C_ALPHA0_B(0xf) |
633 VIDISD14C_ALPHA1_R(0xf) |
634 VIDISD14C_ALPHA1_G(0xf) |
635 VIDISD14C_ALPHA1_B(0xf);
636
637 writel(val, ctx->regs + VIDOSD_C(win));
638
639 val = VIDW_ALPHA_R(0xf) | VIDW_ALPHA_G(0xf) |
640 VIDW_ALPHA_G(0xf);
641 writel(val, ctx->regs + VIDWnALPHA0(win));
642 writel(val, ctx->regs + VIDWnALPHA1(win));
643 }
623} 644}
624 645
625static void fimd_win_set_colkey(struct fimd_context *ctx, unsigned int win) 646static void fimd_win_set_colkey(struct fimd_context *ctx, unsigned int win)
@@ -667,7 +688,7 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos)
667 struct fimd_context *ctx = crtc->ctx; 688 struct fimd_context *ctx = crtc->ctx;
668 struct fimd_win_data *win_data; 689 struct fimd_win_data *win_data;
669 int win = zpos; 690 int win = zpos;
670 unsigned long val, alpha, size; 691 unsigned long val, size;
671 unsigned int last_x; 692 unsigned int last_x;
672 unsigned int last_y; 693 unsigned int last_y;
673 694
@@ -744,16 +765,6 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos)
744 DRM_DEBUG_KMS("osd pos: tx = %d, ty = %d, bx = %d, by = %d\n", 765 DRM_DEBUG_KMS("osd pos: tx = %d, ty = %d, bx = %d, by = %d\n",
745 win_data->offset_x, win_data->offset_y, last_x, last_y); 766 win_data->offset_x, win_data->offset_y, last_x, last_y);
746 767
747 /* hardware window 0 doesn't support alpha channel. */
748 if (win != 0) {
749 /* OSD alpha */
750 alpha = VIDISD14C_ALPHA1_R(0xf) |
751 VIDISD14C_ALPHA1_G(0xf) |
752 VIDISD14C_ALPHA1_B(0xf);
753
754 writel(alpha, ctx->regs + VIDOSD_C(win));
755 }
756
757 /* OSD size */ 768 /* OSD size */
758 if (win != 3 && win != 4) { 769 if (win != 3 && win != 4) {
759 u32 offset = VIDOSD_D(win); 770 u32 offset = VIDOSD_D(win);
diff --git a/include/video/samsung_fimd.h b/include/video/samsung_fimd.h
index a20e4a3a8b15..513242827b07 100644
--- a/include/video/samsung_fimd.h
+++ b/include/video/samsung_fimd.h
@@ -289,6 +289,11 @@
289#define VIDISD14C_ALPHA1_B_LIMIT 0xf 289#define VIDISD14C_ALPHA1_B_LIMIT 0xf
290#define VIDISD14C_ALPHA1_B(_x) ((_x) << 0) 290#define VIDISD14C_ALPHA1_B(_x) ((_x) << 0)
291 291
292#define VIDW_ALPHA 0x021c
293#define VIDW_ALPHA_R(_x) ((_x) << 16)
294#define VIDW_ALPHA_G(_x) ((_x) << 8)
295#define VIDW_ALPHA_B(_x) ((_x) << 0)
296
292/* Video buffer addresses */ 297/* Video buffer addresses */
293#define VIDW_BUF_START(_buff) (0xA0 + ((_buff) * 8)) 298#define VIDW_BUF_START(_buff) (0xA0 + ((_buff) * 8))
294#define VIDW_BUF_START1(_buff) (0xA4 + ((_buff) * 8)) 299#define VIDW_BUF_START1(_buff) (0xA4 + ((_buff) * 8))