diff options
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_connector.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index bfa65629517b..256e82bd91dd 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c | |||
@@ -431,24 +431,27 @@ nouveau_connector_set_property(struct drm_connector *connector, | |||
431 | } | 431 | } |
432 | 432 | ||
433 | static struct drm_display_mode * | 433 | static struct drm_display_mode * |
434 | nouveau_connector_native_mode(struct nouveau_connector *connector) | 434 | nouveau_connector_native_mode(struct drm_connector *connector) |
435 | { | 435 | { |
436 | struct drm_device *dev = connector->base.dev; | 436 | struct drm_connector_helper_funcs *helper = connector->helper_private; |
437 | struct nouveau_connector *nv_connector = nouveau_connector(connector); | ||
438 | struct drm_device *dev = connector->dev; | ||
437 | struct drm_display_mode *mode, *largest = NULL; | 439 | struct drm_display_mode *mode, *largest = NULL; |
438 | int high_w = 0, high_h = 0, high_v = 0; | 440 | int high_w = 0, high_h = 0, high_v = 0; |
439 | 441 | ||
440 | /* Use preferred mode if there is one.. */ | 442 | list_for_each_entry(mode, &nv_connector->base.probed_modes, head) { |
441 | list_for_each_entry(mode, &connector->base.probed_modes, head) { | 443 | if (helper->mode_valid(connector, mode) != MODE_OK) |
444 | continue; | ||
445 | |||
446 | /* Use preferred mode if there is one.. */ | ||
442 | if (mode->type & DRM_MODE_TYPE_PREFERRED) { | 447 | if (mode->type & DRM_MODE_TYPE_PREFERRED) { |
443 | NV_DEBUG_KMS(dev, "native mode from preferred\n"); | 448 | NV_DEBUG_KMS(dev, "native mode from preferred\n"); |
444 | return drm_mode_duplicate(dev, mode); | 449 | return drm_mode_duplicate(dev, mode); |
445 | } | 450 | } |
446 | } | ||
447 | 451 | ||
448 | /* Otherwise, take the resolution with the largest width, then height, | 452 | /* Otherwise, take the resolution with the largest width, then |
449 | * then vertical refresh | 453 | * height, then vertical refresh |
450 | */ | 454 | */ |
451 | list_for_each_entry(mode, &connector->base.probed_modes, head) { | ||
452 | if (mode->hdisplay < high_w) | 455 | if (mode->hdisplay < high_w) |
453 | continue; | 456 | continue; |
454 | 457 | ||
@@ -552,7 +555,7 @@ nouveau_connector_get_modes(struct drm_connector *connector) | |||
552 | */ | 555 | */ |
553 | if (!nv_connector->native_mode) | 556 | if (!nv_connector->native_mode) |
554 | nv_connector->native_mode = | 557 | nv_connector->native_mode = |
555 | nouveau_connector_native_mode(nv_connector); | 558 | nouveau_connector_native_mode(connector); |
556 | if (ret == 0 && nv_connector->native_mode) { | 559 | if (ret == 0 && nv_connector->native_mode) { |
557 | struct drm_display_mode *mode; | 560 | struct drm_display_mode *mode; |
558 | 561 | ||
@@ -583,9 +586,9 @@ nouveau_connector_mode_valid(struct drm_connector *connector, | |||
583 | 586 | ||
584 | switch (nv_encoder->dcb->type) { | 587 | switch (nv_encoder->dcb->type) { |
585 | case OUTPUT_LVDS: | 588 | case OUTPUT_LVDS: |
586 | BUG_ON(!nv_connector->native_mode); | 589 | if (nv_connector->native_mode && |
587 | if (mode->hdisplay > nv_connector->native_mode->hdisplay || | 590 | (mode->hdisplay > nv_connector->native_mode->hdisplay || |
588 | mode->vdisplay > nv_connector->native_mode->vdisplay) | 591 | mode->vdisplay > nv_connector->native_mode->vdisplay)) |
589 | return MODE_PANEL; | 592 | return MODE_PANEL; |
590 | 593 | ||
591 | min_clock = 0; | 594 | min_clock = 0; |
@@ -727,7 +730,7 @@ nouveau_connector_create_lvds(struct drm_device *dev, | |||
727 | if (ret == 0) | 730 | if (ret == 0) |
728 | goto out; | 731 | goto out; |
729 | nv_connector->detected_encoder = nv_encoder; | 732 | nv_connector->detected_encoder = nv_encoder; |
730 | nv_connector->native_mode = nouveau_connector_native_mode(nv_connector); | 733 | nv_connector->native_mode = nouveau_connector_native_mode(connector); |
731 | list_for_each_entry_safe(mode, temp, &connector->probed_modes, head) | 734 | list_for_each_entry_safe(mode, temp, &connector->probed_modes, head) |
732 | drm_mode_remove(connector, mode); | 735 | drm_mode_remove(connector, mode); |
733 | 736 | ||