unsigned int has_dp_clk:1;
        unsigned int has_hw_trigger:1;
        unsigned int has_trigger_per_te:1;
+       unsigned int has_bgr_support:1;
 };
 
 static struct fimd_driver_data s3c64xx_fimd_driver_data = {
        .lcdblk_bypass_shift = 1,
        .has_shadowcon = 1,
        .has_vtsel = 1,
+       .has_bgr_support = 1,
 };
 
 static struct fimd_driver_data exynos5_fimd_driver_data = {
        .has_vidoutcon = 1,
        .has_vtsel = 1,
        .has_dp_clk = 1,
+       .has_bgr_support = 1,
 };
 
 static struct fimd_driver_data exynos5420_fimd_driver_data = {
        .has_vtsel = 1,
        .has_mic_bypass = 1,
        .has_dp_clk = 1,
+       .has_bgr_support = 1,
 };
 
 struct fimd_context {
        DRM_FORMAT_ARGB8888,
 };
 
+static const uint32_t fimd_extended_formats[] = {
+       DRM_FORMAT_C8,
+       DRM_FORMAT_XRGB1555,
+       DRM_FORMAT_XBGR1555,
+       DRM_FORMAT_RGB565,
+       DRM_FORMAT_BGR565,
+       DRM_FORMAT_XRGB8888,
+       DRM_FORMAT_XBGR8888,
+       DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_ABGR8888,
+};
+
 static const unsigned int capabilities[WINDOWS_NR] = {
        0,
        EXYNOS_DRM_PLANE_CAP_WIN_BLEND | EXYNOS_DRM_PLANE_CAP_PIX_BLEND,
                val |= WINCONx_BYTSWP;
                break;
        case DRM_FORMAT_XRGB1555:
+       case DRM_FORMAT_XBGR1555:
                val |= WINCON0_BPPMODE_16BPP_1555;
                val |= WINCONx_HAWSWP;
                val |= WINCONx_BURSTLEN_16WORD;
                break;
        case DRM_FORMAT_RGB565:
+       case DRM_FORMAT_BGR565:
                val |= WINCON0_BPPMODE_16BPP_565;
                val |= WINCONx_HAWSWP;
                val |= WINCONx_BURSTLEN_16WORD;
                break;
        case DRM_FORMAT_XRGB8888:
+       case DRM_FORMAT_XBGR8888:
                val |= WINCON0_BPPMODE_24BPP_888;
                val |= WINCONx_WSWP;
                val |= WINCONx_BURSTLEN_16WORD;
                break;
        case DRM_FORMAT_ARGB8888:
+       case DRM_FORMAT_ABGR8888:
        default:
                val |= WINCON1_BPPMODE_25BPP_A1888;
                val |= WINCONx_WSWP;
                break;
        }
 
+       switch (pixel_format) {
+       case DRM_FORMAT_XBGR1555:
+       case DRM_FORMAT_XBGR8888:
+       case DRM_FORMAT_ABGR8888:
+       case DRM_FORMAT_BGR565:
+               writel(WIN_RGB_ORDER_REVERSE, ctx->regs + WIN_RGB_ORDER(win));
+               break;
+       default:
+               writel(WIN_RGB_ORDER_FORWARD, ctx->regs + WIN_RGB_ORDER(win));
+               break;
+       }
+
        /*
         * Setting dma-burst to 16Word causes permanent tearing for very small
         * buffers, e.g. cursor buffer. Burst Mode switching which based on
        ctx->drm_dev = drm_dev;
 
        for (i = 0; i < WINDOWS_NR; i++) {
-               ctx->configs[i].pixel_formats = fimd_formats;
-               ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_formats);
+               if (ctx->driver_data->has_bgr_support) {
+                       ctx->configs[i].pixel_formats = fimd_extended_formats;
+                       ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_extended_formats);
+               } else {
+                       ctx->configs[i].pixel_formats = fimd_formats;
+                       ctx->configs[i].num_pixel_formats = ARRAY_SIZE(fimd_formats);
+               }
+
                ctx->configs[i].zpos = i;
                ctx->configs[i].type = fimd_win_types[i];
                ctx->configs[i].capabilities = capabilities[i];