diff options
Diffstat (limited to 'drivers/gpu/drm/tilcdc/tilcdc_slave.c')
-rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_slave.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_slave.c b/drivers/gpu/drm/tilcdc/tilcdc_slave.c index dfffaf014022..23b3203d8241 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_slave.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_slave.c | |||
@@ -73,13 +73,38 @@ static void slave_encoder_prepare(struct drm_encoder *encoder) | |||
73 | tilcdc_crtc_set_panel_info(encoder->crtc, &slave_info); | 73 | tilcdc_crtc_set_panel_info(encoder->crtc, &slave_info); |
74 | } | 74 | } |
75 | 75 | ||
76 | static bool slave_encoder_fixup(struct drm_encoder *encoder, | ||
77 | const struct drm_display_mode *mode, | ||
78 | struct drm_display_mode *adjusted_mode) | ||
79 | { | ||
80 | /* | ||
81 | * tilcdc does not generate VESA-complient sync but aligns | ||
82 | * VS on the second edge of HS instead of first edge. | ||
83 | * We use adjusted_mode, to fixup sync by aligning both rising | ||
84 | * edges and add HSKEW offset to let the slave encoder fix it up. | ||
85 | */ | ||
86 | adjusted_mode->hskew = mode->hsync_end - mode->hsync_start; | ||
87 | adjusted_mode->flags |= DRM_MODE_FLAG_HSKEW; | ||
88 | |||
89 | if (mode->flags & DRM_MODE_FLAG_NHSYNC) { | ||
90 | adjusted_mode->flags |= DRM_MODE_FLAG_PHSYNC; | ||
91 | adjusted_mode->flags &= ~DRM_MODE_FLAG_NHSYNC; | ||
92 | } else { | ||
93 | adjusted_mode->flags |= DRM_MODE_FLAG_NHSYNC; | ||
94 | adjusted_mode->flags &= ~DRM_MODE_FLAG_PHSYNC; | ||
95 | } | ||
96 | |||
97 | return drm_i2c_encoder_mode_fixup(encoder, mode, adjusted_mode); | ||
98 | } | ||
99 | |||
100 | |||
76 | static const struct drm_encoder_funcs slave_encoder_funcs = { | 101 | static const struct drm_encoder_funcs slave_encoder_funcs = { |
77 | .destroy = slave_encoder_destroy, | 102 | .destroy = slave_encoder_destroy, |
78 | }; | 103 | }; |
79 | 104 | ||
80 | static const struct drm_encoder_helper_funcs slave_encoder_helper_funcs = { | 105 | static const struct drm_encoder_helper_funcs slave_encoder_helper_funcs = { |
81 | .dpms = drm_i2c_encoder_dpms, | 106 | .dpms = drm_i2c_encoder_dpms, |
82 | .mode_fixup = drm_i2c_encoder_mode_fixup, | 107 | .mode_fixup = slave_encoder_fixup, |
83 | .prepare = slave_encoder_prepare, | 108 | .prepare = slave_encoder_prepare, |
84 | .commit = drm_i2c_encoder_commit, | 109 | .commit = drm_i2c_encoder_commit, |
85 | .mode_set = drm_i2c_encoder_mode_set, | 110 | .mode_set = drm_i2c_encoder_mode_set, |