ASoC: arizona: Support variable FLL VCO multipliers
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 10 Jul 2012 16:03:46 +0000 (17:03 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 10 Jul 2012 16:17:35 +0000 (17:17 +0100)
Some Arizona chips have a higher frequency for the FLL VCO, support this
in the common code.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/arizona.c
sound/soc/codecs/arizona.h
sound/soc/codecs/wm5102.c

index f3680c374347202a60aae3fc6d035af4250c41bd..5c9cacaf2d525cddabffd0b416c0695dfadaab99 100644 (file)
@@ -734,9 +734,9 @@ static int arizona_calc_fll(struct arizona_fll *fll,
        /* Apply the division for our remaining calculations */
        Fref /= div;
 
-       /* Fvco should be 90-100MHz; don't check the upper bound */
+       /* Fvco should be over the targt; don't check the upper bound */
        div = 1;
-       while (Fout * div < 90000000) {
+       while (Fout * div < 90000000 * fll->vco_mult) {
                div++;
                if (div > 7) {
                        arizona_fll_err(fll, "No FLL_OUTDIV for Fout=%uHz\n",
@@ -744,7 +744,7 @@ static int arizona_calc_fll(struct arizona_fll *fll,
                        return -EINVAL;
                }
        }
-       target = Fout * div;
+       target = Fout * div / fll->vco_mult;
        cfg->outdiv = div;
 
        arizona_fll_dbg(fll, "Fvco=%dHz\n", target);
index b894b64e8f5ca75bf1f32671b0364498cb67f19c..59caca8865e8aa355c279dd257cf836d667627aa 100644 (file)
@@ -141,6 +141,7 @@ struct arizona_fll {
        struct arizona *arizona;
        int id;
        unsigned int base;
+       unsigned int vco_mult;
        struct completion lock;
        struct completion ok;
 
index 7a6a11a323ffc933bb03935240bbbba4c7ffd64c..6537f16d383e12f459b9f39950c7b28b46d8d7da 100644 (file)
@@ -853,6 +853,9 @@ static int __devinit wm5102_probe(struct platform_device *pdev)
 
        wm5102->core.arizona = arizona;
 
+       for (i = 0; i < ARRAY_SIZE(wm5102->fll); i++)
+               wm5102->fll[i].vco_mult = 1;
+
        arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1,
                         ARIZONA_IRQ_FLL1_LOCK, ARIZONA_IRQ_FLL1_CLOCK_OK,
                         &wm5102->fll[0]);