diff options
Diffstat (limited to 'sound/soc/codecs/wm_hubs.c')
| -rw-r--r-- | sound/soc/codecs/wm_hubs.c | 35 | 
1 files changed, 31 insertions, 4 deletions
diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index b2e939a8970..7a773a835b8 100644 --- a/sound/soc/codecs/wm_hubs.c +++ b/sound/soc/codecs/wm_hubs.c @@ -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,  |