ASoC: arizona: Correct handling of FLL theta in synchroniser mode
[cascardo/linux.git] / sound / soc / codecs / arizona.c
index ccb3ca2..ded235f 100644 (file)
@@ -1920,8 +1920,8 @@ static struct {
 
 struct arizona_fll_cfg {
        int n;
-       int theta;
-       int lambda;
+       unsigned int theta;
+       unsigned int lambda;
        int refdiv;
        int outdiv;
        int fratio;
@@ -2233,6 +2233,10 @@ static int arizona_enable_fll(struct arizona_fll *fll)
            fll->ref_src != fll->sync_src) {
                arizona_calc_fll(fll, &cfg, fll->ref_freq, false);
 
+               /* Ref path hardcodes lambda to 65536 when sync is on */
+               if (fll->sync_src >= 0 && cfg.lambda)
+                       cfg.theta = (cfg.theta * (1 << 16)) / cfg.lambda;
+
                arizona_apply_fll(arizona, fll->base, &cfg, fll->ref_src,
                                  false);
                if (fll->sync_src >= 0) {