diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 61 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_legacy_encoders.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 2 |
3 files changed, 53 insertions, 22 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index fed7b8084779..c5ddaf58563a 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -254,6 +254,53 @@ radeon_get_atom_connector_priv_from_encoder(struct drm_encoder *encoder) | |||
| 254 | return dig_connector; | 254 | return dig_connector; |
| 255 | } | 255 | } |
| 256 | 256 | ||
| 257 | void radeon_panel_mode_fixup(struct drm_encoder *encoder, | ||
| 258 | struct drm_display_mode *adjusted_mode) | ||
| 259 | { | ||
| 260 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
| 261 | struct drm_device *dev = encoder->dev; | ||
| 262 | struct radeon_device *rdev = dev->dev_private; | ||
| 263 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; | ||
| 264 | unsigned hblank = native_mode->htotal - native_mode->hdisplay; | ||
| 265 | unsigned vblank = native_mode->vtotal - native_mode->vdisplay; | ||
| 266 | unsigned hover = native_mode->hsync_start - native_mode->hdisplay; | ||
| 267 | unsigned vover = native_mode->vsync_start - native_mode->vdisplay; | ||
| 268 | unsigned hsync_width = native_mode->hsync_end - native_mode->hsync_start; | ||
| 269 | unsigned vsync_width = native_mode->vsync_end - native_mode->vsync_start; | ||
| 270 | |||
| 271 | adjusted_mode->clock = native_mode->clock; | ||
| 272 | adjusted_mode->flags = native_mode->flags; | ||
| 273 | |||
| 274 | if (ASIC_IS_AVIVO(rdev)) { | ||
| 275 | adjusted_mode->hdisplay = native_mode->hdisplay; | ||
| 276 | adjusted_mode->vdisplay = native_mode->vdisplay; | ||
| 277 | } | ||
| 278 | |||
| 279 | adjusted_mode->htotal = native_mode->hdisplay + hblank; | ||
| 280 | adjusted_mode->hsync_start = native_mode->hdisplay + hover; | ||
| 281 | adjusted_mode->hsync_end = adjusted_mode->hsync_start + hsync_width; | ||
| 282 | |||
| 283 | adjusted_mode->vtotal = native_mode->vdisplay + vblank; | ||
| 284 | adjusted_mode->vsync_start = native_mode->vdisplay + vover; | ||
| 285 | adjusted_mode->vsync_end = adjusted_mode->vsync_start + vsync_width; | ||
| 286 | |||
| 287 | drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V); | ||
| 288 | |||
| 289 | if (ASIC_IS_AVIVO(rdev)) { | ||
| 290 | adjusted_mode->crtc_hdisplay = native_mode->hdisplay; | ||
| 291 | adjusted_mode->crtc_vdisplay = native_mode->vdisplay; | ||
| 292 | } | ||
| 293 | |||
| 294 | adjusted_mode->crtc_htotal = adjusted_mode->crtc_hdisplay + hblank; | ||
| 295 | adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hdisplay + hover; | ||
| 296 | adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + hsync_width; | ||
| 297 | |||
| 298 | adjusted_mode->crtc_vtotal = adjusted_mode->crtc_vdisplay + vblank; | ||
| 299 | adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + vover; | ||
| 300 | adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + vsync_width; | ||
| 301 | |||
| 302 | } | ||
| 303 | |||
| 257 | static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, | 304 | static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, |
| 258 | struct drm_display_mode *mode, | 305 | struct drm_display_mode *mode, |
| 259 | struct drm_display_mode *adjusted_mode) | 306 | struct drm_display_mode *adjusted_mode) |
| @@ -275,18 +322,8 @@ static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, | |||
| 275 | adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2; | 322 | adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2; |
| 276 | 323 | ||
| 277 | /* get the native mode for LVDS */ | 324 | /* get the native mode for LVDS */ |
| 278 | if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) { | 325 | if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) |
| 279 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; | 326 | radeon_panel_mode_fixup(encoder, adjusted_mode); |
| 280 | int mode_id = adjusted_mode->base.id; | ||
| 281 | *adjusted_mode = *native_mode; | ||
| 282 | if (!ASIC_IS_AVIVO(rdev)) { | ||
| 283 | adjusted_mode->hdisplay = mode->hdisplay; | ||
| 284 | adjusted_mode->vdisplay = mode->vdisplay; | ||
| 285 | adjusted_mode->crtc_hdisplay = mode->hdisplay; | ||
| 286 | adjusted_mode->crtc_vdisplay = mode->vdisplay; | ||
| 287 | } | ||
| 288 | adjusted_mode->base.id = mode_id; | ||
| 289 | } | ||
| 290 | 327 | ||
| 291 | /* get the native mode for TV */ | 328 | /* get the native mode for TV */ |
| 292 | if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) { | 329 | if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) { |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 2441cca7d775..0274abe17ad9 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
| @@ -228,16 +228,8 @@ static bool radeon_legacy_mode_fixup(struct drm_encoder *encoder, | |||
| 228 | drm_mode_set_crtcinfo(adjusted_mode, 0); | 228 | drm_mode_set_crtcinfo(adjusted_mode, 0); |
| 229 | 229 | ||
| 230 | /* get the native mode for LVDS */ | 230 | /* get the native mode for LVDS */ |
| 231 | if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) { | 231 | if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) |
| 232 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; | 232 | radeon_panel_mode_fixup(encoder, adjusted_mode); |
| 233 | int mode_id = adjusted_mode->base.id; | ||
| 234 | *adjusted_mode = *native_mode; | ||
| 235 | adjusted_mode->hdisplay = mode->hdisplay; | ||
| 236 | adjusted_mode->vdisplay = mode->vdisplay; | ||
| 237 | adjusted_mode->crtc_hdisplay = mode->hdisplay; | ||
| 238 | adjusted_mode->crtc_vdisplay = mode->vdisplay; | ||
| 239 | adjusted_mode->base.id = mode_id; | ||
| 240 | } | ||
| 241 | 233 | ||
| 242 | return true; | 234 | return true; |
| 243 | } | 235 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 0b8e32776b10..5413fcd63086 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -558,6 +558,8 @@ extern int radeon_static_clocks_init(struct drm_device *dev); | |||
| 558 | bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc, | 558 | bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc, |
| 559 | struct drm_display_mode *mode, | 559 | struct drm_display_mode *mode, |
| 560 | struct drm_display_mode *adjusted_mode); | 560 | struct drm_display_mode *adjusted_mode); |
| 561 | void radeon_panel_mode_fixup(struct drm_encoder *encoder, | ||
| 562 | struct drm_display_mode *adjusted_mode); | ||
| 561 | void atom_rv515_force_tv_scaler(struct radeon_device *rdev, struct radeon_crtc *radeon_crtc); | 563 | void atom_rv515_force_tv_scaler(struct radeon_device *rdev, struct radeon_crtc *radeon_crtc); |
| 562 | 564 | ||
| 563 | /* legacy tv */ | 565 | /* legacy tv */ |
