Lines Matching +full:digital +full:- +full:input +full:- +full:threshold +full:- +full:mode +full:- +full:fixed
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);
162 struct arizona *arizona = dev_get_drvdata(component->dev->parent);
163 struct regmap *regmap = arizona->regmap;
167 switch (arizona->rev) {
198 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
199 struct arizona *arizona = dev_get_drvdata(component->dev->parent);
203 ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, &v);
205 dev_err(component->dev, "Failed to read SYSCLK state: %d\n", ret);
290 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
292 struct arizona *arizona = priv->arizona;
297 switch (w->shift) {
305 priv->out_up_delay += 10000;
315 priv->out_up_delay += 10000;
322 return regmap_multi_reg_write(arizona->regmap, wseq, nregs);
327 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
331 switch (w->shift) {
341 priv->out_down_delay += 27000;
353 priv->out_down_delay += 27000;
366 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
369 switch (priv->arizona->rev) {
394 ret = regmap_write(arizona->regmap, reg, 0x80);
396 dev_err(arizona->dev, "Failed to clear PGA (0x%x): %d\n",
407 struct arizona *arizona = dev_get_drvdata(component->dev->parent);
409 (struct soc_mixer_control *)kcontrol->private_value;
411 unsigned int mask = (0x1 << mc->shift) | (0x1 << mc->rshift);
412 unsigned int lnew = (!!ucontrol->value.integer.value[0]) << mc->shift;
413 unsigned int rnew = (!!ucontrol->value.integer.value[1]) << mc->rshift;
421 ret = regmap_read(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1, &ena);
423 dev_err(arizona->dev, "Failed to read output state: %d\n", ret);
426 ret = regmap_read(arizona->regmap, ARIZONA_DRE_ENABLE, &dre);
428 dev_err(arizona->dev, "Failed to read DRE state: %d\n", ret);
432 lold = dre & (1 << mc->shift);
433 rold = dre & (1 << mc->rshift);
435 lena = ena & (1 << mc->rshift);
436 rena = ena & (1 << mc->shift);
439 dev_err(arizona->dev, "Can't change DRE on active outputs\n");
440 ret = -EBUSY;
444 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_DRE_ENABLE,
447 dev_err(arizona->dev, "Failed to set DRE: %d\n", ret);
453 wm5110_clear_pga_volume(arizona, mc->shift);
456 wm5110_clear_pga_volume(arizona, mc->rshift);
510 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
513 struct arizona *arizona = priv->arizona;
521 reg = ARIZONA_IN1L_CONTROL + ((w->shift ^ 0x1) * 4);
526 wm5110->in_value |= 0x3 << ((w->shift ^ 0x1) * 2);
527 wm5110->in_pre_pending++;
528 wm5110->in_post_pending++;
531 wm5110->in_pga_cache[w->shift] = snd_soc_component_read(component, reg);
536 wm5110->in_pre_pending--;
537 if (wm5110->in_pre_pending == 0) {
538 analog_seq[1].def = wm5110->in_value;
539 regmap_multi_reg_write_bypassed(arizona->regmap,
545 wm5110->in_value = 0;
551 wm5110->in_pga_cache[w->shift]);
553 wm5110->in_post_pending--;
554 if (wm5110->in_post_pending == 0)
555 regmap_multi_reg_write_bypassed(arizona->regmap,
569 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
571 struct arizona *arizona = priv->arizona;
573 switch (arizona->rev) {
575 if (arizona_input_analog(component, w->shift))
587 static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
588 static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
589 static DECLARE_TLV_DB_SCALE(noise_tlv, -13200, 600, 0);
590 static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
615 { name " Channel", "Left", name " Left Input" }, \
616 { name " Channel", "Combine", name " Left Input" }, \
617 { name " Channel", "Right", name " Right Input" }, \
618 { name " Channel", "Combine", name " Right Input" }, \
619 { name " Left Input", "IN1", "IN1L PGA" }, \
620 { name " Right Input", "IN1", "IN1R PGA" }, \
621 { name " Left Input", "IN2", "IN2L PGA" }, \
622 { name " Right Input", "IN2", "IN2R PGA" }, \
623 { name " Left Input", "IN3", "IN3L PGA" }, \
624 { name " Right Input", "IN3", "IN3R PGA" }, \
625 { name " Left Input", "IN4", "IN4L PGA" }, \
626 { name " Right Input", "IN4", "IN4R PGA" }
677 SOC_SINGLE_TLV("IN1L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L,
679 SOC_SINGLE_TLV("IN1R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1R,
681 SOC_SINGLE_TLV("IN2L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2L,
683 SOC_SINGLE_TLV("IN2R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2R,
685 SOC_SINGLE_TLV("IN3L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_3L,
687 SOC_SINGLE_TLV("IN3R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_3R,
689 SOC_SINGLE_TLV("IN4L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_4L,
691 SOC_SINGLE_TLV("IN4R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_4R,
694 SOC_ENUM("Input Ramp Up", arizona_in_vi_ramp),
695 SOC_ENUM("Input Ramp Down", arizona_in_vd_ramp),
698 ARIZONA_ANC_COEFF_END - ARIZONA_ANC_COEFF_START + 1),
701 ARIZONA_FCL_COEFF_END - ARIZONA_FCL_COEFF_START + 1),
704 ARIZONA_FCR_COEFF_END - ARIZONA_FCR_COEFF_START + 1),
779 SOC_ENUM("LHPF1 Mode", arizona_lhpf1_mode),
780 SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),
781 SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),
782 SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode),
837 SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
839 SOC_DOUBLE_R("HPOUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
841 SOC_DOUBLE_R("HPOUT3 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
843 SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
845 SOC_DOUBLE_R("SPKDAT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L,
847 SOC_DOUBLE_R("SPKDAT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_6L,
850 SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
853 SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
856 SOC_DOUBLE_R_TLV("HPOUT3 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
859 SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
862 SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_5L,
865 SOC_DOUBLE_R_TLV("SPKDAT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_6L,
889 SOC_SINGLE_TLV("Noise Gate Threshold Volume", ARIZONA_NOISE_GATE_CONTROL,
1073 SOC_DAPM_ENUM("RXANCL Input", arizona_anc_input_src[0]),
1075 SOC_DAPM_ENUM("RXANCR Input", arizona_anc_input_src[2]),
1305 SND_SOC_DAPM_MUX("RXANCL Left Input", SND_SOC_NOPM, 0, 0,
1307 SND_SOC_DAPM_MUX("RXANCL Right Input", SND_SOC_NOPM, 0, 0,
1312 SND_SOC_DAPM_MUX("RXANCR Left Input", SND_SOC_NOPM, 0, 0,
1314 SND_SOC_DAPM_MUX("RXANCR Right Input", SND_SOC_NOPM, 0, 0,
2057 return arizona_set_fll(&wm5110->fll[0], source, Fref, Fout);
2059 return arizona_set_fll(&wm5110->fll[1], source, Fref, Fout);
2061 return arizona_set_fll_refclk(&wm5110->fll[0], source, Fref,
2064 return arizona_set_fll_refclk(&wm5110->fll[1], source, Fref,
2067 return -EINVAL;
2082 .name = "wm5110-aif1",
2104 .name = "wm5110-aif2",
2126 .name = "wm5110-aif3",
2148 .name = "wm5110-slim1",
2167 .name = "wm5110-slim2",
2186 .name = "wm5110-slim3",
2205 .name = "wm5110-cpu-voicectrl",
2216 .name = "wm5110-dsp-voicectrl",
2226 .name = "wm5110-cpu-trace",
2237 .name = "wm5110-dsp-trace",
2251 struct snd_soc_pcm_runtime *rtd = stream->private_data;
2253 struct arizona *arizona = priv->core.arizona;
2256 if (strcmp(snd_soc_rtd_to_codec(rtd, 0)->name, "wm5110-dsp-voicectrl") == 0) {
2258 } else if (strcmp(snd_soc_rtd_to_codec(rtd, 0)->name, "wm5110-dsp-trace") == 0) {
2261 dev_err(arizona->dev,
2263 snd_soc_rtd_to_codec(rtd, 0)->name);
2264 return -EINVAL;
2267 return wm_adsp_compr_open(&priv->core.adsp[n_adsp], stream);
2273 struct arizona *arizona = priv->core.arizona;
2279 ret = wm_adsp_compr_handle_irq(&priv->core.adsp[i]);
2280 if (ret != -ENODEV)
2291 dev_err(arizona->dev, "Spurious compressed data IRQ\n");
2302 struct arizona *arizona = priv->core.arizona;
2305 arizona->dapm = dapm;
2306 snd_soc_component_init_regmap(component, arizona->regmap);
2316 ret = wm_adsp2_component_probe(&priv->core.adsp[i], component);
2332 for (--i; i >= 0; --i)
2333 wm_adsp2_component_remove(&priv->core.adsp[i], component);
2344 wm_adsp2_component_remove(&priv->core.adsp[i], component);
2346 priv->core.arizona->dapm = NULL;
2396 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
2400 wm5110 = devm_kzalloc(&pdev->dev, sizeof(struct wm5110_priv),
2403 return -ENOMEM;
2407 if (!dev_get_platdata(arizona->dev)) {
2414 wm5110->core.arizona = arizona;
2415 wm5110->core.num_inputs = 8;
2418 wm5110->core.adsp[i].part = "wm5110";
2419 wm5110->core.adsp[i].cs_dsp.num = i + 1;
2420 wm5110->core.adsp[i].cs_dsp.type = WMFW_ADSP2;
2421 wm5110->core.adsp[i].cs_dsp.dev = arizona->dev;
2422 wm5110->core.adsp[i].cs_dsp.regmap = arizona->regmap;
2424 wm5110->core.adsp[i].cs_dsp.base = ARIZONA_DSP1_CONTROL_1
2426 wm5110->core.adsp[i].cs_dsp.mem = wm5110_dsp_regions[i];
2427 wm5110->core.adsp[i].cs_dsp.num_mems
2430 ret = wm_adsp2_init(&wm5110->core.adsp[i]);
2435 /* This may return -EPROBE_DEFER, so do this early on */
2436 ret = arizona_jack_codec_dev_probe(&wm5110->core, &pdev->dev);
2440 for (i = 0; i < ARRAY_SIZE(wm5110->fll); i++)
2441 wm5110->fll[i].vco_mult = 3;
2443 arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1,
2445 &wm5110->fll[0]);
2446 arizona_init_fll(arizona, 2, ARIZONA_FLL2_CONTROL_1 - 1,
2448 &wm5110->fll[1]);
2450 /* SR2 fixed at 8kHz, SR3 fixed at 16kHz */
2451 regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_2,
2453 regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_3,
2457 arizona_init_dai(&wm5110->core, i);
2461 regmap_update_bits(arizona->regmap, wm5110_digital_vu[i],
2464 pm_runtime_enable(&pdev->dev);
2465 pm_runtime_idle(&pdev->dev);
2471 dev_err(&pdev->dev, "Failed to request DSP IRQ: %d\n", ret);
2477 dev_warn(&pdev->dev,
2490 ret = devm_snd_soc_register_component(&pdev->dev,
2495 dev_err(&pdev->dev, "Failed to register component: %d\n", ret);
2507 pm_runtime_disable(&pdev->dev);
2508 arizona_jack_codec_dev_remove(&wm5110->core);
2516 struct arizona *arizona = wm5110->core.arizona;
2519 pm_runtime_disable(&pdev->dev);
2522 wm_adsp2_remove(&wm5110->core.adsp[i]);
2529 arizona_jack_codec_dev_remove(&wm5110->core);
2534 .name = "wm5110-codec",
2545 MODULE_ALIAS("platform:wm5110-codec");