aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_connector.c31
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
433static struct drm_display_mode * 433static struct drm_display_mode *
434nouveau_connector_native_mode(struct nouveau_connector *connector) 434nouveau_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