hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi2-rockchip.c
....@@ -275,8 +275,11 @@
275275 struct rockchip_drm_sub_dev sub_dev;
276276
277277 struct gpio_desc *te_gpio;
278
- bool user_split_mode;
279
- struct drm_property *user_split_mode_prop;
278
+
279
+ /* split with other display interface */
280
+ bool dual_connector_split;
281
+ bool left_display;
282
+ u32 split_area;
280283 };
281284
282285 static inline struct dw_mipi_dsi2 *host_to_dsi2(struct mipi_dsi_host *host)
....@@ -450,7 +453,8 @@
450453 dw_mipi_dsi2_post_disable(dsi2->slave);
451454 }
452455
453
-static void dw_mipi_dsi2_encoder_disable(struct drm_encoder *encoder)
456
+static void dw_mipi_dsi2_encoder_atomic_disable(struct drm_encoder *encoder,
457
+ struct drm_atomic_state *state)
454458 {
455459 struct dw_mipi_dsi2 *dsi2 = encoder_to_dsi2(encoder);
456460 struct drm_crtc *crtc = encoder->crtc;
....@@ -837,9 +841,53 @@
837841 dw_mipi_dsi2_enable(dsi2->slave);
838842 }
839843
840
-static void dw_mipi_dsi2_encoder_enable(struct drm_encoder *encoder)
844
+static int dw_mipi_dsi2_encoder_mode_set(struct dw_mipi_dsi2 *dsi2,
845
+ struct drm_atomic_state *state)
846
+{
847
+ struct drm_encoder *encoder = &dsi2->encoder;
848
+ struct drm_connector *connector;
849
+ struct drm_connector_state *conn_state;
850
+ struct drm_crtc_state *crtc_state;
851
+ const struct drm_display_mode *adjusted_mode;
852
+ struct drm_display_mode *mode = &dsi2->mode;
853
+
854
+ connector = drm_atomic_get_new_connector_for_encoder(state, encoder);
855
+ if (!connector)
856
+ return -ENODEV;
857
+
858
+ conn_state = drm_atomic_get_new_connector_state(state, connector);
859
+ if (!conn_state)
860
+ return -ENODEV;
861
+
862
+ crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
863
+ if (!crtc_state) {
864
+ dev_err(dsi2->dev, "failed to get crtc state\n");
865
+ return -ENODEV;
866
+ }
867
+
868
+ adjusted_mode = &crtc_state->adjusted_mode;
869
+ drm_mode_copy(mode, adjusted_mode);
870
+
871
+ if (dsi2->dual_connector_split)
872
+ drm_mode_convert_to_origin_mode(mode);
873
+
874
+ if (dsi2->slave)
875
+ drm_mode_copy(&dsi2->slave->mode, mode);
876
+
877
+ return 0;
878
+}
879
+
880
+static void dw_mipi_dsi2_encoder_atomic_enable(struct drm_encoder *encoder,
881
+ struct drm_atomic_state *state)
841882 {
842883 struct dw_mipi_dsi2 *dsi2 = encoder_to_dsi2(encoder);
884
+ int ret;
885
+
886
+ ret = dw_mipi_dsi2_encoder_mode_set(dsi2, state);
887
+ if (ret) {
888
+ dev_err(dsi2->dev, "failed to set dsi2 mode\n");
889
+ return;
890
+ }
843891
844892 dw_mipi_dsi2_get_lane_rate(dsi2);
845893
....@@ -867,8 +915,8 @@
867915
868916 static int
869917 dw_mipi_dsi2_encoder_atomic_check(struct drm_encoder *encoder,
870
- struct drm_crtc_state *crtc_state,
871
- struct drm_connector_state *conn_state)
918
+ struct drm_crtc_state *crtc_state,
919
+ struct drm_connector_state *conn_state)
872920 {
873921
874922 struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
....@@ -917,6 +965,15 @@
917965 s->output_if |= VOP_OUTPUT_IF_MIPI1;
918966 }
919967
968
+ if (dsi2->dual_connector_split) {
969
+ s->output_flags |= ROCKCHIP_OUTPUT_DUAL_CONNECTOR_SPLIT_MODE;
970
+
971
+ if (dsi2->left_display)
972
+ s->output_if_left_panel |= dsi2->id ?
973
+ VOP_OUTPUT_IF_MIPI1 :
974
+ VOP_OUTPUT_IF_MIPI0;
975
+ }
976
+
920977 if (dsi2->dsc_enable) {
921978 s->dsc_enable = 1;
922979 s->dsc_sink_cap.version_major = dsi2->version_major;
....@@ -931,18 +988,6 @@
931988 }
932989
933990 return 0;
934
-}
935
-
936
-static void
937
-dw_mipi_dsi2_encoder_atomic_mode_set(struct drm_encoder *encoder,
938
- struct drm_crtc_state *crtc_state,
939
- struct drm_connector_state *connector_state)
940
-{
941
- struct dw_mipi_dsi2 *dsi2 = encoder_to_dsi2(encoder);
942
-
943
- drm_mode_copy(&dsi2->mode, &crtc_state->adjusted_mode);
944
- if (dsi2->slave)
945
- drm_mode_copy(&dsi2->slave->mode, &crtc_state->adjusted_mode);
946991 }
947992
948993 static void dw_mipi_dsi2_loader_protect(struct dw_mipi_dsi2 *dsi2, bool on)
....@@ -980,10 +1025,9 @@
9801025
9811026 static const struct drm_encoder_helper_funcs
9821027 dw_mipi_dsi2_encoder_helper_funcs = {
983
- .enable = dw_mipi_dsi2_encoder_enable,
984
- .disable = dw_mipi_dsi2_encoder_disable,
1028
+ .atomic_enable = dw_mipi_dsi2_encoder_atomic_enable,
1029
+ .atomic_disable = dw_mipi_dsi2_encoder_atomic_disable,
9851030 .atomic_check = dw_mipi_dsi2_encoder_atomic_check,
986
- .atomic_mode_set = dw_mipi_dsi2_encoder_atomic_mode_set,
9871031 };
9881032
9891033 static int dw_mipi_dsi2_connector_get_modes(struct drm_connector *connector)
....@@ -1065,6 +1109,32 @@
10651109 drm_connector_cleanup(connector);
10661110 }
10671111
1112
+static int
1113
+dw_mipi_dsi2_atomic_connector_get_property(struct drm_connector *connector,
1114
+ const struct drm_connector_state *state,
1115
+ struct drm_property *property,
1116
+ uint64_t *val)
1117
+{
1118
+ struct rockchip_drm_private *private = connector->dev->dev_private;
1119
+ struct dw_mipi_dsi2 *dsi2 = con_to_dsi2(connector);
1120
+
1121
+ if (property == private->split_area_prop) {
1122
+ switch (dsi2->split_area) {
1123
+ case 1:
1124
+ *val = ROCKCHIP_DRM_SPLIT_LEFT_SIDE;
1125
+ break;
1126
+ case 2:
1127
+ *val = ROCKCHIP_DRM_SPLIT_RIGHT_SIDE;
1128
+ break;
1129
+ default:
1130
+ *val = ROCKCHIP_DRM_SPLIT_UNSET;
1131
+ break;
1132
+ }
1133
+ }
1134
+
1135
+ return 0;
1136
+}
1137
+
10681138 static const struct drm_connector_funcs dw_mipi_dsi2_atomic_connector_funcs = {
10691139 .fill_modes = drm_helper_probe_single_connector_modes,
10701140 .detect = dw_mipi_dsi2_connector_detect,
....@@ -1072,6 +1142,7 @@
10721142 .reset = drm_atomic_helper_connector_reset,
10731143 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
10741144 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1145
+ .atomic_get_property = dw_mipi_dsi2_atomic_connector_get_property,
10751146 };
10761147
10771148 static int dw_mipi_dsi2_dual_channel_probe(struct dw_mipi_dsi2 *dsi2)
....@@ -1143,6 +1214,9 @@
11431214 dsi2->slave->dsc_enable = dsi2->dsc_enable;
11441215 }
11451216
1217
+ if (!dsi2->dsc_enable)
1218
+ return 0;
1219
+
11461220 of_property_read_u32(np, "slice-width", &dsi2->slice_width);
11471221 of_property_read_u32(np, "slice-height", &dsi2->slice_height);
11481222 of_property_read_u8(np, "version-major", &dsi2->version_major);
....@@ -1178,7 +1252,20 @@
11781252 len -= header->payload_length;
11791253 }
11801254
1255
+ if (!pps) {
1256
+ dev_err(dsi2->dev, "not found dsc pps definition\n");
1257
+ return -EINVAL;
1258
+ }
1259
+
11811260 dsi2->pps = pps;
1261
+
1262
+ if (dsi2->slave) {
1263
+ u16 pic_width = be16_to_cpu(pps->pic_width) / 2;
1264
+
1265
+ dsi2->pps->pic_width = cpu_to_be16(pic_width);
1266
+ dev_info(dsi2->dev, "dsc pic_width change from %d to %d\n",
1267
+ pic_width * 2, pic_width);
1268
+ }
11821269
11831270 return 0;
11841271 }
....@@ -1218,22 +1305,15 @@
12181305 static int dw_mipi_dsi2_register_sub_dev(struct dw_mipi_dsi2 *dsi2,
12191306 struct drm_connector *connector)
12201307 {
1308
+ struct rockchip_drm_private *private;
12211309 struct device *dev = dsi2->dev;
1222
- struct drm_property *prop;
1223
- int ret;
12241310
1225
- prop = drm_property_create_bool(dsi2->drm_dev, DRM_MODE_PROP_IMMUTABLE,
1226
- "USER_SPLIT_MODE");
1227
- if (!prop) {
1228
- ret = -EINVAL;
1229
- DRM_DEV_ERROR(dev, "create user split mode prop failed\n");
1230
- goto connector_cleanup;
1231
- }
1311
+ private = connector->dev->dev_private;
12321312
1233
- dsi2->user_split_mode_prop = prop;
1234
- drm_object_attach_property(&connector->base,
1235
- dsi2->user_split_mode_prop,
1236
- dsi2->user_split_mode ? 1 : 0);
1313
+ if (dsi2->split_area)
1314
+ drm_object_attach_property(&connector->base,
1315
+ private->split_area_prop,
1316
+ dsi2->split_area);
12371317
12381318 dsi2->sub_dev.connector = connector;
12391319 dsi2->sub_dev.of_node = dev->of_node;
....@@ -1241,11 +1321,6 @@
12411321 rockchip_drm_register_sub_dev(&dsi2->sub_dev);
12421322
12431323 return 0;
1244
-
1245
-connector_cleanup:
1246
- connector->funcs->destroy(connector);
1247
-
1248
- return ret;
12491324 }
12501325
12511326 static int dw_mipi_dsi2_bind(struct device *dev, struct device *master,
....@@ -1563,7 +1638,16 @@
15631638 dsi2->id = id;
15641639 dsi2->pdata = of_device_get_match_data(dev);
15651640 platform_set_drvdata(pdev, dsi2);
1566
- dsi2->user_split_mode = device_property_read_bool(dev, "user-split-mode");
1641
+
1642
+ if (device_property_read_bool(dev, "dual-connector-split")) {
1643
+ dsi2->dual_connector_split = true;
1644
+
1645
+ if (device_property_read_bool(dev, "left-display"))
1646
+ dsi2->left_display = true;
1647
+ }
1648
+
1649
+ if (device_property_read_u32(dev, "split-area", &dsi2->split_area))
1650
+ dsi2->split_area = 0;
15671651
15681652 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
15691653 regs = devm_ioremap_resource(dev, res);