@@ -549,6 +549,80 @@ static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi,
549549 return 0 ;
550550}
551551
552+ static u32 * mtk_dpi_bridge_atomic_get_output_bus_fmts (struct drm_bridge * bridge ,
553+ struct drm_bridge_state * bridge_state ,
554+ struct drm_crtc_state * crtc_state ,
555+ struct drm_connector_state * conn_state ,
556+ unsigned int * num_output_fmts )
557+ {
558+ struct mtk_dpi * dpi = bridge_to_dpi (bridge );
559+ u32 * output_fmts ;
560+
561+ * num_output_fmts = 0 ;
562+
563+ if (!dpi -> conf -> output_fmts ) {
564+ dev_err (dpi -> dev , "output_fmts should not be null\n" );
565+ return NULL ;
566+ }
567+
568+ output_fmts = kcalloc (dpi -> conf -> num_output_fmts , sizeof (* output_fmts ),
569+ GFP_KERNEL );
570+ if (!output_fmts )
571+ return NULL ;
572+
573+ * num_output_fmts = dpi -> conf -> num_output_fmts ;
574+
575+ memcpy (output_fmts , dpi -> conf -> output_fmts ,
576+ sizeof (* output_fmts ) * dpi -> conf -> num_output_fmts );
577+
578+ return output_fmts ;
579+ }
580+
581+ static u32 * mtk_dpi_bridge_atomic_get_input_bus_fmts (struct drm_bridge * bridge ,
582+ struct drm_bridge_state * bridge_state ,
583+ struct drm_crtc_state * crtc_state ,
584+ struct drm_connector_state * conn_state ,
585+ u32 output_fmt ,
586+ unsigned int * num_input_fmts )
587+ {
588+ u32 * input_fmts ;
589+
590+ * num_input_fmts = 0 ;
591+
592+ input_fmts = kcalloc (1 , sizeof (* input_fmts ),
593+ GFP_KERNEL );
594+ if (!input_fmts )
595+ return NULL ;
596+
597+ * num_input_fmts = 1 ;
598+ input_fmts [0 ] = MEDIA_BUS_FMT_RGB888_1X24 ;
599+
600+ return input_fmts ;
601+ }
602+
603+ static int mtk_dpi_bridge_atomic_check (struct drm_bridge * bridge ,
604+ struct drm_bridge_state * bridge_state ,
605+ struct drm_crtc_state * crtc_state ,
606+ struct drm_connector_state * conn_state )
607+ {
608+ struct mtk_dpi * dpi = bridge -> driver_private ;
609+ unsigned int out_bus_format ;
610+
611+ out_bus_format = bridge_state -> output_bus_cfg .format ;
612+
613+ dev_dbg (dpi -> dev , "input format 0x%04x, output format 0x%04x\n" ,
614+ bridge_state -> input_bus_cfg .format ,
615+ bridge_state -> output_bus_cfg .format );
616+
617+ dpi -> output_fmt = out_bus_format ;
618+ dpi -> bit_num = MTK_DPI_OUT_BIT_NUM_8BITS ;
619+ dpi -> channel_swap = MTK_DPI_OUT_CHANNEL_SWAP_RGB ;
620+ dpi -> yc_map = MTK_DPI_OUT_YC_MAP_RGB ;
621+ dpi -> color_format = MTK_DPI_COLOR_FORMAT_RGB ;
622+
623+ return 0 ;
624+ }
625+
552626static int mtk_dpi_bridge_attach (struct drm_bridge * bridge ,
553627 enum drm_bridge_attach_flags flags )
554628{
@@ -601,6 +675,12 @@ static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
601675 .mode_valid = mtk_dpi_bridge_mode_valid ,
602676 .disable = mtk_dpi_bridge_disable ,
603677 .enable = mtk_dpi_bridge_enable ,
678+ .atomic_check = mtk_dpi_bridge_atomic_check ,
679+ .atomic_get_output_bus_fmts = mtk_dpi_bridge_atomic_get_output_bus_fmts ,
680+ .atomic_get_input_bus_fmts = mtk_dpi_bridge_atomic_get_input_bus_fmts ,
681+ .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state ,
682+ .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state ,
683+ .atomic_reset = drm_atomic_helper_bridge_reset ,
604684};
605685
606686void mtk_dpi_start (struct device * dev )
@@ -647,11 +727,6 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
647727 }
648728 drm_connector_attach_encoder (dpi -> connector , & dpi -> encoder );
649729
650- dpi -> bit_num = MTK_DPI_OUT_BIT_NUM_8BITS ;
651- dpi -> channel_swap = MTK_DPI_OUT_CHANNEL_SWAP_RGB ;
652- dpi -> yc_map = MTK_DPI_OUT_YC_MAP_RGB ;
653- dpi -> color_format = MTK_DPI_COLOR_FORMAT_RGB ;
654-
655730 return 0 ;
656731
657732err_cleanup :
0 commit comments