.. | .. |
---|
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; |
---|