|
@@ -469,10 +469,19 @@ static void radeon_compute_pll_legacy(struct radeon_pll *pll,
|
|
uint32_t best_error = 0xffffffff;
|
|
uint32_t best_error = 0xffffffff;
|
|
uint32_t best_vco_diff = 1;
|
|
uint32_t best_vco_diff = 1;
|
|
uint32_t post_div;
|
|
uint32_t post_div;
|
|
|
|
+ u32 pll_out_min, pll_out_max;
|
|
|
|
|
|
DRM_DEBUG("PLL freq %llu %u %u\n", freq, pll->min_ref_div, pll->max_ref_div);
|
|
DRM_DEBUG("PLL freq %llu %u %u\n", freq, pll->min_ref_div, pll->max_ref_div);
|
|
freq = freq * 1000;
|
|
freq = freq * 1000;
|
|
|
|
|
|
|
|
+ if (pll->flags & RADEON_PLL_IS_LCD) {
|
|
|
|
+ pll_out_min = pll->lcd_pll_out_min;
|
|
|
|
+ pll_out_max = pll->lcd_pll_out_max;
|
|
|
|
+ } else {
|
|
|
|
+ pll_out_min = pll->pll_out_min;
|
|
|
|
+ pll_out_max = pll->pll_out_max;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (pll->flags & RADEON_PLL_USE_REF_DIV)
|
|
if (pll->flags & RADEON_PLL_USE_REF_DIV)
|
|
min_ref_div = max_ref_div = pll->reference_div;
|
|
min_ref_div = max_ref_div = pll->reference_div;
|
|
else {
|
|
else {
|
|
@@ -536,10 +545,10 @@ static void radeon_compute_pll_legacy(struct radeon_pll *pll,
|
|
tmp = (uint64_t)pll->reference_freq * feedback_div;
|
|
tmp = (uint64_t)pll->reference_freq * feedback_div;
|
|
vco = radeon_div(tmp, ref_div);
|
|
vco = radeon_div(tmp, ref_div);
|
|
|
|
|
|
- if (vco < pll->pll_out_min) {
|
|
|
|
|
|
+ if (vco < pll_out_min) {
|
|
min_feed_div = feedback_div + 1;
|
|
min_feed_div = feedback_div + 1;
|
|
continue;
|
|
continue;
|
|
- } else if (vco > pll->pll_out_max) {
|
|
|
|
|
|
+ } else if (vco > pll_out_max) {
|
|
max_feed_div = feedback_div;
|
|
max_feed_div = feedback_div;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -675,6 +684,15 @@ calc_fb_ref_div(struct radeon_pll *pll,
|
|
{
|
|
{
|
|
fixed20_12 ffreq, max_error, error, pll_out, a;
|
|
fixed20_12 ffreq, max_error, error, pll_out, a;
|
|
u32 vco;
|
|
u32 vco;
|
|
|
|
+ u32 pll_out_min, pll_out_max;
|
|
|
|
+
|
|
|
|
+ if (pll->flags & RADEON_PLL_IS_LCD) {
|
|
|
|
+ pll_out_min = pll->lcd_pll_out_min;
|
|
|
|
+ pll_out_max = pll->lcd_pll_out_max;
|
|
|
|
+ } else {
|
|
|
|
+ pll_out_min = pll->pll_out_min;
|
|
|
|
+ pll_out_max = pll->pll_out_max;
|
|
|
|
+ }
|
|
|
|
|
|
ffreq.full = rfixed_const(freq);
|
|
ffreq.full = rfixed_const(freq);
|
|
/* max_error = ffreq * 0.0025; */
|
|
/* max_error = ffreq * 0.0025; */
|
|
@@ -686,7 +704,7 @@ calc_fb_ref_div(struct radeon_pll *pll,
|
|
vco = pll->reference_freq * (((*fb_div) * 10) + (*fb_div_frac));
|
|
vco = pll->reference_freq * (((*fb_div) * 10) + (*fb_div_frac));
|
|
vco = vco / ((*ref_div) * 10);
|
|
vco = vco / ((*ref_div) * 10);
|
|
|
|
|
|
- if ((vco < pll->pll_out_min) || (vco > pll->pll_out_max))
|
|
|
|
|
|
+ if ((vco < pll_out_min) || (vco > pll_out_max))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
/* pll_out = vco / post_div; */
|
|
/* pll_out = vco / post_div; */
|
|
@@ -714,6 +732,15 @@ static void radeon_compute_pll_new(struct radeon_pll *pll,
|
|
{
|
|
{
|
|
u32 fb_div = 0, fb_div_frac = 0, post_div = 0, ref_div = 0;
|
|
u32 fb_div = 0, fb_div_frac = 0, post_div = 0, ref_div = 0;
|
|
u32 best_freq = 0, vco_frequency;
|
|
u32 best_freq = 0, vco_frequency;
|
|
|
|
+ u32 pll_out_min, pll_out_max;
|
|
|
|
+
|
|
|
|
+ if (pll->flags & RADEON_PLL_IS_LCD) {
|
|
|
|
+ pll_out_min = pll->lcd_pll_out_min;
|
|
|
|
+ pll_out_max = pll->lcd_pll_out_max;
|
|
|
|
+ } else {
|
|
|
|
+ pll_out_min = pll->pll_out_min;
|
|
|
|
+ pll_out_max = pll->pll_out_max;
|
|
|
|
+ }
|
|
|
|
|
|
/* freq = freq / 10; */
|
|
/* freq = freq / 10; */
|
|
do_div(freq, 10);
|
|
do_div(freq, 10);
|
|
@@ -724,7 +751,7 @@ static void radeon_compute_pll_new(struct radeon_pll *pll,
|
|
goto done;
|
|
goto done;
|
|
|
|
|
|
vco_frequency = freq * post_div;
|
|
vco_frequency = freq * post_div;
|
|
- if ((vco_frequency < pll->pll_out_min) || (vco_frequency > pll->pll_out_max))
|
|
|
|
|
|
+ if ((vco_frequency < pll_out_min) || (vco_frequency > pll_out_max))
|
|
goto done;
|
|
goto done;
|
|
|
|
|
|
if (pll->flags & RADEON_PLL_USE_REF_DIV) {
|
|
if (pll->flags & RADEON_PLL_USE_REF_DIV) {
|
|
@@ -749,7 +776,7 @@ static void radeon_compute_pll_new(struct radeon_pll *pll,
|
|
continue;
|
|
continue;
|
|
|
|
|
|
vco_frequency = freq * post_div;
|
|
vco_frequency = freq * post_div;
|
|
- if ((vco_frequency < pll->pll_out_min) || (vco_frequency > pll->pll_out_max))
|
|
|
|
|
|
+ if ((vco_frequency < pll_out_min) || (vco_frequency > pll_out_max))
|
|
continue;
|
|
continue;
|
|
if (pll->flags & RADEON_PLL_USE_REF_DIV) {
|
|
if (pll->flags & RADEON_PLL_USE_REF_DIV) {
|
|
ref_div = pll->reference_div;
|
|
ref_div = pll->reference_div;
|