@@ -64,6 +64,7 @@ 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 ;
6768 struct drm_bridge * next_bridge ;
6869 void __iomem * regs ;
6970 struct device * dev ;
@@ -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,11 +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
610613 dpi -> encoder .possible_crtcs = mtk_drm_find_possible_crtc_by_comp (drm_dev , dpi -> ddp_comp );
611614
612- ret = drm_bridge_attach (& dpi -> encoder , dpi -> next_bridge , NULL , 0 );
615+ ret = drm_bridge_attach (& dpi -> encoder , & dpi -> bridge , NULL , 0 );
613616 if (ret ) {
614617 dev_err (dev , "Failed to attach bridge: %d\n" , ret );
615618 goto err_cleanup ;
@@ -790,8 +793,15 @@ static int mtk_dpi_probe(struct platform_device *pdev)
790793
791794 platform_set_drvdata (pdev , dpi );
792795
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+
793802 ret = component_add (dev , & mtk_dpi_component_ops );
794803 if (ret ) {
804+ drm_bridge_remove (& dpi -> bridge );
795805 dev_err (dev , "Failed to add component: %d\n" , ret );
796806 return ret ;
797807 }
@@ -801,7 +811,10 @@ static int mtk_dpi_probe(struct platform_device *pdev)
801811
802812static int mtk_dpi_remove (struct platform_device * pdev )
803813{
814+ struct mtk_dpi * dpi = platform_get_drvdata (pdev );
815+
804816 component_del (& pdev -> dev , & mtk_dpi_component_ops );
817+ drm_bridge_remove (& dpi -> bridge );
805818
806819 return 0 ;
807820}
0 commit comments