@@ -181,6 +181,7 @@ struct mtk_dsi {
181181 struct device * dev ;
182182 struct mipi_dsi_host host ;
183183 struct drm_encoder encoder ;
184+ struct drm_bridge bridge ;
184185 struct drm_connector conn ;
185186 struct drm_panel * panel ;
186187 struct drm_bridge * next_bridge ;
@@ -206,9 +207,9 @@ struct mtk_dsi {
206207 const struct mtk_dsi_driver_data * driver_data ;
207208};
208209
209- static inline struct mtk_dsi * encoder_to_dsi (struct drm_encoder * e )
210+ static inline struct mtk_dsi * bridge_to_dsi (struct drm_bridge * b )
210211{
211- return container_of (e , struct mtk_dsi , encoder );
212+ return container_of (b , struct mtk_dsi , bridge );
212213}
213214
214215static inline struct mtk_dsi * connector_to_dsi (struct drm_connector * c )
@@ -785,32 +786,52 @@ static void mtk_output_dsi_disable(struct mtk_dsi *dsi)
785786 dsi -> enabled = false;
786787}
787788
788- static bool mtk_dsi_encoder_mode_fixup (struct drm_encoder * encoder ,
789- const struct drm_display_mode * mode ,
790- struct drm_display_mode * adjusted_mode )
789+ static void mtk_dsi_encoder_destroy (struct drm_encoder * encoder )
791790{
792- return true ;
791+ drm_encoder_cleanup ( encoder ) ;
793792}
794793
795- static void mtk_dsi_encoder_mode_set (struct drm_encoder * encoder ,
796- struct drm_display_mode * mode ,
797- struct drm_display_mode * adjusted )
794+ static const struct drm_encoder_funcs mtk_dsi_encoder_funcs = {
795+ .destroy = mtk_dsi_encoder_destroy ,
796+ };
797+
798+ static int mtk_dsi_create_conn_enc (struct drm_device * drm , struct mtk_dsi * dsi );
799+ static void mtk_dsi_destroy_conn_enc (struct mtk_dsi * dsi );
800+
801+ static int mtk_dsi_bridge_attach (struct drm_bridge * bridge ,
802+ enum drm_bridge_attach_flags flags )
803+ {
804+ struct mtk_dsi * dsi = bridge_to_dsi (bridge );
805+
806+ return mtk_dsi_create_conn_enc (bridge -> dev , dsi );
807+ }
808+
809+ static void mtk_dsi_bridge_detach (struct drm_bridge * bridge )
798810{
799- struct mtk_dsi * dsi = encoder_to_dsi (encoder );
811+ struct mtk_dsi * dsi = bridge_to_dsi (bridge );
812+
813+ mtk_dsi_destroy_conn_enc (dsi );
814+ }
815+
816+ static void mtk_dsi_bridge_mode_set (struct drm_bridge * bridge ,
817+ const struct drm_display_mode * mode ,
818+ const struct drm_display_mode * adjusted )
819+ {
820+ struct mtk_dsi * dsi = bridge_to_dsi (bridge );
800821
801822 drm_display_mode_to_videomode (adjusted , & dsi -> vm );
802823}
803824
804- static void mtk_dsi_encoder_disable (struct drm_encoder * encoder )
825+ static void mtk_dsi_bridge_disable (struct drm_bridge * bridge )
805826{
806- struct mtk_dsi * dsi = encoder_to_dsi ( encoder );
827+ struct mtk_dsi * dsi = bridge_to_dsi ( bridge );
807828
808829 mtk_output_dsi_disable (dsi );
809830}
810831
811- static void mtk_dsi_encoder_enable (struct drm_encoder * encoder )
832+ static void mtk_dsi_bridge_enable (struct drm_bridge * bridge )
812833{
813- struct mtk_dsi * dsi = encoder_to_dsi ( encoder );
834+ struct mtk_dsi * dsi = bridge_to_dsi ( bridge );
814835
815836 mtk_output_dsi_enable (dsi );
816837}
@@ -822,11 +843,12 @@ static int mtk_dsi_connector_get_modes(struct drm_connector *connector)
822843 return drm_panel_get_modes (dsi -> panel , connector );
823844}
824845
825- static const struct drm_encoder_helper_funcs mtk_dsi_encoder_helper_funcs = {
826- .mode_fixup = mtk_dsi_encoder_mode_fixup ,
827- .mode_set = mtk_dsi_encoder_mode_set ,
828- .disable = mtk_dsi_encoder_disable ,
829- .enable = mtk_dsi_encoder_enable ,
846+ static const struct drm_bridge_funcs mtk_dsi_bridge_funcs = {
847+ .attach = mtk_dsi_bridge_attach ,
848+ .detach = mtk_dsi_bridge_detach ,
849+ .disable = mtk_dsi_bridge_disable ,
850+ .enable = mtk_dsi_bridge_enable ,
851+ .mode_set = mtk_dsi_bridge_mode_set ,
830852};
831853
832854static const struct drm_connector_funcs mtk_dsi_connector_funcs = {
@@ -877,20 +899,6 @@ static int mtk_dsi_create_conn_enc(struct drm_device *drm, struct mtk_dsi *dsi)
877899{
878900 int ret ;
879901
880- ret = drm_simple_encoder_init (drm , & dsi -> encoder ,
881- DRM_MODE_ENCODER_DSI );
882- if (ret ) {
883- DRM_ERROR ("Failed to encoder init to drm\n" );
884- return ret ;
885- }
886- drm_encoder_helper_add (& dsi -> encoder , & mtk_dsi_encoder_helper_funcs );
887-
888- /*
889- * Currently display data paths are statically assigned to a crtc each.
890- * crtc 0 is OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0
891- */
892- dsi -> encoder .possible_crtcs = 1 ;
893-
894902 /* If there's a next bridge, attach to it and let it create the connector */
895903 if (dsi -> next_bridge ) {
896904 ret = drm_bridge_attach (& dsi -> encoder , dsi -> next_bridge , NULL ,
@@ -1112,6 +1120,34 @@ static const struct mipi_dsi_host_ops mtk_dsi_ops = {
11121120 .transfer = mtk_dsi_host_transfer ,
11131121};
11141122
1123+ static int mtk_dsi_encoder_init (struct drm_device * drm , struct mtk_dsi * dsi )
1124+ {
1125+ int ret ;
1126+
1127+ ret = drm_encoder_init (drm , & dsi -> encoder , & mtk_dsi_encoder_funcs ,
1128+ DRM_MODE_ENCODER_DSI , NULL );
1129+ if (ret ) {
1130+ DRM_ERROR ("Failed to encoder init to drm\n" );
1131+ return ret ;
1132+ }
1133+
1134+ /*
1135+ * Currently display data paths are statically assigned to a crtc each.
1136+ * crtc 0 is OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0
1137+ */
1138+ dsi -> encoder .possible_crtcs = 1 ;
1139+
1140+ ret = drm_bridge_attach (& dsi -> encoder , & dsi -> bridge , NULL , 0 );
1141+ if (ret )
1142+ goto err_cleanup_encoder ;
1143+
1144+ return 0 ;
1145+
1146+ err_cleanup_encoder :
1147+ drm_encoder_cleanup (& dsi -> encoder );
1148+ return ret ;
1149+ }
1150+
11151151static int mtk_dsi_bind (struct device * dev , struct device * master , void * data )
11161152{
11171153 int ret ;
@@ -1125,11 +1161,9 @@ static int mtk_dsi_bind(struct device *dev, struct device *master, void *data)
11251161 return ret ;
11261162 }
11271163
1128- ret = mtk_dsi_create_conn_enc (drm , dsi );
1129- if (ret ) {
1130- DRM_ERROR ("Encoder create failed with %d\n" , ret );
1164+ ret = mtk_dsi_encoder_init (drm , dsi );
1165+ if (ret )
11311166 goto err_unregister ;
1132- }
11331167
11341168 return 0 ;
11351169
@@ -1144,7 +1178,7 @@ static void mtk_dsi_unbind(struct device *dev, struct device *master,
11441178 struct drm_device * drm = data ;
11451179 struct mtk_dsi * dsi = dev_get_drvdata (dev );
11461180
1147- mtk_dsi_destroy_conn_enc ( dsi );
1181+ drm_encoder_cleanup ( & dsi -> encoder );
11481182 mtk_ddp_comp_unregister (drm , & dsi -> ddp_comp );
11491183}
11501184
@@ -1254,6 +1288,12 @@ static int mtk_dsi_probe(struct platform_device *pdev)
12541288
12551289 platform_set_drvdata (pdev , dsi );
12561290
1291+ dsi -> bridge .funcs = & mtk_dsi_bridge_funcs ;
1292+ dsi -> bridge .of_node = dev -> of_node ;
1293+ dsi -> bridge .type = DRM_MODE_CONNECTOR_DSI ;
1294+
1295+ drm_bridge_add (& dsi -> bridge );
1296+
12571297 ret = component_add (& pdev -> dev , & mtk_dsi_component_ops );
12581298 if (ret ) {
12591299 dev_err (& pdev -> dev , "failed to add component: %d\n" , ret );
@@ -1272,6 +1312,7 @@ static int mtk_dsi_remove(struct platform_device *pdev)
12721312 struct mtk_dsi * dsi = platform_get_drvdata (pdev );
12731313
12741314 mtk_output_dsi_disable (dsi );
1315+ drm_bridge_remove (& dsi -> bridge );
12751316 component_del (& pdev -> dev , & mtk_dsi_component_ops );
12761317 mipi_dsi_host_unregister (& dsi -> host );
12771318
0 commit comments