Skip to content

Commit

Permalink
drm/radeon: improve PLL params if we don't match exactly v2
Browse files Browse the repository at this point in the history
Otherwise we might be quite off on older chipsets.

v2: keep ref_div minimum

Signed-off-by: Christian König <christian.koenig@amd.com>
  • Loading branch information
Christian König committed Apr 17, 2014
1 parent 74073c9 commit f8a2645
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions drivers/gpu/drm/radeon/radeon_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -865,7 +865,7 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll,
unsigned post_div_min, post_div_max, post_div;
unsigned ref_div_min, ref_div_max, ref_div;
unsigned post_div_best, diff_best;
unsigned nom, den, tmp;
unsigned nom, den;

/* determine allowed feedback divider range */
fb_div_min = pll->min_feedback_div;
Expand Down Expand Up @@ -941,22 +941,23 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll,
ref_div_max = min(210 / post_div, ref_div_max);

/* get matching reference and feedback divider */
ref_div = max(den / post_div, 1u);
fb_div = nom;
ref_div = max(DIV_ROUND_CLOSEST(den, post_div), 1u);
fb_div = DIV_ROUND_CLOSEST(nom * ref_div * post_div, den);

/* we're almost done, but reference and feedback
divider might be to large now */

tmp = ref_div;
nom = fb_div;
den = ref_div;

if (fb_div > fb_div_max) {
ref_div = ref_div * fb_div_max / fb_div;
ref_div = DIV_ROUND_CLOSEST(den * fb_div_max, nom);
fb_div = fb_div_max;
}

if (ref_div > ref_div_max) {
ref_div = ref_div_max;
fb_div = nom * ref_div_max / tmp;
fb_div = DIV_ROUND_CLOSEST(nom * ref_div_max, den);
}

/* reduce the numbers to a simpler ratio once more */
Expand Down

0 comments on commit f8a2645

Please sign in to comment.