@@ -181,6 +181,7 @@ struct mtk_dsi {
181
181
struct device * dev ;
182
182
struct mipi_dsi_host host ;
183
183
struct drm_encoder encoder ;
184
+ struct drm_bridge bridge ;
184
185
struct drm_connector conn ;
185
186
struct drm_panel * panel ;
186
187
struct drm_bridge * next_bridge ;
@@ -206,9 +207,9 @@ struct mtk_dsi {
206
207
const struct mtk_dsi_driver_data * driver_data ;
207
208
};
208
209
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 )
210
211
{
211
- return container_of (e , struct mtk_dsi , encoder );
212
+ return container_of (b , struct mtk_dsi , bridge );
212
213
}
213
214
214
215
static 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)
785
786
dsi -> enabled = false;
786
787
}
787
788
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 )
791
790
{
792
- return true ;
791
+ drm_encoder_cleanup ( encoder ) ;
793
792
}
794
793
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 )
798
810
{
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 );
800
821
801
822
drm_display_mode_to_videomode (adjusted , & dsi -> vm );
802
823
}
803
824
804
- static void mtk_dsi_encoder_disable (struct drm_encoder * encoder )
825
+ static void mtk_dsi_bridge_disable (struct drm_bridge * bridge )
805
826
{
806
- struct mtk_dsi * dsi = encoder_to_dsi ( encoder );
827
+ struct mtk_dsi * dsi = bridge_to_dsi ( bridge );
807
828
808
829
mtk_output_dsi_disable (dsi );
809
830
}
810
831
811
- static void mtk_dsi_encoder_enable (struct drm_encoder * encoder )
832
+ static void mtk_dsi_bridge_enable (struct drm_bridge * bridge )
812
833
{
813
- struct mtk_dsi * dsi = encoder_to_dsi ( encoder );
834
+ struct mtk_dsi * dsi = bridge_to_dsi ( bridge );
814
835
815
836
mtk_output_dsi_enable (dsi );
816
837
}
@@ -822,11 +843,12 @@ static int mtk_dsi_connector_get_modes(struct drm_connector *connector)
822
843
return drm_panel_get_modes (dsi -> panel , connector );
823
844
}
824
845
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 ,
830
852
};
831
853
832
854
static 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)
877
899
{
878
900
int ret ;
879
901
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
-
894
902
/* If there's a next bridge, attach to it and let it create the connector */
895
903
if (dsi -> next_bridge ) {
896
904
ret = drm_bridge_attach (& dsi -> encoder , dsi -> next_bridge , NULL ,
@@ -1112,6 +1120,34 @@ static const struct mipi_dsi_host_ops mtk_dsi_ops = {
1112
1120
.transfer = mtk_dsi_host_transfer ,
1113
1121
};
1114
1122
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
+
1115
1151
static int mtk_dsi_bind (struct device * dev , struct device * master , void * data )
1116
1152
{
1117
1153
int ret ;
@@ -1125,11 +1161,9 @@ static int mtk_dsi_bind(struct device *dev, struct device *master, void *data)
1125
1161
return ret ;
1126
1162
}
1127
1163
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 )
1131
1166
goto err_unregister ;
1132
- }
1133
1167
1134
1168
return 0 ;
1135
1169
@@ -1144,7 +1178,7 @@ static void mtk_dsi_unbind(struct device *dev, struct device *master,
1144
1178
struct drm_device * drm = data ;
1145
1179
struct mtk_dsi * dsi = dev_get_drvdata (dev );
1146
1180
1147
- mtk_dsi_destroy_conn_enc ( dsi );
1181
+ drm_encoder_cleanup ( & dsi -> encoder );
1148
1182
mtk_ddp_comp_unregister (drm , & dsi -> ddp_comp );
1149
1183
}
1150
1184
@@ -1254,6 +1288,12 @@ static int mtk_dsi_probe(struct platform_device *pdev)
1254
1288
1255
1289
platform_set_drvdata (pdev , dsi );
1256
1290
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
+
1257
1297
ret = component_add (& pdev -> dev , & mtk_dsi_component_ops );
1258
1298
if (ret ) {
1259
1299
dev_err (& pdev -> dev , "failed to add component: %d\n" , ret );
@@ -1272,6 +1312,7 @@ static int mtk_dsi_remove(struct platform_device *pdev)
1272
1312
struct mtk_dsi * dsi = platform_get_drvdata (pdev );
1273
1313
1274
1314
mtk_output_dsi_disable (dsi );
1315
+ drm_bridge_remove (& dsi -> bridge );
1275
1316
component_del (& pdev -> dev , & mtk_dsi_component_ops );
1276
1317
mipi_dsi_host_unregister (& dsi -> host );
1277
1318
0 commit comments