@@ -295,11 +295,18 @@ static void atmel_hlcdc_crtc_atomic_enable(struct drm_crtc *c,
295295
296296}
297297
298- #define ATMEL_HLCDC_RGB444_OUTPUT BIT(0)
299- #define ATMEL_HLCDC_RGB565_OUTPUT BIT(1)
300- #define ATMEL_HLCDC_RGB666_OUTPUT BIT(2)
301- #define ATMEL_HLCDC_RGB888_OUTPUT BIT(3)
302- #define ATMEL_HLCDC_OUTPUT_MODE_MASK GENMASK(3, 0)
298+ #define ATMEL_HLCDC_RGB444_OUTPUT BIT(0)
299+ #define ATMEL_HLCDC_RGB565_OUTPUT BIT(1)
300+ #define ATMEL_HLCDC_RGB666_OUTPUT BIT(2)
301+ #define ATMEL_HLCDC_RGB888_OUTPUT BIT(3)
302+ #define ATMEL_HLCDC_DPI_RGB565C1_OUTPUT BIT(4)
303+ #define ATMEL_HLCDC_DPI_RGB565C2_OUTPUT BIT(5)
304+ #define ATMEL_HLCDC_DPI_RGB565C3_OUTPUT BIT(6)
305+ #define ATMEL_HLCDC_DPI_RGB666C1_OUTPUT BIT(7)
306+ #define ATMEL_HLCDC_DPI_RGB666C2_OUTPUT BIT(8)
307+ #define ATMEL_HLCDC_DPI_RGB888_OUTPUT BIT(9)
308+ #define ATMEL_HLCDC_OUTPUT_MODE_MASK GENMASK(3, 0)
309+ #define ATMEL_XLCDC_OUTPUT_MODE_MASK GENMASK(9, 0)
303310
304311static int atmel_hlcdc_connector_output_mode (struct drm_connector_state * state )
305312{
@@ -313,53 +320,99 @@ static int atmel_hlcdc_connector_output_mode(struct drm_connector_state *state)
313320 if (!encoder )
314321 encoder = connector -> encoder ;
315322
316- switch (atmel_hlcdc_encoder_get_bus_fmt (encoder )) {
317- case 0 :
318- break ;
319- case MEDIA_BUS_FMT_RGB444_1X12 :
320- return ATMEL_HLCDC_RGB444_OUTPUT ;
321- case MEDIA_BUS_FMT_RGB565_1X16 :
322- return ATMEL_HLCDC_RGB565_OUTPUT ;
323- case MEDIA_BUS_FMT_RGB666_1X18 :
324- return ATMEL_HLCDC_RGB666_OUTPUT ;
325- case MEDIA_BUS_FMT_RGB888_1X24 :
326- return ATMEL_HLCDC_RGB888_OUTPUT ;
327- default :
328- return - EINVAL ;
329- }
330-
331- for (j = 0 ; j < info -> num_bus_formats ; j ++ ) {
332- switch (info -> bus_formats [j ]) {
333- case MEDIA_BUS_FMT_RGB444_1X12 :
334- supported_fmts |= ATMEL_HLCDC_RGB444_OUTPUT ;
323+ if (encoder -> encoder_type == DRM_MODE_ENCODER_DSI ) {
324+ /*
325+ * atmel-hlcdc to support DSI formats with DSI video pipeline
326+ * when DRM_MODE_ENCODER_DSI type is set by
327+ * connector driver component.
328+ */
329+ switch (atmel_hlcdc_encoder_get_bus_fmt (encoder )) {
330+ case 0 :
335331 break ;
336332 case MEDIA_BUS_FMT_RGB565_1X16 :
337- supported_fmts |= ATMEL_HLCDC_RGB565_OUTPUT ;
338- break ;
333+ return ATMEL_HLCDC_DPI_RGB565C1_OUTPUT ;
339334 case MEDIA_BUS_FMT_RGB666_1X18 :
340- supported_fmts |= ATMEL_HLCDC_RGB666_OUTPUT ;
341- break ;
335+ return ATMEL_HLCDC_DPI_RGB666C1_OUTPUT ;
336+ case MEDIA_BUS_FMT_RGB666_1X24_CPADHI :
337+ return ATMEL_HLCDC_DPI_RGB666C2_OUTPUT ;
342338 case MEDIA_BUS_FMT_RGB888_1X24 :
343- supported_fmts |= ATMEL_HLCDC_RGB888_OUTPUT ;
344- break ;
339+ return ATMEL_HLCDC_DPI_RGB888_OUTPUT ;
345340 default :
341+ return - EINVAL ;
342+ }
343+
344+ for (j = 0 ; j < info -> num_bus_formats ; j ++ ) {
345+ switch (info -> bus_formats [j ]) {
346+ case MEDIA_BUS_FMT_RGB565_1X16 :
347+ supported_fmts |=
348+ ATMEL_HLCDC_DPI_RGB565C1_OUTPUT ;
349+ break ;
350+ case MEDIA_BUS_FMT_RGB666_1X18 :
351+ supported_fmts |=
352+ ATMEL_HLCDC_DPI_RGB666C1_OUTPUT ;
353+ break ;
354+ case MEDIA_BUS_FMT_RGB666_1X24_CPADHI :
355+ supported_fmts |=
356+ ATMEL_HLCDC_DPI_RGB666C2_OUTPUT ;
357+ break ;
358+ case MEDIA_BUS_FMT_RGB888_1X24 :
359+ supported_fmts |=
360+ ATMEL_HLCDC_DPI_RGB888_OUTPUT ;
361+ break ;
362+ default :
363+ break ;
364+ }
365+ }
366+ } else {
367+ switch (atmel_hlcdc_encoder_get_bus_fmt (encoder )) {
368+ case 0 :
346369 break ;
370+ case MEDIA_BUS_FMT_RGB444_1X12 :
371+ return ATMEL_HLCDC_RGB444_OUTPUT ;
372+ case MEDIA_BUS_FMT_RGB565_1X16 :
373+ return ATMEL_HLCDC_RGB565_OUTPUT ;
374+ case MEDIA_BUS_FMT_RGB666_1X18 :
375+ return ATMEL_HLCDC_RGB666_OUTPUT ;
376+ case MEDIA_BUS_FMT_RGB888_1X24 :
377+ return ATMEL_HLCDC_RGB888_OUTPUT ;
378+ default :
379+ return - EINVAL ;
347380 }
348- }
349381
382+ for (j = 0 ; j < info -> num_bus_formats ; j ++ ) {
383+ switch (info -> bus_formats [j ]) {
384+ case MEDIA_BUS_FMT_RGB444_1X12 :
385+ supported_fmts |= ATMEL_HLCDC_RGB444_OUTPUT ;
386+ break ;
387+ case MEDIA_BUS_FMT_RGB565_1X16 :
388+ supported_fmts |= ATMEL_HLCDC_RGB565_OUTPUT ;
389+ break ;
390+ case MEDIA_BUS_FMT_RGB666_1X18 :
391+ supported_fmts |= ATMEL_HLCDC_RGB666_OUTPUT ;
392+ break ;
393+ case MEDIA_BUS_FMT_RGB888_1X24 :
394+ supported_fmts |= ATMEL_HLCDC_RGB888_OUTPUT ;
395+ break ;
396+ default :
397+ break ;
398+ }
399+ }
400+ }
350401 return supported_fmts ;
351402}
352403
353404static int atmel_hlcdc_crtc_select_output_mode (struct drm_crtc_state * state )
354405{
355- unsigned int output_fmts = ATMEL_HLCDC_OUTPUT_MODE_MASK ;
406+ unsigned int output_fmts ;
356407 struct atmel_hlcdc_crtc_state * hstate ;
357408 struct drm_connector_state * cstate ;
358409 struct drm_connector * connector ;
359- struct atmel_hlcdc_crtc * crtc ;
410+ struct atmel_hlcdc_crtc * crtc = drm_crtc_to_atmel_hlcdc_crtc ( state -> crtc ) ;
360411 int i ;
412+ bool is_xlcdc = crtc -> dc -> desc -> is_xlcdc ;
361413
362- crtc = drm_crtc_to_atmel_hlcdc_crtc (state -> crtc );
414+ output_fmts = is_xlcdc ? ATMEL_XLCDC_OUTPUT_MODE_MASK :
415+ ATMEL_HLCDC_OUTPUT_MODE_MASK ;
363416
364417 for_each_new_connector_in_state (state -> state , connector , cstate , i ) {
365418 unsigned int supported_fmts = 0 ;
@@ -380,7 +433,7 @@ static int atmel_hlcdc_crtc_select_output_mode(struct drm_crtc_state *state)
380433
381434 hstate = drm_crtc_state_to_atmel_hlcdc_crtc_state (state );
382435 hstate -> output_mode = fls (output_fmts ) - 1 ;
383- if (crtc -> dc -> desc -> is_xlcdc ) {
436+ if (is_xlcdc ) {
384437 /* check if MIPI DPI bit needs to be set */
385438 if (fls (output_fmts ) > 3 ) {
386439 hstate -> output_mode -= 4 ;
0 commit comments