]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ASoC: arizona: Avoid changing SYNC_ENA whilst the FLL_ENA is set
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Fri, 2 Sep 2016 15:52:45 +0000 (16:52 +0100)
committerMark Brown <broonie@kernel.org>
Wed, 14 Sep 2016 17:07:53 +0000 (18:07 +0100)
For best performance changing the synchroniser state whilst the FLL is
running should be avoided. As this has been done fairly regularly in
practice rather than hard preventing this, simply improve the FLL enable
sequence and give a warning if the user changes the synchroniser state.

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

index 5455d0e87f0f665428d4ead445548302fd8e5100..fae6ccf8405bde7b522c511d52b589507e050270 100644 (file)
@@ -2209,12 +2209,15 @@ static int arizona_enable_fll(struct arizona_fll *fll)
        struct arizona *arizona = fll->arizona;
        bool use_sync = false;
        int already_enabled = arizona_is_enabled_fll(fll, fll->base);
+       int sync_enabled = arizona_is_enabled_fll(fll, fll->base + 0x10);
        struct arizona_fll_cfg cfg;
        int i;
        unsigned int val;
 
        if (already_enabled < 0)
                return already_enabled;
+       if (sync_enabled < 0)
+               return sync_enabled;
 
        if (already_enabled) {
                /* Facilitate smooth refclk across the transition */
@@ -2255,6 +2258,9 @@ static int arizona_enable_fll(struct arizona_fll *fll)
                return -EINVAL;
        }
 
+       if (already_enabled && !!sync_enabled != use_sync)
+               arizona_fll_warn(fll, "Synchroniser changed on active FLL\n");
+
        /*
         * Increase the bandwidth if we're not using a low frequency
         * sync source.
@@ -2270,12 +2276,12 @@ static int arizona_enable_fll(struct arizona_fll *fll)
        if (!already_enabled)
                pm_runtime_get(arizona->dev);
 
-       regmap_update_bits_async(arizona->regmap, fll->base + 1,
-                                ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
        if (use_sync)
                regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
                                         ARIZONA_FLL1_SYNC_ENA,
                                         ARIZONA_FLL1_SYNC_ENA);
+       regmap_update_bits_async(arizona->regmap, fll->base + 1,
+                                ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
 
        if (already_enabled)
                regmap_update_bits_async(arizona->regmap, fll->base + 1,