hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
....@@ -314,6 +314,23 @@
314314 rockchip_drm_unregister_sub_dev(sdev);
315315 }
316316
317
+static enum drm_mode_status
318
+rockchip_dp_drm_encoder_mode_valid(struct drm_encoder *encoder,
319
+ const struct drm_display_mode *mode)
320
+{
321
+ struct rockchip_dp_device *dp = to_dp(encoder);
322
+ struct videomode vm;
323
+
324
+ drm_display_mode_to_videomode(mode, &vm);
325
+
326
+ if (!vm.hfront_porch || !vm.hback_porch || !vm.vfront_porch || !vm.vback_porch) {
327
+ DRM_DEV_ERROR(dp->dev, "front porch or back porch can not be 0\n");
328
+ return MODE_BAD;
329
+ }
330
+
331
+ return MODE_OK;
332
+}
333
+
317334 static bool
318335 rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder,
319336 const struct drm_display_mode *mode,
....@@ -437,6 +454,16 @@
437454 } else {
438455 s->output_if |= dp->id ? VOP_OUTPUT_IF_eDP1 : VOP_OUTPUT_IF_eDP0;
439456 }
457
+
458
+ if (dp->plat_data.dual_connector_split) {
459
+ s->output_flags |= ROCKCHIP_OUTPUT_DUAL_CONNECTOR_SPLIT_MODE;
460
+
461
+ if (dp->plat_data.left_display)
462
+ s->output_if_left_panel |= dp->id ?
463
+ VOP_OUTPUT_IF_eDP1 :
464
+ VOP_OUTPUT_IF_eDP0;
465
+ }
466
+
440467 s->output_bpc = di->bpc;
441468 s->bus_flags = di->bus_flags;
442469 s->tv_state = &conn_state->tv;
....@@ -474,6 +501,7 @@
474501 }
475502
476503 static struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = {
504
+ .mode_valid = rockchip_dp_drm_encoder_mode_valid,
477505 .mode_fixup = rockchip_dp_drm_encoder_mode_fixup,
478506 .mode_set = rockchip_dp_drm_encoder_mode_set,
479507 .atomic_enable = rockchip_dp_drm_encoder_enable,
....@@ -671,6 +699,7 @@
671699
672700 dp->plat_data.right = secondary->adp;
673701 dp->plat_data.split_mode = true;
702
+ secondary->plat_data.panel = dp->plat_data.panel;
674703 secondary->plat_data.left = dp->adp;
675704 secondary->plat_data.split_mode = true;
676705 }
....@@ -678,6 +707,12 @@
678707 device_property_read_u32(dev, "min-refresh-rate", &dp->min_refresh_rate);
679708 device_property_read_u32(dev, "max-refresh-rate", &dp->max_refresh_rate);
680709
710
+ if (dp->data->split_mode && device_property_read_bool(dev, "dual-connector-split")) {
711
+ dp->plat_data.dual_connector_split = true;
712
+ if (device_property_read_bool(dev, "left-display"))
713
+ dp->plat_data.left_display = true;
714
+ }
715
+
681716 ret = component_add(dev, &rockchip_dp_component_ops);
682717 if (ret)
683718 goto err_dp_remove;