diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2014-01-15 13:59:47 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2014-01-20 18:20:53 -0500 |
commit | c4756baa4a8ba75b812506818cbc81178650d3c1 (patch) | |
tree | 828cb889199078837ecfcd44b4a782b5178a3340 | |
parent | 18f8f52b9a8c293111c058f9d25bcd5e718b80b2 (diff) |
drm/radeon: bail early from enable ss in certain cases
If the ss percentage is 0 or we are using external ss,
just bail when enabling ss. We disable it explicitly
earlier in the modeset already.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index fd9daf4022a1..4cf678306c9c 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -423,7 +423,17 @@ static void atombios_crtc_program_ss(struct radeon_device *rdev, | |||
423 | int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL); | 423 | int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL); |
424 | union atom_enable_ss args; | 424 | union atom_enable_ss args; |
425 | 425 | ||
426 | if (!enable) { | 426 | if (enable) { |
427 | /* Don't mess with SS if percentage is 0 or external ss. | ||
428 | * SS is already disabled previously, and disabling it | ||
429 | * again can cause display problems if the pll is already | ||
430 | * programmed. | ||
431 | */ | ||
432 | if (ss->percentage == 0) | ||
433 | return; | ||
434 | if (ss->type & ATOM_EXTERNAL_SS_MASK) | ||
435 | return; | ||
436 | } else { | ||
427 | for (i = 0; i < rdev->num_crtc; i++) { | 437 | for (i = 0; i < rdev->num_crtc; i++) { |
428 | if (rdev->mode_info.crtcs[i] && | 438 | if (rdev->mode_info.crtcs[i] && |
429 | rdev->mode_info.crtcs[i]->enabled && | 439 | rdev->mode_info.crtcs[i]->enabled && |
@@ -459,8 +469,6 @@ static void atombios_crtc_program_ss(struct radeon_device *rdev, | |||
459 | args.v3.usSpreadSpectrumAmount = cpu_to_le16(ss->amount); | 469 | args.v3.usSpreadSpectrumAmount = cpu_to_le16(ss->amount); |
460 | args.v3.usSpreadSpectrumStep = cpu_to_le16(ss->step); | 470 | args.v3.usSpreadSpectrumStep = cpu_to_le16(ss->step); |
461 | args.v3.ucEnable = enable; | 471 | args.v3.ucEnable = enable; |
462 | if ((ss->percentage == 0) || (ss->type & ATOM_EXTERNAL_SS_MASK) || ASIC_IS_DCE61(rdev)) | ||
463 | args.v3.ucEnable = ATOM_DISABLE; | ||
464 | } else if (ASIC_IS_DCE4(rdev)) { | 472 | } else if (ASIC_IS_DCE4(rdev)) { |
465 | args.v2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); | 473 | args.v2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); |
466 | args.v2.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK; | 474 | args.v2.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK; |
@@ -480,8 +488,6 @@ static void atombios_crtc_program_ss(struct radeon_device *rdev, | |||
480 | args.v2.usSpreadSpectrumAmount = cpu_to_le16(ss->amount); | 488 | args.v2.usSpreadSpectrumAmount = cpu_to_le16(ss->amount); |
481 | args.v2.usSpreadSpectrumStep = cpu_to_le16(ss->step); | 489 | args.v2.usSpreadSpectrumStep = cpu_to_le16(ss->step); |
482 | args.v2.ucEnable = enable; | 490 | args.v2.ucEnable = enable; |
483 | if ((ss->percentage == 0) || (ss->type & ATOM_EXTERNAL_SS_MASK) || ASIC_IS_DCE41(rdev)) | ||
484 | args.v2.ucEnable = ATOM_DISABLE; | ||
485 | } else if (ASIC_IS_DCE3(rdev)) { | 491 | } else if (ASIC_IS_DCE3(rdev)) { |
486 | args.v1.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); | 492 | args.v1.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage); |
487 | args.v1.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK; | 493 | args.v1.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK; |
@@ -503,8 +509,7 @@ static void atombios_crtc_program_ss(struct radeon_device *rdev, | |||
503 | args.lvds_ss_2.ucSpreadSpectrumRange = ss->range; | 509 | args.lvds_ss_2.ucSpreadSpectrumRange = ss->range; |
504 | args.lvds_ss_2.ucEnable = enable; | 510 | args.lvds_ss_2.ucEnable = enable; |
505 | } else { | 511 | } else { |
506 | if ((enable == ATOM_DISABLE) || (ss->percentage == 0) || | 512 | if (enable == ATOM_DISABLE) { |
507 | (ss->type & ATOM_EXTERNAL_SS_MASK)) { | ||
508 | atombios_disable_ss(rdev, pll_id); | 513 | atombios_disable_ss(rdev, pll_id); |
509 | return; | 514 | return; |
510 | } | 515 | } |