|
@@ -644,6 +644,28 @@ static int lineout_event(struct snd_soc_dapm_widget *w,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int micbias_event(struct snd_soc_dapm_widget *w,
|
|
|
+ struct snd_kcontrol *kcontrol, int event)
|
|
|
+{
|
|
|
+ struct snd_soc_codec *codec = w->codec;
|
|
|
+ struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);
|
|
|
+
|
|
|
+ switch (w->shift) {
|
|
|
+ case WM8993_MICB1_ENA_SHIFT:
|
|
|
+ if (hubs->micb1_delay)
|
|
|
+ msleep(hubs->micb1_delay);
|
|
|
+ break;
|
|
|
+ case WM8993_MICB2_ENA_SHIFT:
|
|
|
+ if (hubs->micb2_delay)
|
|
|
+ msleep(hubs->micb2_delay);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
void wm_hubs_update_class_w(struct snd_soc_codec *codec)
|
|
|
{
|
|
|
struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);
|
|
@@ -834,8 +856,10 @@ SND_SOC_DAPM_INPUT("IN1RP"),
|
|
|
SND_SOC_DAPM_INPUT("IN2RN"),
|
|
|
SND_SOC_DAPM_INPUT("IN2RP:VXRP"),
|
|
|
|
|
|
-SND_SOC_DAPM_SUPPLY("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0, NULL, 0),
|
|
|
-SND_SOC_DAPM_SUPPLY("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0, NULL, 0),
|
|
|
+SND_SOC_DAPM_SUPPLY("MICBIAS2", WM8993_POWER_MANAGEMENT_1, 5, 0,
|
|
|
+ micbias_event, SND_SOC_DAPM_POST_PMU),
|
|
|
+SND_SOC_DAPM_SUPPLY("MICBIAS1", WM8993_POWER_MANAGEMENT_1, 4, 0,
|
|
|
+ micbias_event, SND_SOC_DAPM_POST_PMU),
|
|
|
|
|
|
SND_SOC_DAPM_MIXER("IN1L PGA", WM8993_POWER_MANAGEMENT_2, 6, 0,
|
|
|
in1l_pga, ARRAY_SIZE(in1l_pga)),
|
|
@@ -1170,13 +1194,16 @@ EXPORT_SYMBOL_GPL(wm_hubs_add_analogue_routes);
|
|
|
int wm_hubs_handle_analogue_pdata(struct snd_soc_codec *codec,
|
|
|
int lineout1_diff, int lineout2_diff,
|
|
|
int lineout1fb, int lineout2fb,
|
|
|
- int jd_scthr, int jd_thr, int micbias1_lvl,
|
|
|
- int micbias2_lvl)
|
|
|
+ int jd_scthr, int jd_thr,
|
|
|
+ int micbias1_delay, int micbias2_delay,
|
|
|
+ int micbias1_lvl, int micbias2_lvl)
|
|
|
{
|
|
|
struct wm_hubs_data *hubs = snd_soc_codec_get_drvdata(codec);
|
|
|
|
|
|
hubs->lineout1_se = !lineout1_diff;
|
|
|
hubs->lineout2_se = !lineout2_diff;
|
|
|
+ hubs->micb1_delay = micbias1_delay;
|
|
|
+ hubs->micb2_delay = micbias2_delay;
|
|
|
|
|
|
if (!lineout1_diff)
|
|
|
snd_soc_update_bits(codec, WM8993_LINE_MIXER1,
|