ASoC: wm8904: Move register default setup into I2C probe()
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Sat, 9 Jun 2012 03:57:37 +0000 (11:57 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 25 Jun 2012 08:55:00 +0000 (09:55 +0100)
Get it done as early as possible, it's neater and minimises the time the
pins aren't configured as requested.

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

index b178232c990c8022b23d6cb23b438e748f67fbad..0013afe48e66a83171b93691b46593cb2e64d7ea 100644 (file)
@@ -2054,8 +2054,7 @@ static void wm8904_handle_pdata(struct snd_soc_codec *codec)
 static int wm8904_probe(struct snd_soc_codec *codec)
 {
        struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
-       struct wm8904_pdata *pdata = wm8904->pdata;
-       int ret, i;
+       int ret;
 
        codec->control_data = wm8904->regmap;
 
@@ -2077,60 +2076,6 @@ static int wm8904_probe(struct snd_soc_codec *codec)
                return ret;
        }
 
-       /* Change some default settings - latch VU and enable ZC */
-       snd_soc_update_bits(codec, WM8904_ADC_DIGITAL_VOLUME_LEFT,
-                           WM8904_ADC_VU, WM8904_ADC_VU);
-       snd_soc_update_bits(codec, WM8904_ADC_DIGITAL_VOLUME_RIGHT,
-                           WM8904_ADC_VU, WM8904_ADC_VU);
-       snd_soc_update_bits(codec, WM8904_DAC_DIGITAL_VOLUME_LEFT,
-                           WM8904_DAC_VU, WM8904_DAC_VU);
-       snd_soc_update_bits(codec, WM8904_DAC_DIGITAL_VOLUME_RIGHT,
-                           WM8904_DAC_VU, WM8904_DAC_VU);
-       snd_soc_update_bits(codec, WM8904_ANALOGUE_OUT1_LEFT,
-                           WM8904_HPOUT_VU | WM8904_HPOUTLZC,
-                           WM8904_HPOUT_VU | WM8904_HPOUTLZC);
-       snd_soc_update_bits(codec, WM8904_ANALOGUE_OUT1_RIGHT,
-                           WM8904_HPOUT_VU | WM8904_HPOUTRZC,
-                           WM8904_HPOUT_VU | WM8904_HPOUTRZC);
-       snd_soc_update_bits(codec, WM8904_ANALOGUE_OUT2_LEFT,
-                           WM8904_LINEOUT_VU | WM8904_LINEOUTLZC,
-                           WM8904_LINEOUT_VU | WM8904_LINEOUTLZC);
-       snd_soc_update_bits(codec, WM8904_ANALOGUE_OUT2_RIGHT,
-                           WM8904_LINEOUT_VU | WM8904_LINEOUTRZC,
-                           WM8904_LINEOUT_VU | WM8904_LINEOUTRZC);
-       snd_soc_update_bits(codec, WM8904_CLOCK_RATES_0,
-                           WM8904_SR_MODE, 0);
-
-       /* Apply configuration from the platform data. */
-       if (wm8904->pdata) {
-               for (i = 0; i < WM8904_GPIO_REGS; i++) {
-                       if (!pdata->gpio_cfg[i])
-                               continue;
-
-                       regmap_update_bits(wm8904->regmap,
-                                          WM8904_GPIO_CONTROL_1 + i,
-                                          0xffff,
-                                          pdata->gpio_cfg[i]);
-               }
-
-               /* Zero is the default value for these anyway */
-               for (i = 0; i < WM8904_MIC_REGS; i++)
-                       regmap_update_bits(wm8904->regmap,
-                                          WM8904_MIC_BIAS_CONTROL_0 + i,
-                                          0xffff,
-                                          pdata->mic_cfg[i]);
-       }
-
-       /* Set Class W by default - this will be managed by the Class
-        * G widget at runtime where bypass paths are available.
-        */
-       snd_soc_update_bits(codec, WM8904_CLASS_W_0,
-                           WM8904_CP_DYN_PWR, WM8904_CP_DYN_PWR);
-
-       /* Use normal bias source */
-       snd_soc_update_bits(codec, WM8904_BIAS_CONTROL_0,
-                           WM8904_POBCTRL, 0);
-
        wm8904_handle_pdata(codec);
 
        wm8904_add_widgets(codec);
@@ -2234,6 +2179,60 @@ static __devinit int wm8904_i2c_probe(struct i2c_client *i2c,
                goto err_enable;
        }
 
+       /* Change some default settings - latch VU and enable ZC */
+       regmap_update_bits(wm8904->regmap, WM8904_ADC_DIGITAL_VOLUME_LEFT,
+                          WM8904_ADC_VU, WM8904_ADC_VU);
+       regmap_update_bits(wm8904->regmap, WM8904_ADC_DIGITAL_VOLUME_RIGHT,
+                          WM8904_ADC_VU, WM8904_ADC_VU);
+       regmap_update_bits(wm8904->regmap, WM8904_DAC_DIGITAL_VOLUME_LEFT,
+                          WM8904_DAC_VU, WM8904_DAC_VU);
+       regmap_update_bits(wm8904->regmap, WM8904_DAC_DIGITAL_VOLUME_RIGHT,
+                          WM8904_DAC_VU, WM8904_DAC_VU);
+       regmap_update_bits(wm8904->regmap, WM8904_ANALOGUE_OUT1_LEFT,
+                          WM8904_HPOUT_VU | WM8904_HPOUTLZC,
+                          WM8904_HPOUT_VU | WM8904_HPOUTLZC);
+       regmap_update_bits(wm8904->regmap, WM8904_ANALOGUE_OUT1_RIGHT,
+                          WM8904_HPOUT_VU | WM8904_HPOUTRZC,
+                          WM8904_HPOUT_VU | WM8904_HPOUTRZC);
+       regmap_update_bits(wm8904->regmap, WM8904_ANALOGUE_OUT2_LEFT,
+                          WM8904_LINEOUT_VU | WM8904_LINEOUTLZC,
+                          WM8904_LINEOUT_VU | WM8904_LINEOUTLZC);
+       regmap_update_bits(wm8904->regmap, WM8904_ANALOGUE_OUT2_RIGHT,
+                          WM8904_LINEOUT_VU | WM8904_LINEOUTRZC,
+                          WM8904_LINEOUT_VU | WM8904_LINEOUTRZC);
+       regmap_update_bits(wm8904->regmap, WM8904_CLOCK_RATES_0,
+                          WM8904_SR_MODE, 0);
+
+       /* Apply configuration from the platform data. */
+       if (wm8904->pdata) {
+               for (i = 0; i < WM8904_GPIO_REGS; i++) {
+                       if (!wm8904->pdata->gpio_cfg[i])
+                               continue;
+
+                       regmap_update_bits(wm8904->regmap,
+                                          WM8904_GPIO_CONTROL_1 + i,
+                                          0xffff,
+                                          wm8904->pdata->gpio_cfg[i]);
+               }
+
+               /* Zero is the default value for these anyway */
+               for (i = 0; i < WM8904_MIC_REGS; i++)
+                       regmap_update_bits(wm8904->regmap,
+                                          WM8904_MIC_BIAS_CONTROL_0 + i,
+                                          0xffff,
+                                          wm8904->pdata->mic_cfg[i]);
+       }
+
+       /* Set Class W by default - this will be managed by the Class
+        * G widget at runtime where bypass paths are available.
+        */
+       regmap_update_bits(wm8904->regmap, WM8904_CLASS_W_0,
+                           WM8904_CP_DYN_PWR, WM8904_CP_DYN_PWR);
+
+       /* Use normal bias source */
+       regmap_update_bits(wm8904->regmap, WM8904_BIAS_CONTROL_0,
+                           WM8904_POBCTRL, 0);
+
        /* Can leave the device powered off until we need it */
        regcache_cache_only(wm8904->regmap, true);
        regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), wm8904->supplies);