ASoC: arizona: Improve suppression of noop FLL updates
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Wed, 20 Feb 2013 17:28:39 +0000 (17:28 +0000)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 4 Mar 2013 03:01:00 +0000 (11:01 +0800)
Previously updates that only changes FLL source would be missed, this
patch corrects this. We also ensures that both REFCLK and SYNCCLK
frequency changes are considered, in preparation for future updates.

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

index e770945fa019caa53f33ddf7930d3d7ef2619d8e..149e44f42f84abf3203d5d74aa2d4fc3ae5ddcc8 100644 (file)
@@ -1145,10 +1145,12 @@ int arizona_set_fll(struct arizona_fll *fll, int source,
        struct arizona_fll_cfg ref, sync;
        int ret;
 
-       if (fll->fref == Fref && fll->fout == Fout)
-               return 0;
-
        if (fll->ref_src < 0 || fll->ref_src == source) {
+               if (fll->sync_src == -1 &&
+                   fll->ref_src == source && fll->ref_freq == Fref &&
+                   fll->fout == Fout)
+                       return 0;
+
                if (Fout) {
                        ret = arizona_calc_fll(fll, &ref, Fref, Fout);
                        if (ret != 0)
@@ -1159,6 +1161,10 @@ int arizona_set_fll(struct arizona_fll *fll, int source,
                fll->ref_src = source;
                fll->ref_freq = Fref;
        } else {
+               if (fll->sync_src == source &&
+                   fll->sync_freq == Fref && fll->fout == Fout)
+                       return 0;
+
                if (Fout) {
                        ret = arizona_calc_fll(fll, &ref, fll->ref_freq, Fout);
                        if (ret != 0)
@@ -1172,6 +1178,7 @@ int arizona_set_fll(struct arizona_fll *fll, int source,
                fll->sync_src = source;
                fll->sync_freq = Fref;
        }
+       fll->fout = Fout;
 
        if (Fout) {
                arizona_enable_fll(fll, &ref, &sync);
@@ -1179,9 +1186,6 @@ int arizona_set_fll(struct arizona_fll *fll, int source,
                arizona_disable_fll(fll);
        }
 
-       fll->fref = Fref;
-       fll->fout = Fout;
-
        return 0;
 }
 EXPORT_SYMBOL_GPL(arizona_set_fll);
index 37766b547b9dff230260a0f4c314b08f93ba19aa..bedf12a527e55a54c026e08ee3aa9fdaed57194a 100644 (file)
@@ -198,9 +198,8 @@ struct arizona_fll {
        unsigned int base;
        unsigned int vco_mult;
        struct completion ok;
-       unsigned int fref;
-       unsigned int fout;
 
+       unsigned int fout;
        int sync_src;
        unsigned int sync_freq;
        int ref_src;