@@ -64,6 +64,7 @@ enum mtk_dpi_out_color_format {
64
64
struct mtk_dpi {
65
65
struct mtk_ddp_comp ddp_comp ;
66
66
struct drm_encoder encoder ;
67
+ struct drm_bridge bridge ;
67
68
struct drm_bridge * next_bridge ;
68
69
void __iomem * regs ;
69
70
struct device * dev ;
@@ -83,9 +84,9 @@ struct mtk_dpi {
83
84
int refcount ;
84
85
};
85
86
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 )
87
88
{
88
- return container_of (e , struct mtk_dpi , encoder );
89
+ return container_of (b , struct mtk_dpi , bridge );
89
90
}
90
91
91
92
enum mtk_dpi_polarity {
@@ -521,50 +522,53 @@ static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi,
521
522
return 0 ;
522
523
}
523
524
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 )
527
526
{
528
- return true ;
527
+ drm_encoder_cleanup ( encoder ) ;
529
528
}
530
529
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 )
534
536
{
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 );
536
548
537
549
drm_mode_copy (& dpi -> mode , adjusted_mode );
538
550
}
539
551
540
- static void mtk_dpi_encoder_disable (struct drm_encoder * encoder )
552
+ static void mtk_dpi_bridge_disable (struct drm_bridge * bridge )
541
553
{
542
- struct mtk_dpi * dpi = mtk_dpi_from_encoder ( encoder );
554
+ struct mtk_dpi * dpi = bridge_to_dpi ( bridge );
543
555
544
556
mtk_dpi_power_off (dpi );
545
557
}
546
558
547
- static void mtk_dpi_encoder_enable (struct drm_encoder * encoder )
559
+ static void mtk_dpi_bridge_enable (struct drm_bridge * bridge )
548
560
{
549
- struct mtk_dpi * dpi = mtk_dpi_from_encoder ( encoder );
561
+ struct mtk_dpi * dpi = bridge_to_dpi ( bridge );
550
562
551
563
mtk_dpi_power_on (dpi );
552
564
mtk_dpi_set_display_mode (dpi , & dpi -> mode );
553
565
}
554
566
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 ,
568
572
};
569
573
570
574
static 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)
605
609
dev_err (dev , "Failed to initialize decoder: %d\n" , ret );
606
610
goto err_unregister ;
607
611
}
608
- drm_encoder_helper_add (& dpi -> encoder , & mtk_dpi_encoder_helper_funcs );
609
612
610
613
dpi -> encoder .possible_crtcs = mtk_drm_find_possible_crtc_by_comp (drm_dev , dpi -> ddp_comp );
611
614
612
- ret = drm_bridge_attach (& dpi -> encoder , dpi -> next_bridge , NULL , 0 );
615
+ ret = drm_bridge_attach (& dpi -> encoder , & dpi -> bridge , NULL , 0 );
613
616
if (ret ) {
614
617
dev_err (dev , "Failed to attach bridge: %d\n" , ret );
615
618
goto err_cleanup ;
@@ -790,8 +793,15 @@ static int mtk_dpi_probe(struct platform_device *pdev)
790
793
791
794
platform_set_drvdata (pdev , dpi );
792
795
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
+
793
802
ret = component_add (dev , & mtk_dpi_component_ops );
794
803
if (ret ) {
804
+ drm_bridge_remove (& dpi -> bridge );
795
805
dev_err (dev , "Failed to add component: %d\n" , ret );
796
806
return ret ;
797
807
}
@@ -801,7 +811,10 @@ static int mtk_dpi_probe(struct platform_device *pdev)
801
811
802
812
static int mtk_dpi_remove (struct platform_device * pdev )
803
813
{
814
+ struct mtk_dpi * dpi = platform_get_drvdata (pdev );
815
+
804
816
component_del (& pdev -> dev , & mtk_dpi_component_ops );
817
+ drm_bridge_remove (& dpi -> bridge );
805
818
806
819
return 0 ;
807
820
}
0 commit comments