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 * wm5102.c -- WM5102 ALSA SoC Audio driver
34 #define DRV_NAME "wm5102-codec"
42 static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
43 static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
44 static DECLARE_TLV_DB_SCALE(noise_tlv, -13200, 600, 0);
45 static DECLARE_TLV_DB_SCALE(ng_tlv, -10200, 600, 0);
583 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
584 struct arizona *arizona = dev_get_drvdata(component->dev->parent);
585 struct regmap *regmap = arizona->regmap;
589 switch (arizona->rev) {
622 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
623 struct arizona *arizona = dev_get_drvdata(component->dev->parent);
629 ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, &v);
631 dev_err(component->dev,
633 return -EIO;
641 dev_err(component->dev,
653 dev_warn(component->dev,
668 struct arizona *arizona = dev_get_drvdata(component->dev->parent);
670 mutex_lock(&arizona->dac_comp_lock);
671 put_unaligned_be16(arizona->dac_comp_coeff,
672 ucontrol->value.bytes.data);
673 mutex_unlock(&arizona->dac_comp_lock);
682 struct arizona *arizona = dev_get_drvdata(component->dev->parent);
683 uint16_t dac_comp_coeff = get_unaligned_be16(ucontrol->value.bytes.data);
686 mutex_lock(&arizona->dac_comp_lock);
687 if (arizona->dac_comp_coeff != dac_comp_coeff) {
688 arizona->dac_comp_coeff = dac_comp_coeff;
691 mutex_unlock(&arizona->dac_comp_lock);
700 struct arizona *arizona = dev_get_drvdata(component->dev->parent);
702 mutex_lock(&arizona->dac_comp_lock);
703 ucontrol->value.integer.value[0] = arizona->dac_comp_enabled;
704 mutex_unlock(&arizona->dac_comp_lock);
713 struct arizona *arizona = dev_get_drvdata(component->dev->parent);
714 struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value;
717 if (ucontrol->value.integer.value[0] > mc->max)
718 return -EINVAL;
720 mutex_lock(&arizona->dac_comp_lock);
721 if (arizona->dac_comp_enabled != ucontrol->value.integer.value[0]) {
722 arizona->dac_comp_enabled = ucontrol->value.integer.value[0];
725 mutex_unlock(&arizona->dac_comp_lock);
785 SOC_SINGLE_TLV("IN1L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L,
787 SOC_SINGLE_TLV("IN1R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1R,
789 SOC_SINGLE_TLV("IN2L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2L,
791 SOC_SINGLE_TLV("IN2R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_2R,
793 SOC_SINGLE_TLV("IN3L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_3L,
795 SOC_SINGLE_TLV("IN3R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_3R,
798 SOC_ENUM("Input Ramp Up", arizona_in_vi_ramp),
799 SOC_ENUM("Input Ramp Down", arizona_in_vd_ramp),
875 SOC_ENUM("LHPF1 Mode", arizona_lhpf1_mode),
876 SOC_ENUM("LHPF2 Mode", arizona_lhpf2_mode),
877 SOC_ENUM("LHPF3 Mode", arizona_lhpf3_mode),
878 SOC_ENUM("LHPF4 Mode", arizona_lhpf4_mode),
904 SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
906 SOC_DOUBLE_R("HPOUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
908 SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
910 SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
912 SOC_DOUBLE_R("SPKDAT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L,
915 SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
918 SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
921 SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
923 SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
926 SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_5L,
941 SOC_SINGLE("DRE Threshold", ARIZONA_DRE_CONTROL_2,
955 SOC_SINGLE_TLV("Noise Gate Threshold Volume", ARIZONA_NOISE_GATE_CONTROL,
1757 return arizona_set_fll(&wm5102->fll[0], source, Fref, Fout);
1759 return arizona_set_fll(&wm5102->fll[1], source, Fref, Fout);
1761 return arizona_set_fll_refclk(&wm5102->fll[0], source, Fref,
1764 return arizona_set_fll_refclk(&wm5102->fll[1], source, Fref,
1767 return -EINVAL;
1782 .name = "wm5102-aif1",
1804 .name = "wm5102-aif2",
1826 .name = "wm5102-aif3",
1848 .name = "wm5102-slim1",
1867 .name = "wm5102-slim2",
1886 .name = "wm5102-slim3",
1905 .name = "wm5102-cpu-trace",
1916 .name = "wm5102-dsp-trace",
1932 return wm_adsp_compr_open(&priv->core.adsp[0], stream);
1938 struct arizona *arizona = priv->core.arizona;
1941 ret = wm_adsp_compr_handle_irq(&priv->core.adsp[0]);
1942 if (ret == -ENODEV) {
1943 dev_err(arizona->dev, "Spurious compressed data IRQ\n");
1954 struct arizona *arizona = priv->core.arizona;
1957 snd_soc_component_init_regmap(component, arizona->regmap);
1959 ret = wm_adsp2_component_probe(&priv->core.adsp[0], component);
1976 priv->core.arizona->dapm = dapm;
1981 wm_adsp2_component_remove(&priv->core.adsp[0], component);
1990 wm_adsp2_component_remove(&priv->core.adsp[0], component);
1992 priv->core.arizona->dapm = NULL;
2039 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
2043 wm5102 = devm_kzalloc(&pdev->dev, sizeof(struct wm5102_priv),
2046 return -ENOMEM;
2050 if (!dev_get_platdata(arizona->dev)) {
2057 mutex_init(&arizona->dac_comp_lock);
2059 wm5102->core.arizona = arizona;
2060 wm5102->core.num_inputs = 6;
2062 arizona_init_dvfs(&wm5102->core);
2064 wm5102->core.adsp[0].part = "wm5102";
2065 wm5102->core.adsp[0].cs_dsp.num = 1;
2066 wm5102->core.adsp[0].cs_dsp.type = WMFW_ADSP2;
2067 wm5102->core.adsp[0].cs_dsp.base = ARIZONA_DSP1_CONTROL_1;
2068 wm5102->core.adsp[0].cs_dsp.dev = arizona->dev;
2069 wm5102->core.adsp[0].cs_dsp.regmap = arizona->regmap;
2070 wm5102->core.adsp[0].cs_dsp.mem = wm5102_dsp1_regions;
2071 wm5102->core.adsp[0].cs_dsp.num_mems = ARRAY_SIZE(wm5102_dsp1_regions);
2073 ret = wm_adsp2_init(&wm5102->core.adsp[0]);
2077 /* This may return -EPROBE_DEFER, so do this early on */
2078 ret = arizona_jack_codec_dev_probe(&wm5102->core, &pdev->dev);
2082 for (i = 0; i < ARRAY_SIZE(wm5102->fll); i++)
2083 wm5102->fll[i].vco_mult = 1;
2085 arizona_init_fll(arizona, 1, ARIZONA_FLL1_CONTROL_1 - 1,
2087 &wm5102->fll[0]);
2088 arizona_init_fll(arizona, 2, ARIZONA_FLL2_CONTROL_1 - 1,
2090 &wm5102->fll[1]);
2092 /* SR2 fixed at 8kHz, SR3 fixed at 16kHz */
2093 regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_2,
2095 regmap_update_bits(arizona->regmap, ARIZONA_SAMPLE_RATE_3,
2099 arizona_init_dai(&wm5102->core, i);
2103 regmap_update_bits(arizona->regmap, wm5102_digital_vu[i],
2106 pm_runtime_enable(&pdev->dev);
2107 pm_runtime_idle(&pdev->dev);
2113 dev_err(&pdev->dev, "Failed to request DSP IRQ: %d\n", ret);
2119 dev_warn(&pdev->dev,
2132 ret = devm_snd_soc_register_component(&pdev->dev,
2137 dev_err(&pdev->dev, "Failed to register component: %d\n", ret);
2149 pm_runtime_disable(&pdev->dev);
2150 arizona_jack_codec_dev_remove(&wm5102->core);
2158 struct arizona *arizona = wm5102->core.arizona;
2160 pm_runtime_disable(&pdev->dev);
2162 wm_adsp2_remove(&wm5102->core.adsp[0]);
2169 arizona_jack_codec_dev_remove(&wm5102->core);
2174 .name = "wm5102-codec",
2185 MODULE_ALIAS("platform:wm5102-codec");