@@ -109,6 +109,7 @@ struct fimd_driver_data {
109109 unsigned int has_dp_clk :1 ;
110110 unsigned int has_hw_trigger :1 ;
111111 unsigned int has_trigger_per_te :1 ;
112+ unsigned int has_bgr_support :1 ;
112113};
113114
114115static struct fimd_driver_data s3c64xx_fimd_driver_data = {
@@ -138,6 +139,7 @@ static struct fimd_driver_data exynos4_fimd_driver_data = {
138139 .lcdblk_bypass_shift = 1 ,
139140 .has_shadowcon = 1 ,
140141 .has_vtsel = 1 ,
142+ .has_bgr_support = 1 ,
141143};
142144
143145static struct fimd_driver_data exynos5_fimd_driver_data = {
@@ -149,6 +151,7 @@ static struct fimd_driver_data exynos5_fimd_driver_data = {
149151 .has_vidoutcon = 1 ,
150152 .has_vtsel = 1 ,
151153 .has_dp_clk = 1 ,
154+ .has_bgr_support = 1 ,
152155};
153156
154157static struct fimd_driver_data exynos5420_fimd_driver_data = {
@@ -162,6 +165,7 @@ static struct fimd_driver_data exynos5420_fimd_driver_data = {
162165 .has_vtsel = 1 ,
163166 .has_mic_bypass = 1 ,
164167 .has_dp_clk = 1 ,
168+ .has_bgr_support = 1 ,
165169};
166170
167171struct fimd_context {
@@ -226,6 +230,18 @@ static const uint32_t fimd_formats[] = {
226230 DRM_FORMAT_ARGB8888 ,
227231};
228232
233+ static const uint32_t fimd_extended_formats [] = {
234+ DRM_FORMAT_C8 ,
235+ DRM_FORMAT_XRGB1555 ,
236+ DRM_FORMAT_XBGR1555 ,
237+ DRM_FORMAT_RGB565 ,
238+ DRM_FORMAT_BGR565 ,
239+ DRM_FORMAT_XRGB8888 ,
240+ DRM_FORMAT_XBGR8888 ,
241+ DRM_FORMAT_ARGB8888 ,
242+ DRM_FORMAT_ABGR8888 ,
243+ };
244+
229245static const unsigned int capabilities [WINDOWS_NR ] = {
230246 0 ,
231247 EXYNOS_DRM_PLANE_CAP_WIN_BLEND | EXYNOS_DRM_PLANE_CAP_PIX_BLEND ,
@@ -673,28 +689,44 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win,
673689 val |= WINCONx_BYTSWP ;
674690 break ;
675691 case DRM_FORMAT_XRGB1555 :
692+ case DRM_FORMAT_XBGR1555 :
676693 val |= WINCON0_BPPMODE_16BPP_1555 ;
677694 val |= WINCONx_HAWSWP ;
678695 val |= WINCONx_BURSTLEN_16WORD ;
679696 break ;
680697 case DRM_FORMAT_RGB565 :
698+ case DRM_FORMAT_BGR565 :
681699 val |= WINCON0_BPPMODE_16BPP_565 ;
682700 val |= WINCONx_HAWSWP ;
683701 val |= WINCONx_BURSTLEN_16WORD ;
684702 break ;
685703 case DRM_FORMAT_XRGB8888 :
704+ case DRM_FORMAT_XBGR8888 :
686705 val |= WINCON0_BPPMODE_24BPP_888 ;
687706 val |= WINCONx_WSWP ;
688707 val |= WINCONx_BURSTLEN_16WORD ;
689708 break ;
690709 case DRM_FORMAT_ARGB8888 :
710+ case DRM_FORMAT_ABGR8888 :
691711 default :
692712 val |= WINCON1_BPPMODE_25BPP_A1888 ;
693713 val |= WINCONx_WSWP ;
694714 val |= WINCONx_BURSTLEN_16WORD ;
695715 break ;
696716 }
697717
718+ switch (pixel_format ) {
719+ case DRM_FORMAT_XBGR1555 :
720+ case DRM_FORMAT_XBGR8888 :
721+ case DRM_FORMAT_ABGR8888 :
722+ case DRM_FORMAT_BGR565 :
723+ writel (WIN_RGB_ORDER_REVERSE , ctx -> regs + WIN_RGB_ORDER (win ));
724+ break ;
725+ default :
726+ writel (WIN_RGB_ORDER_FORWARD , ctx -> regs + WIN_RGB_ORDER (win ));
727+ break ;
728+ }
729+
698730 /*
699731 * Setting dma-burst to 16Word causes permanent tearing for very small
700732 * buffers, e.g. cursor buffer. Burst Mode switching which based on
@@ -1074,8 +1106,14 @@ static int fimd_bind(struct device *dev, struct device *master, void *data)
10741106 ctx -> drm_dev = drm_dev ;
10751107
10761108 for (i = 0 ; i < WINDOWS_NR ; i ++ ) {
1077- ctx -> configs [i ].pixel_formats = fimd_formats ;
1078- ctx -> configs [i ].num_pixel_formats = ARRAY_SIZE (fimd_formats );
1109+ if (ctx -> driver_data -> has_bgr_support ) {
1110+ ctx -> configs [i ].pixel_formats = fimd_extended_formats ;
1111+ ctx -> configs [i ].num_pixel_formats = ARRAY_SIZE (fimd_extended_formats );
1112+ } else {
1113+ ctx -> configs [i ].pixel_formats = fimd_formats ;
1114+ ctx -> configs [i ].num_pixel_formats = ARRAY_SIZE (fimd_formats );
1115+ }
1116+
10791117 ctx -> configs [i ].zpos = i ;
10801118 ctx -> configs [i ].type = fimd_win_types [i ];
10811119 ctx -> configs [i ].capabilities = capabilities [i ];
@@ -1133,7 +1171,6 @@ static int fimd_probe(struct platform_device *pdev)
11331171 struct device * dev = & pdev -> dev ;
11341172 struct fimd_context * ctx ;
11351173 struct device_node * i80_if_timings ;
1136- struct resource * res ;
11371174 int ret ;
11381175
11391176 if (!dev -> of_node )
@@ -1206,15 +1243,11 @@ static int fimd_probe(struct platform_device *pdev)
12061243 if (IS_ERR (ctx -> regs ))
12071244 return PTR_ERR (ctx -> regs );
12081245
1209- res = platform_get_resource_byname (pdev , IORESOURCE_IRQ ,
1210- ctx -> i80_if ? "lcd_sys" : "vsync" );
1211- if (!res ) {
1212- dev_err (dev , "irq request failed.\n" );
1213- return - ENXIO ;
1214- }
1246+ ret = platform_get_irq_byname (pdev , ctx -> i80_if ? "lcd_sys" : "vsync" );
1247+ if (ret < 0 )
1248+ return ret ;
12151249
1216- ret = devm_request_irq (dev , res -> start , fimd_irq_handler ,
1217- 0 , "drm_fimd" , ctx );
1250+ ret = devm_request_irq (dev , ret , fimd_irq_handler , 0 , "drm_fimd" , ctx );
12181251 if (ret ) {
12191252 dev_err (dev , "irq request failed.\n" );
12201253 return ret ;
0 commit comments