These changes are a raw update to a vanilla kernel 4.1.10, with the
[kvmfornfv.git] / kernel / sound / soc / codecs / arizona.c
index eff4b4d..ee91edc 100644 (file)
@@ -1610,17 +1610,6 @@ int arizona_init_dai(struct arizona_priv *priv, int id)
 }
 EXPORT_SYMBOL_GPL(arizona_init_dai);
 
-static irqreturn_t arizona_fll_clock_ok(int irq, void *data)
-{
-       struct arizona_fll *fll = data;
-
-       arizona_fll_dbg(fll, "clock OK\n");
-
-       complete(&fll->ok);
-
-       return IRQ_HANDLED;
-}
-
 static struct {
        unsigned int min;
        unsigned int max;
@@ -1902,17 +1891,18 @@ static int arizona_is_enabled_fll(struct arizona_fll *fll)
 static int arizona_enable_fll(struct arizona_fll *fll)
 {
        struct arizona *arizona = fll->arizona;
-       unsigned long time_left;
        bool use_sync = false;
        int already_enabled = arizona_is_enabled_fll(fll);
        struct arizona_fll_cfg cfg;
+       int i;
+       unsigned int val;
 
        if (already_enabled < 0)
                return already_enabled;
 
        if (already_enabled) {
                /* Facilitate smooth refclk across the transition */
-               regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x7,
+               regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9,
                                         ARIZONA_FLL1_GAIN_MASK, 0);
                regmap_update_bits_async(fll->arizona->regmap, fll->base + 1,
                                         ARIZONA_FLL1_FREERUN,
@@ -1964,9 +1954,6 @@ static int arizona_enable_fll(struct arizona_fll *fll)
        if (!already_enabled)
                pm_runtime_get(arizona->dev);
 
-       /* Clear any pending completions */
-       try_wait_for_completion(&fll->ok);
-
        regmap_update_bits_async(arizona->regmap, fll->base + 1,
                                 ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
        if (use_sync)
@@ -1978,10 +1965,24 @@ static int arizona_enable_fll(struct arizona_fll *fll)
                regmap_update_bits_async(arizona->regmap, fll->base + 1,
                                         ARIZONA_FLL1_FREERUN, 0);
 
-       time_left = wait_for_completion_timeout(&fll->ok,
-                                         msecs_to_jiffies(250));
-       if (time_left == 0)
+       arizona_fll_dbg(fll, "Waiting for FLL lock...\n");
+       val = 0;
+       for (i = 0; i < 15; i++) {
+               if (i < 5)
+                       usleep_range(200, 400);
+               else
+                       msleep(20);
+
+               regmap_read(arizona->regmap,
+                           ARIZONA_INTERRUPT_RAW_STATUS_5,
+                           &val);
+               if (val & (ARIZONA_FLL1_CLOCK_OK_STS << (fll->id - 1)))
+                       break;
+       }
+       if (i == 15)
                arizona_fll_warn(fll, "Timed out waiting for lock\n");
+       else
+               arizona_fll_dbg(fll, "FLL locked (%d polls)\n", i);
 
        return 0;
 }
@@ -2066,11 +2067,8 @@ EXPORT_SYMBOL_GPL(arizona_set_fll);
 int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
                     int ok_irq, struct arizona_fll *fll)
 {
-       int ret;
        unsigned int val;
 
-       init_completion(&fll->ok);
-
        fll->id = id;
        fll->base = base;
        fll->arizona = arizona;
@@ -2092,13 +2090,6 @@ int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
        snprintf(fll->clock_ok_name, sizeof(fll->clock_ok_name),
                 "FLL%d clock OK", id);
 
-       ret = arizona_request_irq(arizona, ok_irq, fll->clock_ok_name,
-                                 arizona_fll_clock_ok, fll);
-       if (ret != 0) {
-               dev_err(arizona->dev, "Failed to get FLL%d clock OK IRQ: %d\n",
-                       id, ret);
-       }
-
        regmap_update_bits(arizona->regmap, fll->base + 1,
                           ARIZONA_FLL1_FREERUN, 0);