Merge remote-tracking branches 'asoc/fix/alc5632', 'asoc/fix/cs42l52', 'asoc/fix...
[cascardo/linux.git] / sound / soc / codecs / wm8994.c
index adb7206..6303537 100644 (file)
@@ -1344,8 +1344,7 @@ static const char *adc_mux_text[] = {
        "DMIC",
 };
 
-static SOC_ENUM_SINGLE_DECL(adc_enum,
-                           0, 0, adc_mux_text);
+static SOC_ENUM_SINGLE_VIRT_DECL(adc_enum, adc_mux_text);
 
 static const struct snd_kcontrol_new adcl_mux =
        SOC_DAPM_ENUM_VIRT("ADCL Mux", adc_enum);
@@ -2554,43 +2553,52 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec,
 int wm8994_vmid_mode(struct snd_soc_codec *codec, enum wm8994_vmid_mode mode)
 {
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_dapm_context *dapm = &codec->dapm;
 
        switch (mode) {
        case WM8994_VMID_NORMAL:
+               snd_soc_dapm_mutex_lock(dapm);
+
                if (wm8994->hubs.lineout1_se) {
-                       snd_soc_dapm_disable_pin(&codec->dapm,
-                                                "LINEOUT1N Driver");
-                       snd_soc_dapm_disable_pin(&codec->dapm,
-                                                "LINEOUT1P Driver");
+                       snd_soc_dapm_disable_pin_unlocked(dapm,
+                                                         "LINEOUT1N Driver");
+                       snd_soc_dapm_disable_pin_unlocked(dapm,
+                                                         "LINEOUT1P Driver");
                }
                if (wm8994->hubs.lineout2_se) {
-                       snd_soc_dapm_disable_pin(&codec->dapm,
-                                                "LINEOUT2N Driver");
-                       snd_soc_dapm_disable_pin(&codec->dapm,
-                                                "LINEOUT2P Driver");
+                       snd_soc_dapm_disable_pin_unlocked(dapm,
+                                                         "LINEOUT2N Driver");
+                       snd_soc_dapm_disable_pin_unlocked(dapm,
+                                                         "LINEOUT2P Driver");
                }
 
                /* Do the sync with the old mode to allow it to clean up */
-               snd_soc_dapm_sync(&codec->dapm);
+               snd_soc_dapm_sync_unlocked(dapm);
                wm8994->vmid_mode = mode;
+
+               snd_soc_dapm_mutex_unlock(dapm);
                break;
 
        case WM8994_VMID_FORCE:
+               snd_soc_dapm_mutex_lock(dapm);
+
                if (wm8994->hubs.lineout1_se) {
-                       snd_soc_dapm_force_enable_pin(&codec->dapm,
-                                                     "LINEOUT1N Driver");
-                       snd_soc_dapm_force_enable_pin(&codec->dapm,
-                                                     "LINEOUT1P Driver");
+                       snd_soc_dapm_force_enable_pin_unlocked(dapm,
+                                                              "LINEOUT1N Driver");
+                       snd_soc_dapm_force_enable_pin_unlocked(dapm,
+                                                              "LINEOUT1P Driver");
                }
                if (wm8994->hubs.lineout2_se) {
-                       snd_soc_dapm_force_enable_pin(&codec->dapm,
-                                                     "LINEOUT2N Driver");
-                       snd_soc_dapm_force_enable_pin(&codec->dapm,
-                                                     "LINEOUT2P Driver");
+                       snd_soc_dapm_force_enable_pin_unlocked(dapm,
+                                                              "LINEOUT2N Driver");
+                       snd_soc_dapm_force_enable_pin_unlocked(dapm,
+                                                              "LINEOUT2P Driver");
                }
 
                wm8994->vmid_mode = mode;
-               snd_soc_dapm_sync(&codec->dapm);
+               snd_soc_dapm_sync_unlocked(dapm);
+
+               snd_soc_dapm_mutex_unlock(dapm);
                break;
 
        default:
@@ -3242,7 +3250,7 @@ static void wm8994_handle_retune_mobile_pdata(struct wm8994_priv *wm8994)
        dev_dbg(codec->dev, "Allocated %d unique ReTune Mobile names\n",
                wm8994->num_retune_mobile_texts);
 
-       wm8994->retune_mobile_enum.max = wm8994->num_retune_mobile_texts;
+       wm8994->retune_mobile_enum.items = wm8994->num_retune_mobile_texts;
        wm8994->retune_mobile_enum.texts = wm8994->retune_mobile_texts;
 
        ret = snd_soc_add_codec_controls(wm8994->hubs.codec, controls,
@@ -3298,7 +3306,7 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994)
                for (i = 0; i < pdata->num_drc_cfgs; i++)
                        wm8994->drc_texts[i] = pdata->drc_cfgs[i].name;
 
-               wm8994->drc_enum.max = pdata->num_drc_cfgs;
+               wm8994->drc_enum.items = pdata->num_drc_cfgs;
                wm8994->drc_enum.texts = wm8994->drc_texts;
 
                ret = snd_soc_add_codec_controls(wm8994->hubs.codec, controls,
@@ -3990,9 +3998,8 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
        int ret, i;
 
        wm8994->hubs.codec = codec;
-       codec->control_data = control->regmap;
 
-       snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_REGMAP);
+       snd_soc_codec_set_cache_io(codec, control->regmap);
 
        mutex_init(&wm8994->accdet_lock);
        INIT_DELAYED_WORK(&wm8994->jackdet_bootstrap,