Lines Matching +full:dmic +full:- +full:sample +full:- +full:rate

2  * wm8994.c  --  WM8994 ALSA SoC Audio driver
85 if (wm8994->jack_cb != wm8958_default_micdet) in wm8958_micd_set_rate()
88 idle = !wm8994->jack_mic; in wm8958_micd_set_rate()
92 sysclk = wm8994->aifclk[1]; in wm8958_micd_set_rate()
94 sysclk = wm8994->aifclk[0]; in wm8958_micd_set_rate()
96 if (wm8994->pdata && wm8994->pdata->micd_rates) { in wm8958_micd_set_rate()
97 rates = wm8994->pdata->micd_rates; in wm8958_micd_set_rate()
98 num_rates = wm8994->pdata->num_micd_rates; in wm8958_micd_set_rate()
99 } else if (wm8994->jackdet) { in wm8958_micd_set_rate()
111 if (abs(rates[i].sysclk - sysclk) < in wm8958_micd_set_rate()
112 abs(rates[best].sysclk - sysclk)) in wm8958_micd_set_rate()
119 | rates[best].rate << WM8958_MICD_RATE_SHIFT; in wm8958_micd_set_rate()
129 int rate; in configure_aif_clock() local
138 switch (wm8994->sysclk[aif]) { in configure_aif_clock()
140 rate = wm8994->mclk[0]; in configure_aif_clock()
145 rate = wm8994->mclk[1]; in configure_aif_clock()
150 rate = wm8994->fll[0].out; in configure_aif_clock()
155 rate = wm8994->fll[1].out; in configure_aif_clock()
159 return -EINVAL; in configure_aif_clock()
162 if (rate >= 13500000) { in configure_aif_clock()
163 rate /= 2; in configure_aif_clock()
166 dev_dbg(codec->dev, "Dividing AIF%d clock to %dHz\n", in configure_aif_clock()
167 aif + 1, rate); in configure_aif_clock()
170 wm8994->aifclk[aif] = rate; in configure_aif_clock()
195 if (wm8994->aifclk[0] == wm8994->aifclk[1]) { in configure_clock()
200 if (wm8994->aifclk[0] < wm8994->aifclk[1]) in configure_clock()
208 snd_soc_dapm_sync(&codec->dapm); in configure_clock()
218 int reg = snd_soc_read(source->codec, WM8994_CLOCKING_1); in check_clk_sys()
227 return strcmp(source->name, clk) == 0; in check_clk_sys()
251 static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1);
252 static const DECLARE_TLV_DB_SCALE(st_tlv, -3600, 300, 0);
253 static const DECLARE_TLV_DB_SCALE(wm8994_3d_tlv, -1600, 183, 0);
254 static const DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
255 static const DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
268 (struct soc_mixer_control *)kcontrol->private_value; in wm8994_put_drc_sw()
273 if (mc->shift == WM8994_AIF1DAC1_DRC_ENA_SHIFT) in wm8994_put_drc_sw()
279 ret = snd_soc_read(codec, mc->reg); in wm8994_put_drc_sw()
283 return -EINVAL; in wm8994_put_drc_sw()
291 struct wm8994_pdata *pdata = wm8994->pdata; in wm8994_set_drc()
293 int cfg = wm8994->drc_cfg[drc]; in wm8994_set_drc()
303 pdata->drc_cfgs[cfg].regs[i]); in wm8994_set_drc()
319 return -EINVAL; in wm8994_get_drc()
327 struct wm8994_pdata *pdata = wm8994->pdata; in wm8994_put_drc_enum()
328 int drc = wm8994_get_drc(kcontrol->id.name); in wm8994_put_drc_enum()
329 int value = ucontrol->value.integer.value[0]; in wm8994_put_drc_enum()
334 if (value >= pdata->num_drc_cfgs) in wm8994_put_drc_enum()
335 return -EINVAL; in wm8994_put_drc_enum()
337 wm8994->drc_cfg[drc] = value; in wm8994_put_drc_enum()
349 int drc = wm8994_get_drc(kcontrol->id.name); in wm8994_get_drc_enum()
351 ucontrol->value.enumerated.item[0] = wm8994->drc_cfg[drc]; in wm8994_get_drc_enum()
359 struct wm8994_pdata *pdata = wm8994->pdata; in wm8994_set_retune_mobile()
363 if (!pdata || !wm8994->num_retune_mobile_texts) in wm8994_set_retune_mobile()
379 * with the nearest sample rate. */ in wm8994_set_retune_mobile()
380 cfg = wm8994->retune_mobile_cfg[block]; in wm8994_set_retune_mobile()
383 for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { in wm8994_set_retune_mobile()
384 if (strcmp(pdata->retune_mobile_cfgs[i].name, in wm8994_set_retune_mobile()
385 wm8994->retune_mobile_texts[cfg]) == 0 && in wm8994_set_retune_mobile()
386 abs(pdata->retune_mobile_cfgs[i].rate in wm8994_set_retune_mobile()
387 - wm8994->dac_rates[iface]) < best_val) { in wm8994_set_retune_mobile()
389 best_val = abs(pdata->retune_mobile_cfgs[i].rate in wm8994_set_retune_mobile()
390 - wm8994->dac_rates[iface]); in wm8994_set_retune_mobile()
394 dev_dbg(codec->dev, "ReTune Mobile %d %s/%dHz for %dHz sample rate\n", in wm8994_set_retune_mobile()
396 pdata->retune_mobile_cfgs[best].name, in wm8994_set_retune_mobile()
397 pdata->retune_mobile_cfgs[best].rate, in wm8994_set_retune_mobile()
398 wm8994->dac_rates[iface]); in wm8994_set_retune_mobile()
408 pdata->retune_mobile_cfgs[best].regs[i]); in wm8994_set_retune_mobile()
422 return -EINVAL; in wm8994_get_retune_mobile_block()
430 struct wm8994_pdata *pdata = wm8994->pdata; in wm8994_put_retune_mobile_enum()
431 int block = wm8994_get_retune_mobile_block(kcontrol->id.name); in wm8994_put_retune_mobile_enum()
432 int value = ucontrol->value.integer.value[0]; in wm8994_put_retune_mobile_enum()
437 if (value >= pdata->num_retune_mobile_cfgs) in wm8994_put_retune_mobile_enum()
438 return -EINVAL; in wm8994_put_retune_mobile_enum()
440 wm8994->retune_mobile_cfg[block] = value; in wm8994_put_retune_mobile_enum()
452 int block = wm8994_get_retune_mobile_block(kcontrol->id.name); in wm8994_get_retune_mobile_enum()
454 ucontrol->value.enumerated.item[0] = wm8994->retune_mobile_cfg[block]; in wm8994_get_retune_mobile_enum()
689 if (wm8994->active_refcount) in wm1811_jackdet_set_mode()
703 mutex_lock(&wm8994->accdet_lock); in active_reference()
705 wm8994->active_refcount++; in active_reference()
707 dev_dbg(codec->dev, "Active refcount incremented, now %d\n", in active_reference()
708 wm8994->active_refcount); in active_reference()
710 if (wm8994->active_refcount == 1) { in active_reference()
712 if (wm8994->jackdet && wm8994->jack_cb) { in active_reference()
720 mutex_unlock(&wm8994->accdet_lock); in active_reference()
728 mutex_lock(&wm8994->accdet_lock); in active_dereference()
730 wm8994->active_refcount--; in active_dereference()
732 dev_dbg(codec->dev, "Active refcount decremented, now %d\n", in active_dereference()
733 wm8994->active_refcount); in active_dereference()
735 if (wm8994->active_refcount == 0) { in active_dereference()
737 if (wm8994->jackdet && wm8994->jack_cb) { in active_dereference()
738 if (wm8994->jack_mic || wm8994->mic_detecting) in active_dereference()
749 mutex_unlock(&wm8994->accdet_lock); in active_dereference()
755 struct snd_soc_codec *codec = w->codec; in clk_sys_event()
773 pm_runtime_get_sync(codec->dev); in vmid_reference()
775 wm8994->vmid_refcount++; in vmid_reference()
777 dev_dbg(codec->dev, "Referencing VMID, refcount is now %d\n", in vmid_reference()
778 wm8994->vmid_refcount); in vmid_reference()
780 if (wm8994->vmid_refcount == 1) { in vmid_reference()
809 wm8994->vmid_refcount--; in vmid_dereference()
811 dev_dbg(codec->dev, "Dereferencing VMID, refcount is now %d\n", in vmid_dereference()
812 wm8994->vmid_refcount); in vmid_dereference()
814 if (wm8994->vmid_refcount == 0) { in vmid_dereference()
848 pm_runtime_put(codec->dev); in vmid_dereference()
854 struct snd_soc_codec *codec = w->codec; in vmid_event()
876 /* Only support direct DAC->headphone paths */ in wm8994_update_class_w()
879 dev_vdbg(codec->dev, "HPL connected to output mixer\n"); in wm8994_update_class_w()
885 dev_vdbg(codec->dev, "HPR connected to output mixer\n"); in wm8994_update_class_w()
893 dev_vdbg(codec->dev, "Class W source AIF2DAC\n"); in wm8994_update_class_w()
897 dev_vdbg(codec->dev, "Class W source AIF1DAC2\n"); in wm8994_update_class_w()
901 dev_vdbg(codec->dev, "Class W source AIF1DAC1\n"); in wm8994_update_class_w()
905 dev_vdbg(codec->dev, "DAC mixer setting: %x\n", reg); in wm8994_update_class_w()
912 dev_vdbg(codec->dev, "Left and right DAC mixers different\n"); in wm8994_update_class_w()
917 dev_dbg(codec->dev, "Class W enabled\n"); in wm8994_update_class_w()
922 wm8994->hubs.class_w = true; in wm8994_update_class_w()
925 dev_dbg(codec->dev, "Class W disabled\n"); in wm8994_update_class_w()
928 wm8994->hubs.class_w = false; in wm8994_update_class_w()
935 struct snd_soc_codec *codec = w->codec; in late_enable_ev()
940 if (wm8994->aif1clk_enable) { in late_enable_ev()
944 wm8994->aif1clk_enable = 0; in late_enable_ev()
946 if (wm8994->aif2clk_enable) { in late_enable_ev()
950 wm8994->aif2clk_enable = 0; in late_enable_ev()
964 struct snd_soc_codec *codec = w->codec; in late_disable_ev()
969 if (wm8994->aif1clk_disable) { in late_disable_ev()
972 wm8994->aif1clk_disable = 0; in late_disable_ev()
974 if (wm8994->aif2clk_disable) { in late_disable_ev()
977 wm8994->aif2clk_disable = 0; in late_disable_ev()
988 struct snd_soc_codec *codec = w->codec; in aif1clk_ev()
993 wm8994->aif1clk_enable = 1; in aif1clk_ev()
996 wm8994->aif1clk_disable = 1; in aif1clk_ev()
1006 struct snd_soc_codec *codec = w->codec; in aif2clk_ev()
1011 wm8994->aif2clk_enable = 1; in aif2clk_ev()
1014 wm8994->aif2clk_disable = 1; in aif2clk_ev()
1038 struct snd_soc_codec *codec = w->codec; in dac_ev()
1039 unsigned int mask = 1 << w->shift; in dac_ev()
1062 struct snd_soc_dapm_widget *w = wlist->widgets[0]; in wm8994_put_hp_enum()
1063 struct snd_soc_codec *codec = w->codec; in wm8994_put_hp_enum()
1087 "DMIC",
1119 struct snd_soc_codec *codec = w->codec; in post_ev()
1120 dev_dbg(codec->dev, "SRC status: %x\n", in post_ev()
1127 SOC_DAPM_SINGLE("ADC/DMIC Switch", WM8994_AIF1_ADC1_LEFT_MIXER_ROUTING,
1134 SOC_DAPM_SINGLE("ADC/DMIC Switch", WM8994_AIF1_ADC1_RIGHT_MIXER_ROUTING,
1141 SOC_DAPM_SINGLE("DMIC Switch", WM8994_AIF1_ADC2_LEFT_MIXER_ROUTING,
1148 SOC_DAPM_SINGLE("DMIC Switch", WM8994_AIF1_ADC2_RIGHT_MIXER_ROUTING,
1190 struct snd_soc_dapm_widget *w = wlist->widgets[0]; in wm8994_put_class_w()
1191 struct snd_soc_codec *codec = w->codec; in wm8994_put_class_w()
1564 { "ADCL Mux", "DMIC", "DMIC1L" },
1566 { "ADCR Mux", "DMIC", "DMIC1R" },
1589 { "AIF1ADC1L Mixer", "ADC/DMIC Switch", "ADCL Mux" },
1593 { "AIF1ADC1R Mixer", "ADC/DMIC Switch", "ADCR Mux" },
1597 { "AIF1ADC2L Mixer", "DMIC Switch", "DMIC2L" },
1601 { "AIF1ADC2R Mixer", "DMIC Switch", "DMIC2R" },
1755 fll->clk_ref_div = 0; in wm8994_get_fll_config()
1757 fll->clk_ref_div++; in wm8994_get_fll_config()
1760 if (fll->clk_ref_div > 3) in wm8994_get_fll_config()
1761 return -EINVAL; in wm8994_get_fll_config()
1763 pr_debug("CLK_REF_DIV=%d, Fref=%dHz\n", fll->clk_ref_div, freq_in); in wm8994_get_fll_config()
1766 fll->outdiv = 3; in wm8994_get_fll_config()
1767 while (freq_out * (fll->outdiv + 1) < 90000000) { in wm8994_get_fll_config()
1768 fll->outdiv++; in wm8994_get_fll_config()
1769 if (fll->outdiv > 63) in wm8994_get_fll_config()
1770 return -EINVAL; in wm8994_get_fll_config()
1772 freq_out *= fll->outdiv + 1; in wm8994_get_fll_config()
1773 pr_debug("OUTDIV=%d, Fvco=%dHz\n", fll->outdiv, freq_out); in wm8994_get_fll_config()
1776 fll->fll_fratio = 0; in wm8994_get_fll_config()
1778 fll->fll_fratio = 1; in wm8994_get_fll_config()
1781 fll->fll_fratio = 2; in wm8994_get_fll_config()
1784 fll->fll_fratio = 3; in wm8994_get_fll_config()
1787 fll->fll_fratio = 4; in wm8994_get_fll_config()
1790 pr_debug("FLL_FRATIO=%d, Fref=%dHz\n", fll->fll_fratio, freq_in); in wm8994_get_fll_config()
1795 fll->n = Ndiv; in wm8994_get_fll_config()
1799 /* Calculate fractional part - scale up so we can round. */ in wm8994_get_fll_config()
1810 fll->k = K / 10; in wm8994_get_fll_config()
1812 pr_debug("N=%x K=%x\n", fll->n, fll->k); in wm8994_get_fll_config()
1821 struct wm8994 *control = wm8994->wm8994; in _wm8994_set_fll()
1844 return -EINVAL; in _wm8994_set_fll()
1854 return -EINVAL; in _wm8994_set_fll()
1855 src = wm8994->fll[id].src; in _wm8994_set_fll()
1863 return -EINVAL; in _wm8994_set_fll()
1867 if (wm8994->fll[id].src == src && in _wm8994_set_fll()
1868 wm8994->fll[id].in == freq_in && wm8994->fll[id].out == freq_out) in _wm8994_set_fll()
1871 /* If we're stopping the FLL redo the old config - no in _wm8994_set_fll()
1878 ret = wm8994_get_fll_config(&fll, wm8994->fll[id].in, in _wm8994_set_fll()
1879 wm8994->fll[id].out); in _wm8994_set_fll()
1909 (src - 1)); in _wm8994_set_fll()
1912 try_wait_for_completion(&wm8994->fll_locked[id]); in _wm8994_set_fll()
1920 switch (control->type) { in _wm8994_set_fll()
1925 if (wm8994->revision < 1) in _wm8994_set_fll()
1941 if (wm8994->fll_locked_irq) { in _wm8994_set_fll()
1942 timeout = wait_for_completion_timeout(&wm8994->fll_locked[id], in _wm8994_set_fll()
1945 dev_warn(codec->dev, in _wm8994_set_fll()
1952 switch (control->type) { in _wm8994_set_fll()
1957 if (wm8994->revision < 1) in _wm8994_set_fll()
1968 wm8994->fll[id].in = freq_in; in _wm8994_set_fll()
1969 wm8994->fll[id].out = freq_out; in _wm8994_set_fll()
1970 wm8994->fll[id].src = src; in _wm8994_set_fll()
1997 return _wm8994_set_fll(dai->codec, id, src, freq_in, freq_out); in wm8994_set_fll()
2003 struct snd_soc_codec *codec = dai->codec; in wm8994_set_dai_sysclk()
2007 switch (dai->id) { in wm8994_set_dai_sysclk()
2014 return -EINVAL; in wm8994_set_dai_sysclk()
2019 wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_MCLK1; in wm8994_set_dai_sysclk()
2020 wm8994->mclk[0] = freq; in wm8994_set_dai_sysclk()
2021 dev_dbg(dai->dev, "AIF%d using MCLK1 at %uHz\n", in wm8994_set_dai_sysclk()
2022 dai->id, freq); in wm8994_set_dai_sysclk()
2027 wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_MCLK2; in wm8994_set_dai_sysclk()
2028 wm8994->mclk[1] = freq; in wm8994_set_dai_sysclk()
2029 dev_dbg(dai->dev, "AIF%d using MCLK2 at %uHz\n", in wm8994_set_dai_sysclk()
2030 dai->id, freq); in wm8994_set_dai_sysclk()
2034 wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_FLL1; in wm8994_set_dai_sysclk()
2035 dev_dbg(dai->dev, "AIF%d using FLL1\n", dai->id); in wm8994_set_dai_sysclk()
2039 wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_FLL2; in wm8994_set_dai_sysclk()
2040 dev_dbg(dai->dev, "AIF%d using FLL2\n", dai->id); in wm8994_set_dai_sysclk()
2044 /* Special case - a division (times 10) is given and in wm8994_set_dai_sysclk()
2052 return -EINVAL; in wm8994_set_dai_sysclk()
2063 return -EINVAL; in wm8994_set_dai_sysclk()
2075 struct wm8994 *control = wm8994->wm8994; in wm8994_set_bias_level()
2083 switch (control->type) { in wm8994_set_bias_level()
2095 if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) in wm8994_set_bias_level()
2100 if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { in wm8994_set_bias_level()
2101 switch (control->type) { in wm8994_set_bias_level()
2103 if (wm8994->revision < 4) { in wm8994_set_bias_level()
2115 if (wm8994->revision == 0) { in wm8994_set_bias_level()
2130 if (wm8994->revision < 2) { in wm8994_set_bias_level()
2147 if (codec->dapm.bias_level == SND_SOC_BIAS_PREPARE) in wm8994_set_bias_level()
2151 switch (control->type) { in wm8994_set_bias_level()
2167 if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) in wm8994_set_bias_level()
2168 wm8994->cur_fw = NULL; in wm8994_set_bias_level()
2171 codec->dapm.bias_level = level; in wm8994_set_bias_level()
2178 struct snd_soc_codec *codec = dai->codec; in wm8994_set_dai_fmt()
2180 struct wm8994 *control = wm8994->wm8994; in wm8994_set_dai_fmt()
2186 switch (dai->id) { in wm8994_set_dai_fmt()
2196 return -EINVAL; in wm8994_set_dai_fmt()
2206 return -EINVAL; in wm8994_set_dai_fmt()
2224 return -EINVAL; in wm8994_set_dai_fmt()
2238 return -EINVAL; in wm8994_set_dai_fmt()
2258 return -EINVAL; in wm8994_set_dai_fmt()
2262 return -EINVAL; in wm8994_set_dai_fmt()
2267 switch (control->type) { in wm8994_set_dai_fmt()
2270 if (dai->id == 2) in wm8994_set_dai_fmt()
2291 int val, rate; member
2319 struct snd_soc_codec *codec = dai->codec; in wm8994_hw_params()
2331 int id = dai->id - 1; in wm8994_hw_params()
2335 switch (dai->id) { in wm8994_hw_params()
2341 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || in wm8994_hw_params()
2342 wm8994->lrclk_shared[0]) { in wm8994_hw_params()
2346 dev_dbg(codec->dev, "AIF1 using split LRCLK\n"); in wm8994_hw_params()
2354 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || in wm8994_hw_params()
2355 wm8994->lrclk_shared[1]) { in wm8994_hw_params()
2359 dev_dbg(codec->dev, "AIF2 using split LRCLK\n"); in wm8994_hw_params()
2363 return -EINVAL; in wm8994_hw_params()
2384 return -EINVAL; in wm8994_hw_params()
2387 /* Try to find an appropriate sample rate; look for an exact match. */ in wm8994_hw_params()
2389 if (srs[i].rate == params_rate(params)) in wm8994_hw_params()
2392 return -EINVAL; in wm8994_hw_params()
2395 dev_dbg(dai->dev, "Sample rate is %dHz\n", srs[i].rate); in wm8994_hw_params()
2396 dev_dbg(dai->dev, "AIF%dCLK is %dHz, target BCLK %dHz\n", in wm8994_hw_params()
2397 dai->id, wm8994->aifclk[id], bclk_rate); in wm8994_hw_params()
2403 if (wm8994->aifclk[id] == 0) { in wm8994_hw_params()
2404 dev_err(dai->dev, "AIF%dCLK not configured\n", dai->id); in wm8994_hw_params()
2405 return -EINVAL; in wm8994_hw_params()
2411 - wm8994->aifclk[id]); in wm8994_hw_params()
2414 - wm8994->aifclk[id]); in wm8994_hw_params()
2420 dev_dbg(dai->dev, "Selected AIF%dCLK/fs = %d\n", in wm8994_hw_params()
2421 dai->id, fs_ratios[best]); in wm8994_hw_params()
2431 cur_val = (wm8994->aifclk[id] * 10 / bclk_divs[i]) - bclk_rate; in wm8994_hw_params()
2436 bclk_rate = wm8994->aifclk[id] * 10 / bclk_divs[best]; in wm8994_hw_params()
2437 dev_dbg(dai->dev, "Using BCLK_DIV %d for actual BCLK %dHz\n", in wm8994_hw_params()
2443 dev_err(dai->dev, "Unable to generate LRCLK from %dHz BCLK\n", in wm8994_hw_params()
2445 return -EINVAL; in wm8994_hw_params()
2447 dev_dbg(dai->dev, "Using LRCLK rate %d for actual LRCLK %dHz\n", in wm8994_hw_params()
2458 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { in wm8994_hw_params()
2459 switch (dai->id) { in wm8994_hw_params()
2461 wm8994->dac_rates[0] = params_rate(params); in wm8994_hw_params()
2466 wm8994->dac_rates[1] = params_rate(params); in wm8994_hw_params()
2479 struct snd_soc_codec *codec = dai->codec; in wm8994_aif3_hw_params()
2481 struct wm8994 *control = wm8994->wm8994; in wm8994_aif3_hw_params()
2485 switch (dai->id) { in wm8994_aif3_hw_params()
2487 switch (control->type) { in wm8994_aif3_hw_params()
2512 return -EINVAL; in wm8994_aif3_hw_params()
2521 struct snd_soc_codec *codec = dai->codec; in wm8994_aif_shutdown()
2524 switch (dai->id) { in wm8994_aif_shutdown()
2536 * lowest output rate to save a little power if the clock is in wm8994_aif_shutdown()
2539 if (rate_reg && !dai->playback_active && !dai->capture_active) in wm8994_aif_shutdown()
2547 struct snd_soc_codec *codec = codec_dai->codec; in wm8994_aif_mute()
2551 switch (codec_dai->id) { in wm8994_aif_mute()
2559 return -EINVAL; in wm8994_aif_mute()
2574 struct snd_soc_codec *codec = codec_dai->codec; in wm8994_set_tristate()
2577 switch (codec_dai->id) { in wm8994_set_tristate()
2591 return -EINVAL; in wm8994_set_tristate()
2604 struct snd_soc_codec *codec = dai->codec; in wm8994_aif2_probe()
2649 .name = "wm8994-aif1",
2668 .name = "wm8994-aif2",
2688 .name = "wm8994-aif3",
2712 struct wm8994 *control = wm8994->wm8994; in wm8994_suspend()
2715 switch (control->type) { in wm8994_suspend()
2729 for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { in wm8994_suspend()
2730 memcpy(&wm8994->fll_suspend[i], &wm8994->fll[i], in wm8994_suspend()
2734 dev_warn(codec->dev, "Failed to stop FLL%d: %d\n", in wm8994_suspend()
2746 struct wm8994 *control = wm8994->wm8994; in wm8994_resume()
2750 if (wm8994->revision < 4) { in wm8994_resume()
2752 ret = regmap_read(control->regmap, in wm8994_resume()
2756 codec->cache_only = 1; in wm8994_resume()
2762 codec->cache_only = 0; in wm8994_resume()
2767 for (i = 0; i < ARRAY_SIZE(wm8994->fll); i++) { in wm8994_resume()
2768 if (!wm8994->fll_suspend[i].out) in wm8994_resume()
2772 wm8994->fll_suspend[i].src, in wm8994_resume()
2773 wm8994->fll_suspend[i].in, in wm8994_resume()
2774 wm8994->fll_suspend[i].out); in wm8994_resume()
2776 dev_warn(codec->dev, "Failed to restore FLL%d: %d\n", in wm8994_resume()
2780 switch (control->type) { in wm8994_resume()
2782 if (wm8994->micdet[0].jack || wm8994->micdet[1].jack) in wm8994_resume()
2787 if (wm8994->jackdet && wm8994->jack_cb) { in wm8994_resume()
2795 if (wm8994->jack_cb) in wm8994_resume()
2810 struct snd_soc_codec *codec = wm8994->codec; in wm8994_handle_retune_mobile_pdata()
2811 struct wm8994_pdata *pdata = wm8994->pdata; in wm8994_handle_retune_mobile_pdata()
2814 wm8994->retune_mobile_enum, in wm8994_handle_retune_mobile_pdata()
2818 wm8994->retune_mobile_enum, in wm8994_handle_retune_mobile_pdata()
2822 wm8994->retune_mobile_enum, in wm8994_handle_retune_mobile_pdata()
2831 * configurations due to the sample rate dependency of the in wm8994_handle_retune_mobile_pdata()
2833 wm8994->num_retune_mobile_texts = 0; in wm8994_handle_retune_mobile_pdata()
2834 wm8994->retune_mobile_texts = NULL; in wm8994_handle_retune_mobile_pdata()
2835 for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { in wm8994_handle_retune_mobile_pdata()
2836 for (j = 0; j < wm8994->num_retune_mobile_texts; j++) { in wm8994_handle_retune_mobile_pdata()
2837 if (strcmp(pdata->retune_mobile_cfgs[i].name, in wm8994_handle_retune_mobile_pdata()
2838 wm8994->retune_mobile_texts[j]) == 0) in wm8994_handle_retune_mobile_pdata()
2842 if (j != wm8994->num_retune_mobile_texts) in wm8994_handle_retune_mobile_pdata()
2846 t = krealloc(wm8994->retune_mobile_texts, in wm8994_handle_retune_mobile_pdata()
2848 (wm8994->num_retune_mobile_texts + 1), in wm8994_handle_retune_mobile_pdata()
2854 t[wm8994->num_retune_mobile_texts] = in wm8994_handle_retune_mobile_pdata()
2855 pdata->retune_mobile_cfgs[i].name; in wm8994_handle_retune_mobile_pdata()
2858 wm8994->num_retune_mobile_texts++; in wm8994_handle_retune_mobile_pdata()
2859 wm8994->retune_mobile_texts = t; in wm8994_handle_retune_mobile_pdata()
2862 dev_dbg(codec->dev, "Allocated %d unique ReTune Mobile names\n", in wm8994_handle_retune_mobile_pdata()
2863 wm8994->num_retune_mobile_texts); in wm8994_handle_retune_mobile_pdata()
2865 wm8994->retune_mobile_enum.max = wm8994->num_retune_mobile_texts; in wm8994_handle_retune_mobile_pdata()
2866 wm8994->retune_mobile_enum.texts = wm8994->retune_mobile_texts; in wm8994_handle_retune_mobile_pdata()
2868 ret = snd_soc_add_controls(wm8994->codec, controls, in wm8994_handle_retune_mobile_pdata()
2871 dev_err(wm8994->codec->dev, in wm8994_handle_retune_mobile_pdata()
2877 struct snd_soc_codec *codec = wm8994->codec; in wm8994_handle_pdata()
2878 struct wm8994_pdata *pdata = wm8994->pdata; in wm8994_handle_pdata()
2884 wm_hubs_handle_analogue_pdata(codec, pdata->lineout1_diff, in wm8994_handle_pdata()
2885 pdata->lineout2_diff, in wm8994_handle_pdata()
2886 pdata->lineout1fb, in wm8994_handle_pdata()
2887 pdata->lineout2fb, in wm8994_handle_pdata()
2888 pdata->jd_scthr, in wm8994_handle_pdata()
2889 pdata->jd_thr, in wm8994_handle_pdata()
2890 pdata->micbias1_lvl, in wm8994_handle_pdata()
2891 pdata->micbias2_lvl); in wm8994_handle_pdata()
2893 dev_dbg(codec->dev, "%d DRC configurations\n", pdata->num_drc_cfgs); in wm8994_handle_pdata()
2895 if (pdata->num_drc_cfgs) { in wm8994_handle_pdata()
2897 SOC_ENUM_EXT("AIF1DRC1 Mode", wm8994->drc_enum, in wm8994_handle_pdata()
2899 SOC_ENUM_EXT("AIF1DRC2 Mode", wm8994->drc_enum, in wm8994_handle_pdata()
2901 SOC_ENUM_EXT("AIF2DRC Mode", wm8994->drc_enum, in wm8994_handle_pdata()
2906 wm8994->drc_texts = devm_kzalloc(wm8994->codec->dev, in wm8994_handle_pdata()
2907 sizeof(char *) * pdata->num_drc_cfgs, GFP_KERNEL); in wm8994_handle_pdata()
2908 if (!wm8994->drc_texts) { in wm8994_handle_pdata()
2909 dev_err(wm8994->codec->dev, in wm8994_handle_pdata()
2911 pdata->num_drc_cfgs); in wm8994_handle_pdata()
2915 for (i = 0; i < pdata->num_drc_cfgs; i++) in wm8994_handle_pdata()
2916 wm8994->drc_texts[i] = pdata->drc_cfgs[i].name; in wm8994_handle_pdata()
2918 wm8994->drc_enum.max = pdata->num_drc_cfgs; in wm8994_handle_pdata()
2919 wm8994->drc_enum.texts = wm8994->drc_texts; in wm8994_handle_pdata()
2921 ret = snd_soc_add_controls(wm8994->codec, controls, in wm8994_handle_pdata()
2924 dev_err(wm8994->codec->dev, in wm8994_handle_pdata()
2931 dev_dbg(codec->dev, "%d ReTune Mobile configurations\n", in wm8994_handle_pdata()
2932 pdata->num_retune_mobile_cfgs); in wm8994_handle_pdata()
2934 if (pdata->num_retune_mobile_cfgs) in wm8994_handle_pdata()
2937 snd_soc_add_controls(wm8994->codec, wm8994_eq_controls, in wm8994_handle_pdata()
2940 for (i = 0; i < ARRAY_SIZE(pdata->micbias); i++) { in wm8994_handle_pdata()
2941 if (pdata->micbias[i]) { in wm8994_handle_pdata()
2943 pdata->micbias[i] & 0xffff); in wm8994_handle_pdata()
2949 * wm8994_mic_detect - Enable microphone detection via the WM8994 IRQ
2970 struct wm8994 *control = wm8994->wm8994; in wm8994_mic_detect()
2973 if (control->type != WM8994) in wm8994_mic_detect()
2974 return -EINVAL; in wm8994_mic_detect()
2978 micdet = &wm8994->micdet[0]; in wm8994_mic_detect()
2981 micdet = &wm8994->micdet[1]; in wm8994_mic_detect()
2984 return -EINVAL; in wm8994_mic_detect()
2987 dev_dbg(codec->dev, "Configuring microphone detection on %d: %x %x\n", in wm8994_mic_detect()
2991 micdet->jack = jack; in wm8994_mic_detect()
2992 micdet->det = det; in wm8994_mic_detect()
2993 micdet->shrt = shrt; in wm8994_mic_detect()
2996 if (wm8994->micdet[0].jack || wm8994->micdet[1].jack) in wm8994_mic_detect()
3010 struct snd_soc_codec *codec = priv->codec; in wm8994_mic_irq()
3015 trace_snd_soc_jack_irq(dev_name(codec->dev)); in wm8994_mic_irq()
3020 dev_err(codec->dev, "Failed to read microphone status: %d\n", in wm8994_mic_irq()
3025 dev_dbg(codec->dev, "Microphone status: %x\n", reg); in wm8994_mic_irq()
3029 report |= priv->micdet[0].det; in wm8994_mic_irq()
3031 report |= priv->micdet[0].shrt; in wm8994_mic_irq()
3032 snd_soc_jack_report(priv->micdet[0].jack, report, in wm8994_mic_irq()
3033 priv->micdet[0].det | priv->micdet[0].shrt); in wm8994_mic_irq()
3037 report |= priv->micdet[1].det; in wm8994_mic_irq()
3039 report |= priv->micdet[1].shrt; in wm8994_mic_irq()
3040 snd_soc_jack_report(priv->micdet[1].jack, report, in wm8994_mic_irq()
3041 priv->micdet[1].det | priv->micdet[1].shrt); in wm8994_mic_irq()
3046 /* Default microphone detection handler for WM8958 - the user can
3055 dev_dbg(codec->dev, "MICDET %x\n", status); in wm8958_default_micdet()
3059 if (!wm8994->jackdet) { in wm8958_default_micdet()
3061 dev_dbg(codec->dev, "Detected open circuit\n"); in wm8958_default_micdet()
3062 wm8994->jack_mic = false; in wm8958_default_micdet()
3063 wm8994->mic_detecting = true; in wm8958_default_micdet()
3067 snd_soc_jack_report(wm8994->micdet[0].jack, 0, in wm8958_default_micdet()
3068 wm8994->btn_mask | in wm8958_default_micdet()
3077 if (wm8994->mic_detecting && (status & 0x600)) { in wm8958_default_micdet()
3078 dev_dbg(codec->dev, "Detected microphone\n"); in wm8958_default_micdet()
3080 wm8994->mic_detecting = false; in wm8958_default_micdet()
3081 wm8994->jack_mic = true; in wm8958_default_micdet()
3085 snd_soc_jack_report(wm8994->micdet[0].jack, SND_JACK_HEADSET, in wm8958_default_micdet()
3090 if (wm8994->mic_detecting && status & 0x4) { in wm8958_default_micdet()
3091 dev_dbg(codec->dev, "Detected headphone\n"); in wm8958_default_micdet()
3092 wm8994->mic_detecting = false; in wm8958_default_micdet()
3096 snd_soc_jack_report(wm8994->micdet[0].jack, SND_JACK_HEADPHONE, in wm8958_default_micdet()
3100 if (wm8994->jackdet) { in wm8958_default_micdet()
3110 if (wm8994->jack_mic) { in wm8958_default_micdet()
3130 snd_soc_jack_report(wm8994->micdet[0].jack, report, in wm8958_default_micdet()
3131 wm8994->btn_mask); in wm8958_default_micdet()
3138 struct snd_soc_codec *codec = wm8994->codec; in wm1811_jackdet_irq()
3141 mutex_lock(&wm8994->accdet_lock); in wm1811_jackdet_irq()
3145 dev_err(codec->dev, "Failed to read jack status: %d\n", reg); in wm1811_jackdet_irq()
3146 mutex_unlock(&wm8994->accdet_lock); in wm1811_jackdet_irq()
3150 dev_dbg(codec->dev, "JACKDET %x\n", reg); in wm1811_jackdet_irq()
3153 dev_dbg(codec->dev, "Jack detected\n"); in wm1811_jackdet_irq()
3155 snd_soc_jack_report(wm8994->micdet[0].jack, in wm1811_jackdet_irq()
3162 wm8994->mic_detecting = true; in wm1811_jackdet_irq()
3167 dev_dbg(codec->dev, "Jack not detected\n"); in wm1811_jackdet_irq()
3169 snd_soc_jack_report(wm8994->micdet[0].jack, 0, in wm1811_jackdet_irq()
3171 wm8994->btn_mask); in wm1811_jackdet_irq()
3173 wm8994->mic_detecting = false; in wm1811_jackdet_irq()
3174 wm8994->jack_mic = false; in wm1811_jackdet_irq()
3180 mutex_unlock(&wm8994->accdet_lock); in wm1811_jackdet_irq()
3186 * wm8958_mic_detect - Enable microphone detection via the WM8958 IRQ
3205 struct wm8994 *control = wm8994->wm8994; in wm8958_mic_detect()
3208 switch (control->type) { in wm8958_mic_detect()
3213 return -EINVAL; in wm8958_mic_detect()
3218 dev_dbg(codec->dev, "Using default micdet callback\n"); in wm8958_mic_detect()
3223 snd_soc_dapm_force_enable_pin(&codec->dapm, "CLK_SYS"); in wm8958_mic_detect()
3225 wm8994->micdet[0].jack = jack; in wm8958_mic_detect()
3226 wm8994->jack_cb = cb; in wm8958_mic_detect()
3227 wm8994->jack_cb_data = cb_data; in wm8958_mic_detect()
3229 wm8994->mic_detecting = true; in wm8958_mic_detect()
3230 wm8994->jack_mic = false; in wm8958_mic_detect()
3235 if (wm8994->pdata->micd_lvl_sel) in wm8958_mic_detect()
3236 micd_lvl_sel = wm8994->pdata->micd_lvl_sel; in wm8958_mic_detect()
3240 wm8994->btn_mask = SND_JACK_BTN_0 | SND_JACK_BTN_1 | in wm8958_mic_detect()
3247 WARN_ON(codec->dapm.bias_level > SND_SOC_BIAS_STANDBY); in wm8958_mic_detect()
3253 if (wm8994->jackdet) { in wm8958_mic_detect()
3266 snd_soc_dapm_disable_pin(&codec->dapm, "CLK_SYS"); in wm8958_mic_detect()
3276 struct snd_soc_codec *codec = wm8994->codec; in wm8958_mic_irq()
3279 mutex_lock(&wm8994->accdet_lock); in wm8958_mic_irq()
3287 mutex_unlock(&wm8994->accdet_lock); in wm8958_mic_irq()
3292 * range being provided - if that happens loop again. in wm8958_mic_irq()
3298 mutex_unlock(&wm8994->accdet_lock); in wm8958_mic_irq()
3299 dev_err(codec->dev, in wm8958_mic_irq()
3306 dev_dbg(codec->dev, "Mic detect data not valid\n"); in wm8958_mic_irq()
3314 } while (count--); in wm8958_mic_irq()
3317 dev_warn(codec->dev, "No impedence range reported for jack\n"); in wm8958_mic_irq()
3320 trace_snd_soc_jack_irq(dev_name(codec->dev)); in wm8958_mic_irq()
3323 if (wm8994->jack_cb) in wm8958_mic_irq()
3324 wm8994->jack_cb(reg, wm8994->jack_cb_data); in wm8958_mic_irq()
3326 dev_warn(codec->dev, "Accessory detection with no callback\n"); in wm8958_mic_irq()
3329 mutex_unlock(&wm8994->accdet_lock); in wm8958_mic_irq()
3338 dev_err(codec->dev, "FIFO error\n"); in wm8994_fifo_error()
3347 dev_err(codec->dev, "Thermal warning\n"); in wm8994_temp_warn()
3356 dev_crit(codec->dev, "Thermal shutdown\n"); in wm8994_temp_shut()
3363 struct wm8994 *control = dev_get_drvdata(codec->dev->parent); in wm8994_codec_probe()
3365 struct snd_soc_dapm_context *dapm = &codec->dapm; in wm8994_codec_probe()
3369 codec->control_data = control->regmap; in wm8994_codec_probe()
3371 wm8994 = devm_kzalloc(codec->dev, sizeof(struct wm8994_priv), in wm8994_codec_probe()
3374 return -ENOMEM; in wm8994_codec_probe()
3379 wm8994->wm8994 = dev_get_drvdata(codec->dev->parent); in wm8994_codec_probe()
3380 wm8994->pdata = dev_get_platdata(codec->dev->parent); in wm8994_codec_probe()
3381 wm8994->codec = codec; in wm8994_codec_probe()
3383 mutex_init(&wm8994->accdet_lock); in wm8994_codec_probe()
3385 for (i = 0; i < ARRAY_SIZE(wm8994->fll_locked); i++) in wm8994_codec_probe()
3386 init_completion(&wm8994->fll_locked[i]); in wm8994_codec_probe()
3388 if (wm8994->pdata && wm8994->pdata->micdet_irq) in wm8994_codec_probe()
3389 wm8994->micdet_irq = wm8994->pdata->micdet_irq; in wm8994_codec_probe()
3390 else if (wm8994->pdata && wm8994->pdata->irq_base) in wm8994_codec_probe()
3391 wm8994->micdet_irq = wm8994->pdata->irq_base + in wm8994_codec_probe()
3394 pm_runtime_enable(codec->dev); in wm8994_codec_probe()
3395 pm_runtime_resume(codec->dev); in wm8994_codec_probe()
3397 /* Set revision-specific configuration */ in wm8994_codec_probe()
3398 wm8994->revision = snd_soc_read(codec, WM8994_CHIP_REVISION); in wm8994_codec_probe()
3399 switch (control->type) { in wm8994_codec_probe()
3401 switch (wm8994->revision) { in wm8994_codec_probe()
3404 wm8994->hubs.dcs_codes_l = -5; in wm8994_codec_probe()
3405 wm8994->hubs.dcs_codes_r = -5; in wm8994_codec_probe()
3406 wm8994->hubs.hp_startup_mode = 1; in wm8994_codec_probe()
3407 wm8994->hubs.dcs_readback_mode = 1; in wm8994_codec_probe()
3408 wm8994->hubs.series_startup = 1; in wm8994_codec_probe()
3411 wm8994->hubs.dcs_readback_mode = 2; in wm8994_codec_probe()
3417 wm8994->hubs.dcs_readback_mode = 1; in wm8994_codec_probe()
3421 wm8994->hubs.dcs_readback_mode = 2; in wm8994_codec_probe()
3422 wm8994->hubs.no_series_update = 1; in wm8994_codec_probe()
3424 switch (wm8994->revision) { in wm8994_codec_probe()
3429 wm8994->hubs.dcs_codes_l = -9; in wm8994_codec_probe()
3430 wm8994->hubs.dcs_codes_r = -5; in wm8994_codec_probe()
3444 wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_FIFOS_ERR, in wm8994_codec_probe()
3446 wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_TEMP_WARN, in wm8994_codec_probe()
3448 wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_TEMP_SHUT, in wm8994_codec_probe()
3451 ret = wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_DCS_DONE, in wm8994_codec_probe()
3453 &wm8994->hubs); in wm8994_codec_probe()
3455 wm8994->hubs.dcs_done_irq = true; in wm8994_codec_probe()
3457 switch (control->type) { in wm8994_codec_probe()
3459 if (wm8994->micdet_irq) { in wm8994_codec_probe()
3460 ret = request_threaded_irq(wm8994->micdet_irq, NULL, in wm8994_codec_probe()
3466 dev_warn(codec->dev, in wm8994_codec_probe()
3471 ret = wm8994_request_irq(wm8994->wm8994, in wm8994_codec_probe()
3476 dev_warn(codec->dev, in wm8994_codec_probe()
3480 ret = wm8994_request_irq(wm8994->wm8994, in wm8994_codec_probe()
3485 dev_warn(codec->dev, in wm8994_codec_probe()
3489 ret = wm8994_request_irq(wm8994->wm8994, in wm8994_codec_probe()
3494 dev_warn(codec->dev, in wm8994_codec_probe()
3501 if (wm8994->micdet_irq) { in wm8994_codec_probe()
3502 ret = request_threaded_irq(wm8994->micdet_irq, NULL, in wm8994_codec_probe()
3508 dev_warn(codec->dev, in wm8994_codec_probe()
3514 switch (control->type) { in wm8994_codec_probe()
3516 if (wm8994->revision > 1) { in wm8994_codec_probe()
3517 ret = wm8994_request_irq(wm8994->wm8994, in wm8994_codec_probe()
3522 wm8994->jackdet = true; in wm8994_codec_probe()
3529 wm8994->fll_locked_irq = true; in wm8994_codec_probe()
3530 for (i = 0; i < ARRAY_SIZE(wm8994->fll_locked); i++) { in wm8994_codec_probe()
3531 ret = wm8994_request_irq(wm8994->wm8994, in wm8994_codec_probe()
3534 &wm8994->fll_locked[i]); in wm8994_codec_probe()
3536 wm8994->fll_locked_irq = false; in wm8994_codec_probe()
3540 * configured on init - if a system wants to do this dynamically in wm8994_codec_probe()
3543 ret = regmap_read(control->regmap, WM8994_GPIO_1, &reg); in wm8994_codec_probe()
3545 dev_err(codec->dev, "Failed to read GPIO1 state: %d\n", ret); in wm8994_codec_probe()
3549 wm8994->lrclk_shared[0] = 1; in wm8994_codec_probe()
3552 wm8994->lrclk_shared[0] = 0; in wm8994_codec_probe()
3555 ret = regmap_read(control->regmap, WM8994_GPIO_6, &reg); in wm8994_codec_probe()
3557 dev_err(codec->dev, "Failed to read GPIO6 state: %d\n", ret); in wm8994_codec_probe()
3561 wm8994->lrclk_shared[1] = 1; in wm8994_codec_probe()
3564 wm8994->lrclk_shared[1] = 0; in wm8994_codec_probe()
3617 switch (control->type) { in wm8994_codec_probe()
3628 switch (control->type) { in wm8994_codec_probe()
3650 switch (control->type) { in wm8994_codec_probe()
3654 if (wm8994->revision < 4) { in wm8994_codec_probe()
3675 if (wm8994->revision < 1) { in wm8994_codec_probe()
3710 switch (control->type) { in wm8994_codec_probe()
3715 if (wm8994->revision < 4) { in wm8994_codec_probe()
3726 if (wm8994->revision < 1) { in wm8994_codec_probe()
3751 if (wm8994->jackdet) in wm8994_codec_probe()
3752 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_GPIO(6), wm8994); in wm8994_codec_probe()
3753 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_MIC2_SHRT, wm8994); in wm8994_codec_probe()
3754 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_MIC2_DET, wm8994); in wm8994_codec_probe()
3755 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_MIC1_SHRT, wm8994); in wm8994_codec_probe()
3756 if (wm8994->micdet_irq) in wm8994_codec_probe()
3757 free_irq(wm8994->micdet_irq, wm8994); in wm8994_codec_probe()
3758 for (i = 0; i < ARRAY_SIZE(wm8994->fll_locked); i++) in wm8994_codec_probe()
3759 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_FLL1_LOCK + i, in wm8994_codec_probe()
3760 &wm8994->fll_locked[i]); in wm8994_codec_probe()
3761 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_DCS_DONE, in wm8994_codec_probe()
3762 &wm8994->hubs); in wm8994_codec_probe()
3763 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_FIFOS_ERR, codec); in wm8994_codec_probe()
3764 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_TEMP_SHUT, codec); in wm8994_codec_probe()
3765 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_TEMP_WARN, codec); in wm8994_codec_probe()
3773 struct wm8994 *control = wm8994->wm8994; in wm8994_codec_remove()
3778 pm_runtime_disable(codec->dev); in wm8994_codec_remove()
3780 for (i = 0; i < ARRAY_SIZE(wm8994->fll_locked); i++) in wm8994_codec_remove()
3781 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_FLL1_LOCK + i, in wm8994_codec_remove()
3782 &wm8994->fll_locked[i]); in wm8994_codec_remove()
3784 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_DCS_DONE, in wm8994_codec_remove()
3785 &wm8994->hubs); in wm8994_codec_remove()
3786 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_FIFOS_ERR, codec); in wm8994_codec_remove()
3787 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_TEMP_SHUT, codec); in wm8994_codec_remove()
3788 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_TEMP_WARN, codec); in wm8994_codec_remove()
3790 if (wm8994->jackdet) in wm8994_codec_remove()
3791 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_GPIO(6), wm8994); in wm8994_codec_remove()
3793 switch (control->type) { in wm8994_codec_remove()
3795 if (wm8994->micdet_irq) in wm8994_codec_remove()
3796 free_irq(wm8994->micdet_irq, wm8994); in wm8994_codec_remove()
3797 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_MIC2_DET, in wm8994_codec_remove()
3799 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_MIC1_SHRT, in wm8994_codec_remove()
3801 wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_MIC1_DET, in wm8994_codec_remove()
3807 if (wm8994->micdet_irq) in wm8994_codec_remove()
3808 free_irq(wm8994->micdet_irq, wm8994); in wm8994_codec_remove()
3811 if (wm8994->mbc) in wm8994_codec_remove()
3812 release_firmware(wm8994->mbc); in wm8994_codec_remove()
3813 if (wm8994->mbc_vss) in wm8994_codec_remove()
3814 release_firmware(wm8994->mbc_vss); in wm8994_codec_remove()
3815 if (wm8994->enh_eq) in wm8994_codec_remove()
3816 release_firmware(wm8994->enh_eq); in wm8994_codec_remove()
3817 kfree(wm8994->retune_mobile_texts); in wm8994_codec_remove()
3840 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8994, in wm8994_probe()
3846 snd_soc_unregister_codec(&pdev->dev); in wm8994_remove()
3852 .name = "wm8994-codec",
3864 MODULE_ALIAS("platform:wm8994-codec");