@@ -64,7 +64,8 @@ enum mtk_dpi_out_color_format {
6464struct mtk_dpi {
6565 struct mtk_ddp_comp ddp_comp ;
6666 struct drm_encoder encoder ;
67- struct drm_bridge * bridge ;
67+ struct drm_bridge bridge ;
68+ struct drm_bridge * next_bridge ;
6869 void __iomem * regs ;
6970 struct device * dev ;
7071 struct clk * engine_clk ;
@@ -83,9 +84,9 @@ struct mtk_dpi {
8384 int refcount ;
8485};
8586
86- static inline struct mtk_dpi * mtk_dpi_from_encoder (struct drm_encoder * e )
87+ static inline struct mtk_dpi * bridge_to_dpi (struct drm_bridge * b )
8788{
88- return container_of (e , struct mtk_dpi , encoder );
89+ return container_of (b , struct mtk_dpi , bridge );
8990}
9091
9192enum mtk_dpi_polarity {
@@ -521,50 +522,53 @@ static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi,
521522 return 0 ;
522523}
523524
524- static bool mtk_dpi_encoder_mode_fixup (struct drm_encoder * encoder ,
525- const struct drm_display_mode * mode ,
526- struct drm_display_mode * adjusted_mode )
525+ static void mtk_dpi_encoder_destroy (struct drm_encoder * encoder )
527526{
528- return true ;
527+ drm_encoder_cleanup ( encoder ) ;
529528}
530529
531- static void mtk_dpi_encoder_mode_set (struct drm_encoder * encoder ,
532- struct drm_display_mode * mode ,
533- struct drm_display_mode * adjusted_mode )
530+ static const struct drm_encoder_funcs mtk_dpi_encoder_funcs = {
531+ .destroy = mtk_dpi_encoder_destroy ,
532+ };
533+
534+ static int mtk_dpi_bridge_attach (struct drm_bridge * bridge ,
535+ enum drm_bridge_attach_flags flags )
534536{
535- struct mtk_dpi * dpi = mtk_dpi_from_encoder (encoder );
537+ struct mtk_dpi * dpi = bridge_to_dpi (bridge );
538+
539+ return drm_bridge_attach (bridge -> encoder , dpi -> next_bridge ,
540+ & dpi -> bridge , flags );
541+ }
542+
543+ static void mtk_dpi_bridge_mode_set (struct drm_bridge * bridge ,
544+ const struct drm_display_mode * mode ,
545+ const struct drm_display_mode * adjusted_mode )
546+ {
547+ struct mtk_dpi * dpi = bridge_to_dpi (bridge );
536548
537549 drm_mode_copy (& dpi -> mode , adjusted_mode );
538550}
539551
540- static void mtk_dpi_encoder_disable (struct drm_encoder * encoder )
552+ static void mtk_dpi_bridge_disable (struct drm_bridge * bridge )
541553{
542- struct mtk_dpi * dpi = mtk_dpi_from_encoder ( encoder );
554+ struct mtk_dpi * dpi = bridge_to_dpi ( bridge );
543555
544556 mtk_dpi_power_off (dpi );
545557}
546558
547- static void mtk_dpi_encoder_enable (struct drm_encoder * encoder )
559+ static void mtk_dpi_bridge_enable (struct drm_bridge * bridge )
548560{
549- struct mtk_dpi * dpi = mtk_dpi_from_encoder ( encoder );
561+ struct mtk_dpi * dpi = bridge_to_dpi ( bridge );
550562
551563 mtk_dpi_power_on (dpi );
552564 mtk_dpi_set_display_mode (dpi , & dpi -> mode );
553565}
554566
555- static int mtk_dpi_atomic_check (struct drm_encoder * encoder ,
556- struct drm_crtc_state * crtc_state ,
557- struct drm_connector_state * conn_state )
558- {
559- return 0 ;
560- }
561-
562- static const struct drm_encoder_helper_funcs mtk_dpi_encoder_helper_funcs = {
563- .mode_fixup = mtk_dpi_encoder_mode_fixup ,
564- .mode_set = mtk_dpi_encoder_mode_set ,
565- .disable = mtk_dpi_encoder_disable ,
566- .enable = mtk_dpi_encoder_enable ,
567- .atomic_check = mtk_dpi_atomic_check ,
567+ static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
568+ .attach = mtk_dpi_bridge_attach ,
569+ .mode_set = mtk_dpi_bridge_mode_set ,
570+ .disable = mtk_dpi_bridge_disable ,
571+ .enable = mtk_dpi_bridge_enable ,
568572};
569573
570574static void mtk_dpi_start (struct mtk_ddp_comp * comp )
@@ -605,12 +609,10 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
605609 dev_err (dev , "Failed to initialize decoder: %d\n" , ret );
606610 goto err_unregister ;
607611 }
608- drm_encoder_helper_add (& dpi -> encoder , & mtk_dpi_encoder_helper_funcs );
609612
610- /* Currently DPI0 is fixed to be driven by OVL1 */
611- dpi -> encoder .possible_crtcs = BIT (1 );
613+ dpi -> encoder .possible_crtcs = mtk_drm_find_possible_crtc_by_comp (drm_dev , dpi -> ddp_comp );
612614
613- ret = drm_bridge_attach (& dpi -> encoder , dpi -> bridge , NULL , 0 );
615+ ret = drm_bridge_attach (& dpi -> encoder , & dpi -> bridge , NULL , 0 );
614616 if (ret ) {
615617 dev_err (dev , "Failed to attach bridge: %d\n" , ret );
616618 goto err_cleanup ;
@@ -770,11 +772,11 @@ static int mtk_dpi_probe(struct platform_device *pdev)
770772 }
771773
772774 ret = drm_of_find_panel_or_bridge (dev -> of_node , 0 , 0 ,
773- NULL , & dpi -> bridge );
775+ NULL , & dpi -> next_bridge );
774776 if (ret )
775777 return ret ;
776778
777- dev_info (dev , "Found bridge node: %pOF\n" , dpi -> bridge -> of_node );
779+ dev_info (dev , "Found bridge node: %pOF\n" , dpi -> next_bridge -> of_node );
778780
779781 comp_id = mtk_ddp_comp_get_id (dev -> of_node , MTK_DPI );
780782 if (comp_id < 0 ) {
@@ -791,8 +793,15 @@ static int mtk_dpi_probe(struct platform_device *pdev)
791793
792794 platform_set_drvdata (pdev , dpi );
793795
796+ dpi -> bridge .funcs = & mtk_dpi_bridge_funcs ;
797+ dpi -> bridge .of_node = dev -> of_node ;
798+ dpi -> bridge .type = DRM_MODE_CONNECTOR_DPI ;
799+
800+ drm_bridge_add (& dpi -> bridge );
801+
794802 ret = component_add (dev , & mtk_dpi_component_ops );
795803 if (ret ) {
804+ drm_bridge_remove (& dpi -> bridge );
796805 dev_err (dev , "Failed to add component: %d\n" , ret );
797806 return ret ;
798807 }
@@ -802,7 +811,10 @@ static int mtk_dpi_probe(struct platform_device *pdev)
802811
803812static int mtk_dpi_remove (struct platform_device * pdev )
804813{
814+ struct mtk_dpi * dpi = platform_get_drvdata (pdev );
815+
805816 component_del (& pdev -> dev , & mtk_dpi_component_ops );
817+ drm_bridge_remove (& dpi -> bridge );
806818
807819 return 0 ;
808820}
0 commit comments