Lines Matching +full:- +full:mclk +full:- +full:always +full:- +full:on +full:- +full:rate +full:- +full:hz

1 // SPDX-License-Identifier: GPL-2.0-only
3 * wm8988.c -- WM8988 ALSA SoC audio driver
129 static const char *bass_filter_txt[] = { "130Hz @ 48kHz", "200Hz @ 48kHz" };
137 static const char *stereo_3d_lc_txt[] = {"200Hz", "500Hz"};
167 static const DECLARE_TLV_DB_SCALE(pga_tlv, -1725, 75, 0);
168 static const DECLARE_TLV_DB_SCALE(adc_tlv, -9750, 50, 1);
169 static const DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 1);
170 static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1);
171 static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0);
180 SOC_ENUM("Treble Cut-off", treble),
184 SOC_ENUM("3D Lower Cut-off", stereo_3d_lc),
185 SOC_ENUM("3D Upper Cut-off", stereo_3d_uc),
208 SOC_ENUM("Playback De-emphasis", deemph),
244 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in wm8988_lrc_control()
450 u32 mclk; member
451 u32 rate; member
457 /* codec hifi mclk clock divider coefficients */
507 static inline int get_coeff(int mclk, int rate) in get_coeff() argument
512 if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk) in get_coeff()
516 return -EINVAL; in get_coeff()
555 struct snd_soc_component *component = codec_dai->component; in wm8988_set_dai_sysclk()
563 wm8988->sysclk_constraints = &constraints_112896; in wm8988_set_dai_sysclk()
564 wm8988->sysclk = freq; in wm8988_set_dai_sysclk()
571 wm8988->sysclk_constraints = &constraints_12288; in wm8988_set_dai_sysclk()
572 wm8988->sysclk = freq; in wm8988_set_dai_sysclk()
577 wm8988->sysclk_constraints = &constraints_12; in wm8988_set_dai_sysclk()
578 wm8988->sysclk = freq; in wm8988_set_dai_sysclk()
581 return -EINVAL; in wm8988_set_dai_sysclk()
587 struct snd_soc_component *component = codec_dai->component; in wm8988_set_dai_fmt()
598 return -EINVAL; in wm8988_set_dai_fmt()
618 return -EINVAL; in wm8988_set_dai_fmt()
635 return -EINVAL; in wm8988_set_dai_fmt()
645 struct snd_soc_component *component = dai->component; in wm8988_pcm_startup()
648 /* The set of sample rates that can be supported depends on the in wm8988_pcm_startup()
649 * MCLK supplied to the CODEC - enforce this. in wm8988_pcm_startup()
651 if (!wm8988->sysclk) { in wm8988_pcm_startup()
652 dev_err(component->dev, in wm8988_pcm_startup()
653 "No MCLK configured, call set_sysclk() on init\n"); in wm8988_pcm_startup()
654 return -EINVAL; in wm8988_pcm_startup()
657 snd_pcm_hw_constraint_list(substream->runtime, 0, in wm8988_pcm_startup()
659 wm8988->sysclk_constraints); in wm8988_pcm_startup()
668 struct snd_soc_component *component = dai->component; in wm8988_pcm_hw_params()
674 coeff = get_coeff(wm8988->sysclk, params_rate(params)); in wm8988_pcm_hw_params()
676 coeff = get_coeff(wm8988->sysclk / 2, params_rate(params)); in wm8988_pcm_hw_params()
680 dev_err(component->dev, in wm8988_pcm_hw_params()
681 "Unable to configure sample rate %dHz with %dHz MCLK\n", in wm8988_pcm_hw_params()
682 params_rate(params), wm8988->sysclk); in wm8988_pcm_hw_params()
712 struct snd_soc_component *component = dai->component; in wm8988_mute()
739 regcache_sync(wm8988->regmap); in wm8988_set_bias_level()
774 .name = "wm8988-hifi",
799 dev_err(component->dev, "Failed to issue reset\n"); in wm8988_probe()
803 /* set the update bits (we always update left then right) */ in wm8988_probe()
846 wm8988 = devm_kzalloc(&spi->dev, sizeof(struct wm8988_priv), in wm8988_spi_probe()
849 return -ENOMEM; in wm8988_spi_probe()
851 wm8988->regmap = devm_regmap_init_spi(spi, &wm8988_regmap); in wm8988_spi_probe()
852 if (IS_ERR(wm8988->regmap)) { in wm8988_spi_probe()
853 ret = PTR_ERR(wm8988->regmap); in wm8988_spi_probe()
854 dev_err(&spi->dev, "Failed to init regmap: %d\n", ret); in wm8988_spi_probe()
860 ret = devm_snd_soc_register_component(&spi->dev, in wm8988_spi_probe()
879 wm8988 = devm_kzalloc(&i2c->dev, sizeof(struct wm8988_priv), in wm8988_i2c_probe()
882 return -ENOMEM; in wm8988_i2c_probe()
886 wm8988->regmap = devm_regmap_init_i2c(i2c, &wm8988_regmap); in wm8988_i2c_probe()
887 if (IS_ERR(wm8988->regmap)) { in wm8988_i2c_probe()
888 ret = PTR_ERR(wm8988->regmap); in wm8988_i2c_probe()
889 dev_err(&i2c->dev, "Failed to init regmap: %d\n", ret); in wm8988_i2c_probe()
893 ret = devm_snd_soc_register_component(&i2c->dev, in wm8988_i2c_probe()