Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/exynos: fimd: add BGR support for exynos4/5

In the downstream kernels for exynos4 and exynos5 devices, there is an
undocumented register that controls the order of the RGB output. It can
be set to either normal order or reversed, which enables BGR support for
those SoCs.

This patch enables the BGR support for all the SoCs that were found to
have at least one device with this logic in the corresponding downstream
kernels.

Signed-off-by: Martin Jücker <martin.juecker@gmail.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>

authored by

Martin Jücker and committed by
Inki Dae
2d684f4e fedc8982

+44 -2
+40 -2
drivers/gpu/drm/exynos/exynos_drm_fimd.c
··· 109 109 unsigned int has_dp_clk:1; 110 110 unsigned int has_hw_trigger:1; 111 111 unsigned int has_trigger_per_te:1; 112 + unsigned int has_bgr_support:1; 112 113 }; 113 114 114 115 static struct fimd_driver_data s3c64xx_fimd_driver_data = { ··· 139 138 .lcdblk_bypass_shift = 1, 140 139 .has_shadowcon = 1, 141 140 .has_vtsel = 1, 141 + .has_bgr_support = 1, 142 142 }; 143 143 144 144 static struct fimd_driver_data exynos5_fimd_driver_data = { ··· 151 149 .has_vidoutcon = 1, 152 150 .has_vtsel = 1, 153 151 .has_dp_clk = 1, 152 + .has_bgr_support = 1, 154 153 }; 155 154 156 155 static struct fimd_driver_data exynos5420_fimd_driver_data = { ··· 165 162 .has_vtsel = 1, 166 163 .has_mic_bypass = 1, 167 164 .has_dp_clk = 1, 165 + .has_bgr_support = 1, 168 166 }; 169 167 170 168 struct fimd_context { ··· 228 224 DRM_FORMAT_RGB565, 229 225 DRM_FORMAT_XRGB8888, 230 226 DRM_FORMAT_ARGB8888, 227 + }; 228 + 229 + static const uint32_t fimd_extended_formats[] = { 230 + DRM_FORMAT_C8, 231 + DRM_FORMAT_XRGB1555, 232 + DRM_FORMAT_XBGR1555, 233 + DRM_FORMAT_RGB565, 234 + DRM_FORMAT_BGR565, 235 + DRM_FORMAT_XRGB8888, 236 + DRM_FORMAT_XBGR8888, 237 + DRM_FORMAT_ARGB8888, 238 + DRM_FORMAT_ABGR8888, 231 239 }; 232 240 233 241 static const unsigned int capabilities[WINDOWS_NR] = { ··· 689 673 val |= WINCONx_BYTSWP; 690 674 break; 691 675 case DRM_FORMAT_XRGB1555: 676 + case DRM_FORMAT_XBGR1555: 692 677 val |= WINCON0_BPPMODE_16BPP_1555; 693 678 val |= WINCONx_HAWSWP; 694 679 val |= WINCONx_BURSTLEN_16WORD; 695 680 break; 696 681 case DRM_FORMAT_RGB565: 682 + case DRM_FORMAT_BGR565: 697 683 val |= WINCON0_BPPMODE_16BPP_565; 698 684 val |= WINCONx_HAWSWP; 699 685 val |= WINCONx_BURSTLEN_16WORD; 700 686 break; 701 687 case DRM_FORMAT_XRGB8888: 688 + case DRM_FORMAT_XBGR8888: 702 689 val |= WINCON0_BPPMODE_24BPP_888; 703 690 val |= WINCONx_WSWP; 704 691 val |= WINCONx_BURSTLEN_16WORD; 705 692 break; 706 693 case DRM_FORMAT_ARGB8888: 694 + case DRM_FORMAT_ABGR8888: 707 695 default: 708 696 val |= WINCON1_BPPMODE_25BPP_A1888; 709 697 val |= WINCONx_WSWP; 710 698 val |= WINCONx_BURSTLEN_16WORD; 699 + break; 700 + } 701 + 702 + switch (pixel_format) { 703 + case DRM_FORMAT_XBGR1555: 704 + case DRM_FORMAT_XBGR8888: 705 + case DRM_FORMAT_ABGR8888: 706 + case DRM_FORMAT_BGR565: 707 + writel(WIN_RGB_ORDER_REVERSE, ctx->regs + WIN_RGB_ORDER(win)); 708 + break; 709 + default: 710 + writel(WIN_RGB_ORDER_FORWARD, ctx->regs + WIN_RGB_ORDER(win)); 711 711 break; 712 712 } 713 713 ··· 1106 1074 ctx->drm_dev = drm_dev; 1107 1075 1108 1076 for (i = 0; i < WINDOWS_NR; i++) { 1109 - ctx->configs[i].pixel_formats = fimd_formats; 1110 - ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_formats); 1077 + if (ctx->driver_data->has_bgr_support) { 1078 + ctx->configs[i].pixel_formats = fimd_extended_formats; 1079 + ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_extended_formats); 1080 + } else { 1081 + ctx->configs[i].pixel_formats = fimd_formats; 1082 + ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_formats); 1083 + } 1084 + 1111 1085 ctx->configs[i].zpos = i; 1112 1086 ctx->configs[i].type = fimd_win_types[i]; 1113 1087 ctx->configs[i].capabilities = capabilities[i];
+4
include/video/samsung_fimd.h
··· 476 476 * 1111 -none- -none- -none- -none- -none- 477 477 */ 478 478 479 + #define WIN_RGB_ORDER(_win) (0x2020 + ((_win) * 4)) 480 + #define WIN_RGB_ORDER_FORWARD (0 << 11) 481 + #define WIN_RGB_ORDER_REVERSE (1 << 11) 482 + 479 483 /* FIMD Version 8 register offset definitions */ 480 484 #define FIMD_V8_VIDTCON0 0x20010 481 485 #define FIMD_V8_VIDTCON1 0x20014