Lines Matching +full:codec +full:- +full:aif3
1 // SPDX-License-Identifier: GPL-2.0-only
3 * wm5110.c -- WM5110 ALSA SoC Audio driver
35 #define DRV_NAME "wm5110-codec"
161 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wm5110_sysclk_ev()
162 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in wm5110_sysclk_ev()
163 struct regmap *regmap = arizona->regmap; in wm5110_sysclk_ev()
167 switch (arizona->rev) { in wm5110_sysclk_ev()
198 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wm5110_adsp_power_ev()
199 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in wm5110_adsp_power_ev()
203 ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, &v); in wm5110_adsp_power_ev()
205 dev_err(component->dev, "Failed to read SYSCLK state: %d\n", ret); in wm5110_adsp_power_ev()
290 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wm5110_hp_pre_enable()
292 struct arizona *arizona = priv->arizona; in wm5110_hp_pre_enable()
297 switch (w->shift) { in wm5110_hp_pre_enable()
305 priv->out_up_delay += 10; in wm5110_hp_pre_enable()
315 priv->out_up_delay += 10; in wm5110_hp_pre_enable()
322 return regmap_multi_reg_write(arizona->regmap, wseq, nregs); in wm5110_hp_pre_enable()
327 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wm5110_hp_pre_disable()
331 switch (w->shift) { in wm5110_hp_pre_disable()
341 priv->out_down_delay += 27; in wm5110_hp_pre_disable()
353 priv->out_down_delay += 27; in wm5110_hp_pre_disable()
366 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wm5110_hp_ev()
369 switch (priv->arizona->rev) { in wm5110_hp_ev()
394 ret = regmap_write(arizona->regmap, reg, 0x80); in wm5110_clear_pga_volume()
396 dev_err(arizona->dev, "Failed to clear PGA (0x%x): %d\n", in wm5110_clear_pga_volume()
407 struct arizona *arizona = dev_get_drvdata(component->dev->parent); in wm5110_put_dre()
409 (struct soc_mixer_control *)kcontrol->private_value; in wm5110_put_dre()
411 unsigned int mask = (0x1 << mc->shift) | (0x1 << mc->rshift); in wm5110_put_dre()
412 unsigned int lnew = (!!ucontrol->value.integer.value[0]) << mc->shift; in wm5110_put_dre()
413 unsigned int rnew = (!!ucontrol->value.integer.value[1]) << mc->rshift; in wm5110_put_dre()
420 ret = regmap_read(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1, &ena); in wm5110_put_dre()
422 dev_err(arizona->dev, "Failed to read output state: %d\n", ret); in wm5110_put_dre()
425 ret = regmap_read(arizona->regmap, ARIZONA_DRE_ENABLE, &dre); in wm5110_put_dre()
427 dev_err(arizona->dev, "Failed to read DRE state: %d\n", ret); in wm5110_put_dre()
431 lold = dre & (1 << mc->shift); in wm5110_put_dre()
432 rold = dre & (1 << mc->rshift); in wm5110_put_dre()
434 lena = ena & (1 << mc->rshift); in wm5110_put_dre()
435 rena = ena & (1 << mc->shift); in wm5110_put_dre()
438 dev_err(arizona->dev, "Can't change DRE on active outputs\n"); in wm5110_put_dre()
439 ret = -EBUSY; in wm5110_put_dre()
443 ret = regmap_update_bits(arizona->regmap, ARIZONA_DRE_ENABLE, in wm5110_put_dre()
446 dev_err(arizona->dev, "Failed to set DRE: %d\n", ret); in wm5110_put_dre()
452 wm5110_clear_pga_volume(arizona, mc->shift); in wm5110_put_dre()
455 wm5110_clear_pga_volume(arizona, mc->rshift); in wm5110_put_dre()
506 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wm5110_in_analog_ev()
509 struct arizona *arizona = priv->arizona; in wm5110_in_analog_ev()
517 reg = ARIZONA_IN1L_CONTROL + ((w->shift ^ 0x1) * 4); in wm5110_in_analog_ev()
522 wm5110->in_value |= 0x3 << ((w->shift ^ 0x1) * 2); in wm5110_in_analog_ev()
523 wm5110->in_pre_pending++; in wm5110_in_analog_ev()
524 wm5110->in_post_pending++; in wm5110_in_analog_ev()
527 wm5110->in_pga_cache[w->shift] = snd_soc_component_read(component, reg); in wm5110_in_analog_ev()
532 wm5110->in_pre_pending--; in wm5110_in_analog_ev()
533 if (wm5110->in_pre_pending == 0) { in wm5110_in_analog_ev()
534 analog_seq[1].def = wm5110->in_value; in wm5110_in_analog_ev()
535 regmap_multi_reg_write_bypassed(arizona->regmap, in wm5110_in_analog_ev()
541 wm5110->in_value = 0; in wm5110_in_analog_ev()
547 wm5110->in_pga_cache[w->shift]); in wm5110_in_analog_ev()
549 wm5110->in_post_pending--; in wm5110_in_analog_ev()
550 if (wm5110->in_post_pending == 0) in wm5110_in_analog_ev()
551 regmap_multi_reg_write_bypassed(arizona->regmap, in wm5110_in_analog_ev()
565 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wm5110_in_ev()
567 struct arizona *arizona = priv->arizona; in wm5110_in_ev()
569 switch (arizona->rev) { in wm5110_in_ev()
571 if (arizona_input_analog(component, w->shift)) in wm5110_in_ev()
583 static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
584 static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
585 static DECLARE_TLV_DB_SCALE(noise_tlv, -13200, 600, 0);
586 static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
694 ARIZONA_ANC_COEFF_END - ARIZONA_ANC_COEFF_START + 1),
697 ARIZONA_FCL_COEFF_END - ARIZONA_FCL_COEFF_START + 1),
700 ARIZONA_FCR_COEFF_END - ARIZONA_FCR_COEFF_START + 1),
1733 { "AIF3 Capture", NULL, "DBVDD3" },
1734 { "AIF3 Playback", NULL, "DBVDD3" },
1822 { "AIF3 Capture", NULL, "AIF3TX1" },
1823 { "AIF3 Capture", NULL, "AIF3TX2" },
1825 { "AIF3RX1", NULL, "AIF3 Playback" },
1826 { "AIF3RX2", NULL, "AIF3 Playback" },
1852 { "AIF3 Playback", NULL, "SYSCLK" },
1859 { "AIF3 Capture", NULL, "SYSCLK" },
2053 return arizona_set_fll(&wm5110->fll[0], source, Fref, Fout); in wm5110_set_fll()
2055 return arizona_set_fll(&wm5110->fll[1], source, Fref, Fout); in wm5110_set_fll()
2057 return arizona_set_fll_refclk(&wm5110->fll[0], source, Fref, in wm5110_set_fll()
2060 return arizona_set_fll_refclk(&wm5110->fll[1], source, Fref, in wm5110_set_fll()
2063 return -EINVAL; in wm5110_set_fll()
2074 .name = "wm5110-aif1",
2096 .name = "wm5110-aif2",
2118 .name = "wm5110-aif3",
2122 .stream_name = "AIF3 Playback",
2129 .stream_name = "AIF3 Capture",
2140 .name = "wm5110-slim1",
2159 .name = "wm5110-slim2",
2178 .name = "wm5110-slim3",
2197 .name = "wm5110-cpu-voicectrl",
2208 .name = "wm5110-dsp-voicectrl",
2218 .name = "wm5110-cpu-trace",
2229 .name = "wm5110-dsp-trace",
2243 struct snd_soc_pcm_runtime *rtd = stream->private_data; in wm5110_open()
2245 struct arizona *arizona = priv->core.arizona; in wm5110_open()
2248 if (strcmp(asoc_rtd_to_codec(rtd, 0)->name, "wm5110-dsp-voicectrl") == 0) { in wm5110_open()
2250 } else if (strcmp(asoc_rtd_to_codec(rtd, 0)->name, "wm5110-dsp-trace") == 0) { in wm5110_open()
2253 dev_err(arizona->dev, in wm5110_open()
2255 asoc_rtd_to_codec(rtd, 0)->name); in wm5110_open()
2256 return -EINVAL; in wm5110_open()
2259 return wm_adsp_compr_open(&priv->core.adsp[n_adsp], stream); in wm5110_open()
2265 struct arizona *arizona = priv->core.arizona; in wm5110_adsp2_irq()
2271 ret = wm_adsp_compr_handle_irq(&priv->core.adsp[i]); in wm5110_adsp2_irq()
2272 if (ret != -ENODEV) in wm5110_adsp2_irq()
2283 dev_err(arizona->dev, "Spurious compressed data IRQ\n"); in wm5110_adsp2_irq()
2294 struct arizona *arizona = priv->core.arizona; in wm5110_component_probe()
2297 arizona->dapm = dapm; in wm5110_component_probe()
2298 snd_soc_component_init_regmap(component, arizona->regmap); in wm5110_component_probe()
2308 ret = wm_adsp2_component_probe(&priv->core.adsp[i], component); in wm5110_component_probe()
2324 for (--i; i >= 0; --i) in wm5110_component_probe()
2325 wm_adsp2_component_remove(&priv->core.adsp[i], component); in wm5110_component_probe()
2336 wm_adsp2_component_remove(&priv->core.adsp[i], component); in wm5110_component_remove()
2338 priv->core.arizona->dapm = NULL; in wm5110_component_remove()
2388 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); in wm5110_probe()
2392 wm5110 = devm_kzalloc(&pdev->dev, sizeof(struct wm5110_priv), in wm5110_probe()
2395 return -ENOMEM; in wm5110_probe()
2399 if (!dev_get_platdata(arizona->dev)) { in wm5110_probe()
2406 wm5110->core.arizona = arizona; in wm5110_probe()
2407 wm5110->core.num_inputs = 8; in wm5110_probe()
2410 wm5110->core.adsp[i].part = "wm5110"; in wm5110_probe()
2411 wm5110->core.adsp[i].num = i + 1; in wm5110_probe()
2412 wm5110->core.adsp[i].type = WMFW_ADSP2; in wm5110_probe()
2413 wm5110->core.adsp[i].dev = arizona->dev; in wm5110_probe()
2414 wm5110->core.adsp[i].regmap = arizona->regmap; in wm5110_probe()
2416 wm5110->core.adsp[i].base = ARIZONA_DSP1_CONTROL_1 in wm5110_probe()
2418 wm5110->core.adsp[i].mem = wm5110_dsp_regions[i]; in wm5110_probe()
2419 wm5110->core.adsp[i].num_mems in wm5110_probe()
2422 ret = wm_adsp2_init(&wm5110->core.adsp[i]); in wm5110_probe()
2427 for (i = 0; i < ARRAY_SIZE(wm5110->fll); i++) in wm5110_probe()
2428 wm5110->fll[i].vco_mult = 3; in wm5110_probe()
2430 arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1, in wm5110_probe()
2432 &wm5110->fll[0]); in wm5110_probe()
2433 arizona_init_fll(arizona, 2, ARIZONA_FLL2_CONTROL_1 - 1, in wm5110_probe()
2435 &wm5110->fll[1]); in wm5110_probe()
2438 regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_2, in wm5110_probe()
2440 regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_3, in wm5110_probe()
2444 arizona_init_dai(&wm5110->core, i); in wm5110_probe()
2448 regmap_update_bits(arizona->regmap, wm5110_digital_vu[i], in wm5110_probe()
2451 pm_runtime_enable(&pdev->dev); in wm5110_probe()
2452 pm_runtime_idle(&pdev->dev); in wm5110_probe()
2458 dev_err(&pdev->dev, "Failed to request DSP IRQ: %d\n", ret); in wm5110_probe()
2464 dev_warn(&pdev->dev, in wm5110_probe()
2477 ret = devm_snd_soc_register_component(&pdev->dev, in wm5110_probe()
2482 dev_err(&pdev->dev, "Failed to register component: %d\n", ret); in wm5110_probe()
2500 struct arizona *arizona = wm5110->core.arizona; in wm5110_remove()
2503 pm_runtime_disable(&pdev->dev); in wm5110_remove()
2506 wm_adsp2_remove(&wm5110->core.adsp[i]); in wm5110_remove()
2518 .name = "wm5110-codec",
2529 MODULE_ALIAS("platform:wm5110-codec");