| .. | .. |
|---|
| 314 | 314 | rockchip_drm_unregister_sub_dev(sdev); |
|---|
| 315 | 315 | } |
|---|
| 316 | 316 | |
|---|
| 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 | + |
|---|
| 317 | 334 | static bool |
|---|
| 318 | 335 | rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder, |
|---|
| 319 | 336 | const struct drm_display_mode *mode, |
|---|
| .. | .. |
|---|
| 437 | 454 | } else { |
|---|
| 438 | 455 | s->output_if |= dp->id ? VOP_OUTPUT_IF_eDP1 : VOP_OUTPUT_IF_eDP0; |
|---|
| 439 | 456 | } |
|---|
| 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 | + |
|---|
| 440 | 467 | s->output_bpc = di->bpc; |
|---|
| 441 | 468 | s->bus_flags = di->bus_flags; |
|---|
| 442 | 469 | s->tv_state = &conn_state->tv; |
|---|
| .. | .. |
|---|
| 474 | 501 | } |
|---|
| 475 | 502 | |
|---|
| 476 | 503 | static struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = { |
|---|
| 504 | + .mode_valid = rockchip_dp_drm_encoder_mode_valid, |
|---|
| 477 | 505 | .mode_fixup = rockchip_dp_drm_encoder_mode_fixup, |
|---|
| 478 | 506 | .mode_set = rockchip_dp_drm_encoder_mode_set, |
|---|
| 479 | 507 | .atomic_enable = rockchip_dp_drm_encoder_enable, |
|---|
| .. | .. |
|---|
| 671 | 699 | |
|---|
| 672 | 700 | dp->plat_data.right = secondary->adp; |
|---|
| 673 | 701 | dp->plat_data.split_mode = true; |
|---|
| 702 | + secondary->plat_data.panel = dp->plat_data.panel; |
|---|
| 674 | 703 | secondary->plat_data.left = dp->adp; |
|---|
| 675 | 704 | secondary->plat_data.split_mode = true; |
|---|
| 676 | 705 | } |
|---|
| .. | .. |
|---|
| 678 | 707 | device_property_read_u32(dev, "min-refresh-rate", &dp->min_refresh_rate); |
|---|
| 679 | 708 | device_property_read_u32(dev, "max-refresh-rate", &dp->max_refresh_rate); |
|---|
| 680 | 709 | |
|---|
| 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 | + |
|---|
| 681 | 716 | ret = component_add(dev, &rockchip_dp_component_ops); |
|---|
| 682 | 717 | if (ret) |
|---|
| 683 | 718 | goto err_dp_remove; |
|---|