| .. | .. |
|---|
| 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, |
|---|
| .. | .. |
|---|
| 484 | 501 | } |
|---|
| 485 | 502 | |
|---|
| 486 | 503 | static struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = { |
|---|
| 504 | + .mode_valid = rockchip_dp_drm_encoder_mode_valid, |
|---|
| 487 | 505 | .mode_fixup = rockchip_dp_drm_encoder_mode_fixup, |
|---|
| 488 | 506 | .mode_set = rockchip_dp_drm_encoder_mode_set, |
|---|
| 489 | 507 | .atomic_enable = rockchip_dp_drm_encoder_enable, |
|---|
| .. | .. |
|---|
| 681 | 699 | |
|---|
| 682 | 700 | dp->plat_data.right = secondary->adp; |
|---|
| 683 | 701 | dp->plat_data.split_mode = true; |
|---|
| 702 | + secondary->plat_data.panel = dp->plat_data.panel; |
|---|
| 684 | 703 | secondary->plat_data.left = dp->adp; |
|---|
| 685 | 704 | secondary->plat_data.split_mode = true; |
|---|
| 686 | 705 | } |
|---|