aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorInki Dae <inki.dae@samsung.com>2013-08-20 00:51:02 -0400
committerInki Dae <inki.dae@samsung.com>2013-09-05 00:43:43 -0400
commita4f38a80f62bb613525563860cbca87f583081b5 (patch)
tree11362a4ae12a6980748d8986059c896ffff3cc09
parent4db7fcdf59551d9d0a9fe59bd919a32feae925b2 (diff)
drm/exynos: fix fimd pixel format setting
This patch fixes wrong pixel format setting. A pixel format is decided according to bpp and depth, or user-requested format but fimd driver considered only bpp value to decide a proper pixel format. So this patch makes a proper pixel format to be set according to drm_framebuffer's pixel_format which is set by addfb with bpp and depth, or addfb2 with user-requested format. Signed-off-by: Inki Dae <inki.dae@samsung.com> Reviewed-by: Tomasz Figa <t.figa@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fimd.c34
1 files changed, 13 insertions, 21 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index b8aa8fee8201..13d5afbc0dfd 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -91,6 +91,7 @@ struct fimd_win_data {
91 unsigned int fb_width; 91 unsigned int fb_width;
92 unsigned int fb_height; 92 unsigned int fb_height;
93 unsigned int bpp; 93 unsigned int bpp;
94 unsigned int pixel_format;
94 dma_addr_t dma_addr; 95 dma_addr_t dma_addr;
95 unsigned int buf_offsize; 96 unsigned int buf_offsize;
96 unsigned int line_size; /* bytes */ 97 unsigned int line_size; /* bytes */
@@ -397,6 +398,7 @@ static void fimd_win_mode_set(struct device *dev,
397 win_data->fb_height = overlay->fb_height; 398 win_data->fb_height = overlay->fb_height;
398 win_data->dma_addr = overlay->dma_addr[0] + offset; 399 win_data->dma_addr = overlay->dma_addr[0] + offset;
399 win_data->bpp = overlay->bpp; 400 win_data->bpp = overlay->bpp;
401 win_data->pixel_format = overlay->pixel_format;
400 win_data->buf_offsize = (overlay->fb_width - overlay->crtc_width) * 402 win_data->buf_offsize = (overlay->fb_width - overlay->crtc_width) *
401 (overlay->bpp >> 3); 403 (overlay->bpp >> 3);
402 win_data->line_size = overlay->crtc_width * (overlay->bpp >> 3); 404 win_data->line_size = overlay->crtc_width * (overlay->bpp >> 3);
@@ -418,39 +420,29 @@ static void fimd_win_set_pixfmt(struct device *dev, unsigned int win)
418 420
419 val = WINCONx_ENWIN; 421 val = WINCONx_ENWIN;
420 422
421 switch (win_data->bpp) { 423 switch (win_data->pixel_format) {
422 case 1: 424 case DRM_FORMAT_C8:
423 val |= WINCON0_BPPMODE_1BPP;
424 val |= WINCONx_BITSWP;
425 val |= WINCONx_BURSTLEN_4WORD;
426 break;
427 case 2:
428 val |= WINCON0_BPPMODE_2BPP;
429 val |= WINCONx_BITSWP;
430 val |= WINCONx_BURSTLEN_8WORD;
431 break;
432 case 4:
433 val |= WINCON0_BPPMODE_4BPP;
434 val |= WINCONx_BITSWP;
435 val |= WINCONx_BURSTLEN_8WORD;
436 break;
437 case 8:
438 val |= WINCON0_BPPMODE_8BPP_PALETTE; 425 val |= WINCON0_BPPMODE_8BPP_PALETTE;
439 val |= WINCONx_BURSTLEN_8WORD; 426 val |= WINCONx_BURSTLEN_8WORD;
440 val |= WINCONx_BYTSWP; 427 val |= WINCONx_BYTSWP;
441 break; 428 break;
442 case 16: 429 case DRM_FORMAT_XRGB1555:
430 val |= WINCON0_BPPMODE_16BPP_1555;
431 val |= WINCONx_HAWSWP;
432 val |= WINCONx_BURSTLEN_16WORD;
433 break;
434 case DRM_FORMAT_RGB565:
443 val |= WINCON0_BPPMODE_16BPP_565; 435 val |= WINCON0_BPPMODE_16BPP_565;
444 val |= WINCONx_HAWSWP; 436 val |= WINCONx_HAWSWP;
445 val |= WINCONx_BURSTLEN_16WORD; 437 val |= WINCONx_BURSTLEN_16WORD;
446 break; 438 break;
447 case 24: 439 case DRM_FORMAT_XRGB8888:
448 val |= WINCON0_BPPMODE_24BPP_888; 440 val |= WINCON0_BPPMODE_24BPP_888;
449 val |= WINCONx_WSWP; 441 val |= WINCONx_WSWP;
450 val |= WINCONx_BURSTLEN_16WORD; 442 val |= WINCONx_BURSTLEN_16WORD;
451 break; 443 break;
452 case 32: 444 case DRM_FORMAT_ARGB8888:
453 val |= WINCON1_BPPMODE_28BPP_A4888 445 val |= WINCON1_BPPMODE_25BPP_A1888
454 | WINCON1_BLD_PIX | WINCON1_ALPHA_SEL; 446 | WINCON1_BLD_PIX | WINCON1_ALPHA_SEL;
455 val |= WINCONx_WSWP; 447 val |= WINCONx_WSWP;
456 val |= WINCONx_BURSTLEN_16WORD; 448 val |= WINCONx_BURSTLEN_16WORD;