|
@@ -1929,6 +1929,25 @@ static struct {
|
|
|
{ 1000000, 13500000, 0, 1 },
|
|
|
};
|
|
|
|
|
|
+static const unsigned int pseudo_fref_max[ARIZONA_FLL_MAX_FRATIO] = {
|
|
|
+ 13500000,
|
|
|
+ 6144000,
|
|
|
+ 6144000,
|
|
|
+ 3072000,
|
|
|
+ 3072000,
|
|
|
+ 2822400,
|
|
|
+ 2822400,
|
|
|
+ 1536000,
|
|
|
+ 1536000,
|
|
|
+ 1536000,
|
|
|
+ 1536000,
|
|
|
+ 1536000,
|
|
|
+ 1536000,
|
|
|
+ 1536000,
|
|
|
+ 1536000,
|
|
|
+ 768000,
|
|
|
+};
|
|
|
+
|
|
|
static struct {
|
|
|
unsigned int min;
|
|
|
unsigned int max;
|
|
@@ -2042,16 +2061,32 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
|
|
|
/* Adjust FRATIO/refdiv to avoid integer mode if possible */
|
|
|
refdiv = cfg->refdiv;
|
|
|
|
|
|
+ arizona_fll_dbg(fll, "pseudo: initial ratio=%u fref=%u refdiv=%u\n",
|
|
|
+ init_ratio, Fref, refdiv);
|
|
|
+
|
|
|
while (div <= ARIZONA_FLL_MAX_REFDIV) {
|
|
|
for (ratio = init_ratio; ratio <= ARIZONA_FLL_MAX_FRATIO;
|
|
|
ratio++) {
|
|
|
if ((ARIZONA_FLL_VCO_CORNER / 2) /
|
|
|
- (fll->vco_mult * ratio) < Fref)
|
|
|
+ (fll->vco_mult * ratio) < Fref) {
|
|
|
+ arizona_fll_dbg(fll, "pseudo: hit VCO corner\n");
|
|
|
break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Fref > pseudo_fref_max[ratio - 1]) {
|
|
|
+ arizona_fll_dbg(fll,
|
|
|
+ "pseudo: exceeded max fref(%u) for ratio=%u\n",
|
|
|
+ pseudo_fref_max[ratio - 1],
|
|
|
+ ratio);
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
if (target % (ratio * Fref)) {
|
|
|
cfg->refdiv = refdiv;
|
|
|
cfg->fratio = ratio - 1;
|
|
|
+ arizona_fll_dbg(fll,
|
|
|
+ "pseudo: found fref=%u refdiv=%d(%d) ratio=%d\n",
|
|
|
+ Fref, refdiv, div, ratio);
|
|
|
return ratio;
|
|
|
}
|
|
|
}
|
|
@@ -2060,6 +2095,9 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
|
|
|
if (target % (ratio * Fref)) {
|
|
|
cfg->refdiv = refdiv;
|
|
|
cfg->fratio = ratio - 1;
|
|
|
+ arizona_fll_dbg(fll,
|
|
|
+ "pseudo: found fref=%u refdiv=%d(%d) ratio=%d\n",
|
|
|
+ Fref, refdiv, div, ratio);
|
|
|
return ratio;
|
|
|
}
|
|
|
}
|
|
@@ -2068,6 +2106,9 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
|
|
|
Fref /= 2;
|
|
|
refdiv++;
|
|
|
init_ratio = arizona_find_fratio(Fref, NULL);
|
|
|
+ arizona_fll_dbg(fll,
|
|
|
+ "pseudo: change fref=%u refdiv=%d(%d) ratio=%u\n",
|
|
|
+ Fref, refdiv, div, init_ratio);
|
|
|
}
|
|
|
|
|
|
arizona_fll_warn(fll, "Falling back to integer mode operation\n");
|