|
@@ -2416,8 +2416,19 @@ static struct snd_soc_dai_driver wm8994_dai[] = {
|
|
|
static int wm8994_suspend(struct snd_soc_codec *codec, pm_message_t state)
|
|
|
{
|
|
|
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
|
|
|
+ struct wm8994 *control = codec->control_data;
|
|
|
int i, ret;
|
|
|
|
|
|
+ switch (control->type) {
|
|
|
+ case WM8994:
|
|
|
+ snd_soc_update_bits(codec, WM8994_MICBIAS, WM8994_MICD_ENA, 0);
|
|
|
+ break;
|
|
|
+ case WM8958:
|
|
|
+ snd_soc_update_bits(codec, WM8958_MIC_DETECT_1,
|
|
|
+ WM8958_MICD_ENA, 0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) {
|
|
|
memcpy(&wm8994->fll_suspend[i], &wm8994->fll[i],
|
|
|
sizeof(struct wm8994_fll_config));
|
|
@@ -2435,6 +2446,7 @@ static int wm8994_suspend(struct snd_soc_codec *codec, pm_message_t state)
|
|
|
static int wm8994_resume(struct snd_soc_codec *codec)
|
|
|
{
|
|
|
struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
|
|
|
+ struct wm8994 *control = codec->control_data;
|
|
|
int i, ret;
|
|
|
unsigned int val, mask;
|
|
|
|
|
@@ -2473,6 +2485,19 @@ static int wm8994_resume(struct snd_soc_codec *codec)
|
|
|
i + 1, ret);
|
|
|
}
|
|
|
|
|
|
+ switch (control->type) {
|
|
|
+ case WM8994:
|
|
|
+ if (wm8994->micdet[0].jack || wm8994->micdet[1].jack)
|
|
|
+ snd_soc_update_bits(codec, WM8994_MICBIAS,
|
|
|
+ WM8994_MICD_ENA, WM8994_MICD_ENA);
|
|
|
+ break;
|
|
|
+ case WM8958:
|
|
|
+ if (wm8994->jack_cb)
|
|
|
+ snd_soc_update_bits(codec, WM8958_MIC_DETECT_1,
|
|
|
+ WM8958_MICD_ENA, WM8958_MICD_ENA);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
#else
|