diff options
Diffstat (limited to 'sound/soc/codecs/wm8994.c')
| -rw-r--r-- | sound/soc/codecs/wm8994.c | 227 | 
1 files changed, 122 insertions, 105 deletions
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 86426a117b0..247b39013fb 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -265,21 +265,21 @@ static const char *sidetone_hpf_text[] = {  	"2.7kHz", "1.35kHz", "675Hz", "370Hz", "180Hz", "90Hz", "45Hz"  }; -static const struct soc_enum sidetone_hpf = -	SOC_ENUM_SINGLE(WM8994_SIDETONE, 7, 7, sidetone_hpf_text); +static SOC_ENUM_SINGLE_DECL(sidetone_hpf, +			    WM8994_SIDETONE, 7, sidetone_hpf_text);  static const char *adc_hpf_text[] = {  	"HiFi", "Voice 1", "Voice 2", "Voice 3"  }; -static const struct soc_enum aif1adc1_hpf = -	SOC_ENUM_SINGLE(WM8994_AIF1_ADC1_FILTERS, 13, 4, adc_hpf_text); +static SOC_ENUM_SINGLE_DECL(aif1adc1_hpf, +			    WM8994_AIF1_ADC1_FILTERS, 13, adc_hpf_text); -static const struct soc_enum aif1adc2_hpf = -	SOC_ENUM_SINGLE(WM8994_AIF1_ADC2_FILTERS, 13, 4, adc_hpf_text); +static SOC_ENUM_SINGLE_DECL(aif1adc2_hpf, +			    WM8994_AIF1_ADC2_FILTERS, 13, adc_hpf_text); -static const struct soc_enum aif2adc_hpf = -	SOC_ENUM_SINGLE(WM8994_AIF2_ADC_FILTERS, 13, 4, adc_hpf_text); +static SOC_ENUM_SINGLE_DECL(aif2adc_hpf, +			    WM8994_AIF2_ADC_FILTERS, 13, adc_hpf_text);  static const DECLARE_TLV_DB_SCALE(aif_tlv, 0, 600, 0);  static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); @@ -298,7 +298,7 @@ static int wm8994_put_drc_sw(struct snd_kcontrol *kcontrol,  {  	struct soc_mixer_control *mc =  		(struct soc_mixer_control *)kcontrol->private_value; -	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); +	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	int mask, ret;  	/* Can't enable both ADC and DAC paths simultaneously */ @@ -355,7 +355,7 @@ static int wm8994_get_drc(const char *name)  static int wm8994_put_drc_enum(struct snd_kcontrol *kcontrol,  			       struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); +	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);  	struct wm8994 *control = wm8994->wm8994;  	struct wm8994_pdata *pdata = &control->pdata; @@ -378,7 +378,7 @@ static int wm8994_put_drc_enum(struct snd_kcontrol *kcontrol,  static int wm8994_get_drc_enum(struct snd_kcontrol *kcontrol,  			       struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); +	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);  	int drc = wm8994_get_drc(kcontrol->id.name); @@ -462,7 +462,7 @@ static int wm8994_get_retune_mobile_block(const char *name)  static int wm8994_put_retune_mobile_enum(struct snd_kcontrol *kcontrol,  					 struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); +	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);  	struct wm8994 *control = wm8994->wm8994;  	struct wm8994_pdata *pdata = &control->pdata; @@ -485,7 +485,7 @@ static int wm8994_put_retune_mobile_enum(struct snd_kcontrol *kcontrol,  static int wm8994_get_retune_mobile_enum(struct snd_kcontrol *kcontrol,  					 struct snd_ctl_elem_value *ucontrol)  { -	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); +	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);  	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);  	int block = wm8994_get_retune_mobile_block(kcontrol->id.name); @@ -501,39 +501,39 @@ static const char *aif_chan_src_text[] = {  	"Left", "Right"  }; -static const struct soc_enum aif1adcl_src = -	SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_1, 15, 2, aif_chan_src_text); +static SOC_ENUM_SINGLE_DECL(aif1adcl_src, +			    WM8994_AIF1_CONTROL_1, 15, aif_chan_src_text); -static const struct soc_enum aif1adcr_src = -	SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_1, 14, 2, aif_chan_src_text); +static SOC_ENUM_SINGLE_DECL(aif1adcr_src, +			    WM8994_AIF1_CONTROL_1, 14, aif_chan_src_text); -static const struct soc_enum aif2adcl_src = -	SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_1, 15, 2, aif_chan_src_text); +static SOC_ENUM_SINGLE_DECL(aif2adcl_src, +			    WM8994_AIF2_CONTROL_1, 15, aif_chan_src_text); -static const struct soc_enum aif2adcr_src = -	SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_1, 14, 2, aif_chan_src_text); +static SOC_ENUM_SINGLE_DECL(aif2adcr_src, +			    WM8994_AIF2_CONTROL_1, 14, aif_chan_src_text); -static const struct soc_enum aif1dacl_src = -	SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 15, 2, aif_chan_src_text); +static SOC_ENUM_SINGLE_DECL(aif1dacl_src, +			    WM8994_AIF1_CONTROL_2, 15, aif_chan_src_text); -static const struct soc_enum aif1dacr_src = -	SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, 14, 2, aif_chan_src_text); +static SOC_ENUM_SINGLE_DECL(aif1dacr_src, +			    WM8994_AIF1_CONTROL_2, 14, aif_chan_src_text); -static const struct soc_enum aif2dacl_src = -	SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 15, 2, aif_chan_src_text); +static SOC_ENUM_SINGLE_DECL(aif2dacl_src, +			    WM8994_AIF2_CONTROL_2, 15, aif_chan_src_text); -static const struct soc_enum aif2dacr_src = -	SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, 14, 2, aif_chan_src_text); +static SOC_ENUM_SINGLE_DECL(aif2dacr_src, +			    WM8994_AIF2_CONTROL_2, 14, aif_chan_src_text);  static const char *osr_text[] = {  	"Low Power", "High Performance",  }; -static const struct soc_enum dac_osr = -	SOC_ENUM_SINGLE(WM8994_OVERSAMPLING, 0, 2, osr_text); +static SOC_ENUM_SINGLE_DECL(dac_osr, +			    WM8994_OVERSAMPLING, 0, osr_text); -static const struct soc_enum adc_osr = -	SOC_ENUM_SINGLE(WM8994_OVERSAMPLING, 1, 2, osr_text); +static SOC_ENUM_SINGLE_DECL(adc_osr, +			    WM8994_OVERSAMPLING, 1, osr_text);  static const struct snd_kcontrol_new wm8994_snd_controls[] = {  SOC_DOUBLE_R_TLV("AIF1ADC1 Volume", WM8994_AIF1_ADC1_LEFT_VOLUME, @@ -690,17 +690,20 @@ static const char *wm8958_ng_text[] = {  	"30ms", "125ms", "250ms", "500ms",  }; -static const struct soc_enum wm8958_aif1dac1_ng_hold = -	SOC_ENUM_SINGLE(WM8958_AIF1_DAC1_NOISE_GATE, -			WM8958_AIF1DAC1_NG_THR_SHIFT, 4, wm8958_ng_text); +static SOC_ENUM_SINGLE_DECL(wm8958_aif1dac1_ng_hold, +			    WM8958_AIF1_DAC1_NOISE_GATE, +			    WM8958_AIF1DAC1_NG_THR_SHIFT, +			    wm8958_ng_text); -static const struct soc_enum wm8958_aif1dac2_ng_hold = -	SOC_ENUM_SINGLE(WM8958_AIF1_DAC2_NOISE_GATE, -			WM8958_AIF1DAC2_NG_THR_SHIFT, 4, wm8958_ng_text); +static SOC_ENUM_SINGLE_DECL(wm8958_aif1dac2_ng_hold, +			    WM8958_AIF1_DAC2_NOISE_GATE, +			    WM8958_AIF1DAC2_NG_THR_SHIFT, +			    wm8958_ng_text); -static const struct soc_enum wm8958_aif2dac_ng_hold = -	SOC_ENUM_SINGLE(WM8958_AIF2_DAC_NOISE_GATE, -			WM8958_AIF2DAC_NG_THR_SHIFT, 4, wm8958_ng_text); +static SOC_ENUM_SINGLE_DECL(wm8958_aif2dac_ng_hold, +			    WM8958_AIF2_DAC_NOISE_GATE, +			    WM8958_AIF2DAC_NG_THR_SHIFT, +			    wm8958_ng_text);  static const struct snd_kcontrol_new wm8958_snd_controls[] = {  SOC_SINGLE_TLV("AIF3 Boost Volume", WM8958_AIF3_CONTROL_2, 10, 3, 0, aif_tlv), @@ -1341,14 +1344,13 @@ static const char *adc_mux_text[] = {  	"DMIC",  }; -static const struct soc_enum adc_enum = -	SOC_ENUM_SINGLE(0, 0, 2, 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); +	SOC_DAPM_ENUM("ADCL Mux", adc_enum);  static const struct snd_kcontrol_new adcr_mux = -	SOC_DAPM_ENUM_VIRT("ADCR Mux", adc_enum); +	SOC_DAPM_ENUM("ADCR Mux", adc_enum);  static const struct snd_kcontrol_new left_speaker_mixer[] = {  SOC_DAPM_SINGLE("DAC2 Switch", WM8994_SPEAKER_MIXER, 9, 1, 0), @@ -1478,14 +1480,14 @@ static const char *sidetone_text[] = {  	"ADC/DMIC1", "DMIC2",  }; -static const struct soc_enum sidetone1_enum = -	SOC_ENUM_SINGLE(WM8994_SIDETONE, 0, 2, sidetone_text); +static SOC_ENUM_SINGLE_DECL(sidetone1_enum, +			    WM8994_SIDETONE, 0, sidetone_text);  static const struct snd_kcontrol_new sidetone1_mux =  	SOC_DAPM_ENUM("Left Sidetone Mux", sidetone1_enum); -static const struct soc_enum sidetone2_enum = -	SOC_ENUM_SINGLE(WM8994_SIDETONE, 1, 2, sidetone_text); +static SOC_ENUM_SINGLE_DECL(sidetone2_enum, +			    WM8994_SIDETONE, 1, sidetone_text);  static const struct snd_kcontrol_new sidetone2_mux =  	SOC_DAPM_ENUM("Right Sidetone Mux", sidetone2_enum); @@ -1498,22 +1500,24 @@ static const char *loopback_text[] = {  	"None", "ADCDAT",  }; -static const struct soc_enum aif1_loopback_enum = -	SOC_ENUM_SINGLE(WM8994_AIF1_CONTROL_2, WM8994_AIF1_LOOPBACK_SHIFT, 2, -			loopback_text); +static SOC_ENUM_SINGLE_DECL(aif1_loopback_enum, +			    WM8994_AIF1_CONTROL_2, +			    WM8994_AIF1_LOOPBACK_SHIFT, +			    loopback_text);  static const struct snd_kcontrol_new aif1_loopback =  	SOC_DAPM_ENUM("AIF1 Loopback", aif1_loopback_enum); -static const struct soc_enum aif2_loopback_enum = -	SOC_ENUM_SINGLE(WM8994_AIF2_CONTROL_2, WM8994_AIF2_LOOPBACK_SHIFT, 2, -			loopback_text); +static SOC_ENUM_SINGLE_DECL(aif2_loopback_enum, +			    WM8994_AIF2_CONTROL_2, +			    WM8994_AIF2_LOOPBACK_SHIFT, +			    loopback_text);  static const struct snd_kcontrol_new aif2_loopback =  	SOC_DAPM_ENUM("AIF2 Loopback", aif2_loopback_enum); -static const struct soc_enum aif1dac_enum = -	SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 0, 2, aif1dac_text); +static SOC_ENUM_SINGLE_DECL(aif1dac_enum, +			    WM8994_POWER_MANAGEMENT_6, 0, aif1dac_text);  static const struct snd_kcontrol_new aif1dac_mux =  	SOC_DAPM_ENUM("AIF1DAC Mux", aif1dac_enum); @@ -1522,8 +1526,8 @@ static const char *aif2dac_text[] = {  	"AIF2DACDAT", "AIF3DACDAT",  }; -static const struct soc_enum aif2dac_enum = -	SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 1, 2, aif2dac_text); +static SOC_ENUM_SINGLE_DECL(aif2dac_enum, +			    WM8994_POWER_MANAGEMENT_6, 1, aif2dac_text);  static const struct snd_kcontrol_new aif2dac_mux =  	SOC_DAPM_ENUM("AIF2DAC Mux", aif2dac_enum); @@ -1532,8 +1536,8 @@ static const char *aif2adc_text[] = {  	"AIF2ADCDAT", "AIF3DACDAT",  }; -static const struct soc_enum aif2adc_enum = -	SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 2, 2, aif2adc_text); +static SOC_ENUM_SINGLE_DECL(aif2adc_enum, +			    WM8994_POWER_MANAGEMENT_6, 2, aif2adc_text);  static const struct snd_kcontrol_new aif2adc_mux =  	SOC_DAPM_ENUM("AIF2ADC Mux", aif2adc_enum); @@ -1542,14 +1546,14 @@ static const char *aif3adc_text[] = {  	"AIF1ADCDAT", "AIF2ADCDAT", "AIF2DACDAT", "Mono PCM",  }; -static const struct soc_enum wm8994_aif3adc_enum = -	SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 3, 3, aif3adc_text); +static SOC_ENUM_SINGLE_DECL(wm8994_aif3adc_enum, +			    WM8994_POWER_MANAGEMENT_6, 3, aif3adc_text);  static const struct snd_kcontrol_new wm8994_aif3adc_mux =  	SOC_DAPM_ENUM("AIF3ADC Mux", wm8994_aif3adc_enum); -static const struct soc_enum wm8958_aif3adc_enum = -	SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 3, 4, aif3adc_text); +static SOC_ENUM_SINGLE_DECL(wm8958_aif3adc_enum, +			    WM8994_POWER_MANAGEMENT_6, 3, aif3adc_text);  static const struct snd_kcontrol_new wm8958_aif3adc_mux =  	SOC_DAPM_ENUM("AIF3ADC Mux", wm8958_aif3adc_enum); @@ -1558,8 +1562,8 @@ static const char *mono_pcm_out_text[] = {  	"None", "AIF2ADCL", "AIF2ADCR",  }; -static const struct soc_enum mono_pcm_out_enum = -	SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 9, 3, mono_pcm_out_text); +static SOC_ENUM_SINGLE_DECL(mono_pcm_out_enum, +			    WM8994_POWER_MANAGEMENT_6, 9, mono_pcm_out_text);  static const struct snd_kcontrol_new mono_pcm_out_mux =  	SOC_DAPM_ENUM("Mono PCM Out Mux", mono_pcm_out_enum); @@ -1569,14 +1573,14 @@ static const char *aif2dac_src_text[] = {  };  /* Note that these two control shouldn't be simultaneously switched to AIF3 */ -static const struct soc_enum aif2dacl_src_enum = -	SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 7, 2, aif2dac_src_text); +static SOC_ENUM_SINGLE_DECL(aif2dacl_src_enum, +			    WM8994_POWER_MANAGEMENT_6, 7, aif2dac_src_text);  static const struct snd_kcontrol_new aif2dacl_src_mux =  	SOC_DAPM_ENUM("AIF2DACL Mux", aif2dacl_src_enum); -static const struct soc_enum aif2dacr_src_enum = -	SOC_ENUM_SINGLE(WM8994_POWER_MANAGEMENT_6, 8, 2, aif2dac_src_text); +static SOC_ENUM_SINGLE_DECL(aif2dacr_src_enum, +			    WM8994_POWER_MANAGEMENT_6, 8, aif2dac_src_text);  static const struct snd_kcontrol_new aif2dacr_src_mux =  	SOC_DAPM_ENUM("AIF2DACR Mux", aif2dacr_src_enum); @@ -1647,15 +1651,15 @@ SND_SOC_DAPM_DAC("DAC1R", NULL, WM8994_POWER_MANAGEMENT_5, 0, 0),  };  static const struct snd_soc_dapm_widget wm8994_adc_revd_widgets[] = { -SND_SOC_DAPM_VIRT_MUX_E("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux, +SND_SOC_DAPM_MUX_E("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux,  			adc_mux_ev, SND_SOC_DAPM_PRE_PMU), -SND_SOC_DAPM_VIRT_MUX_E("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux, +SND_SOC_DAPM_MUX_E("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux,  			adc_mux_ev, SND_SOC_DAPM_PRE_PMU),  };  static const struct snd_soc_dapm_widget wm8994_adc_widgets[] = { -SND_SOC_DAPM_VIRT_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux), -SND_SOC_DAPM_VIRT_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux), +SND_SOC_DAPM_MUX("ADCL Mux", WM8994_POWER_MANAGEMENT_4, 1, 0, &adcl_mux), +SND_SOC_DAPM_MUX("ADCR Mux", WM8994_POWER_MANAGEMENT_4, 0, 0, &adcr_mux),  };  static const struct snd_soc_dapm_widget wm8994_dapm_widgets[] = { @@ -2549,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: @@ -3237,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, @@ -3293,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, @@ -3985,9 +3998,6 @@ 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);  	mutex_init(&wm8994->accdet_lock);  	INIT_DELAYED_WORK(&wm8994->jackdet_bootstrap, @@ -4077,12 +4087,6 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)  	wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_TEMP_SHUT,  			   wm8994_temp_shut, "Thermal shutdown", codec); -	ret = wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_DCS_DONE, -				 wm_hubs_dcs_done, "DC servo done", -				 &wm8994->hubs); -	if (ret == 0) -		wm8994->hubs.dcs_done_irq = true; -  	switch (control->type) {  	case WM8994:  		if (wm8994->micdet_irq) { @@ -4313,6 +4317,11 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)  	}  	wm_hubs_add_analogue_routes(codec, 0, 0); +	ret = wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_DCS_DONE, +				 wm_hubs_dcs_done, "DC servo done", +				 &wm8994->hubs); +	if (ret == 0) +		wm8994->hubs.dcs_done_irq = true;  	snd_soc_dapm_add_routes(dapm, intercon, ARRAY_SIZE(intercon));  	switch (control->type) { @@ -4423,11 +4432,19 @@ static int wm8994_codec_remove(struct snd_soc_codec *codec)  	return 0;  } +static struct regmap *wm8994_get_regmap(struct device *dev) +{ +	struct wm8994 *control = dev_get_drvdata(dev->parent); + +	return control->regmap; +} +  static struct snd_soc_codec_driver soc_codec_dev_wm8994 = {  	.probe =	wm8994_codec_probe,  	.remove =	wm8994_codec_remove,  	.suspend =	wm8994_codec_suspend,  	.resume =	wm8994_codec_resume, +	.get_regmap =   wm8994_get_regmap,  	.set_bias_level = wm8994_set_bias_level,  };  | 
