Lines Matching +full:spi +full:- +full:mux
1 // SPDX-License-Identifier: GPL-2.0-only
3 * wm8988.c -- WM8988 ALSA SoC audio driver
17 #include <linux/spi/spi.h>
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()
297 /* Left PGA Mux */
306 /* Right PGA Mux */
315 /* Differential Mux */
322 /* Mono ADC Mux */
333 SND_SOC_DAPM_MUX("Differential Mux", SND_SOC_NOPM, 0, 0,
335 SND_SOC_DAPM_MUX("Left ADC Mux", SND_SOC_NOPM, 0, 0,
337 SND_SOC_DAPM_MUX("Right ADC Mux", SND_SOC_NOPM, 0, 0,
340 SND_SOC_DAPM_MUX("Left PGA Mux", WM8988_PWR1, 5, 0,
342 SND_SOC_DAPM_MUX("Right PGA Mux", WM8988_PWR1, 4, 0,
345 SND_SOC_DAPM_MUX("Left Line Mux", SND_SOC_NOPM, 0, 0,
347 SND_SOC_DAPM_MUX("Right Line Mux", SND_SOC_NOPM, 0, 0,
384 { "Left Line Mux", "Line 1", "LINPUT1" },
385 { "Left Line Mux", "Line 2", "LINPUT2" },
386 { "Left Line Mux", "PGA", "Left PGA Mux" },
387 { "Left Line Mux", "Differential", "Differential Mux" },
389 { "Right Line Mux", "Line 1", "RINPUT1" },
390 { "Right Line Mux", "Line 2", "RINPUT2" },
391 { "Right Line Mux", "PGA", "Right PGA Mux" },
392 { "Right Line Mux", "Differential", "Differential Mux" },
394 { "Left PGA Mux", "Line 1", "LINPUT1" },
395 { "Left PGA Mux", "Line 2", "LINPUT2" },
396 { "Left PGA Mux", "Differential", "Differential Mux" },
398 { "Right PGA Mux", "Line 1", "RINPUT1" },
399 { "Right PGA Mux", "Line 2", "RINPUT2" },
400 { "Right PGA Mux", "Differential", "Differential Mux" },
402 { "Differential Mux", "Line 1", "LINPUT1" },
403 { "Differential Mux", "Line 1", "RINPUT1" },
404 { "Differential Mux", "Line 2", "LINPUT2" },
405 { "Differential Mux", "Line 2", "RINPUT2" },
407 { "Left ADC Mux", "Stereo", "Left PGA Mux" },
408 { "Left ADC Mux", "Mono (Left)", "Left PGA Mux" },
409 { "Left ADC Mux", "Digital Mono", "Left PGA Mux" },
411 { "Right ADC Mux", "Stereo", "Right PGA Mux" },
412 { "Right ADC Mux", "Mono (Right)", "Right PGA Mux" },
413 { "Right ADC Mux", "Digital Mono", "Right PGA Mux" },
415 { "Left ADC", NULL, "Left ADC Mux" },
416 { "Right ADC", NULL, "Right ADC Mux" },
418 { "Left Line Mux", "Line 1", "LINPUT1" },
419 { "Left Line Mux", "Line 2", "LINPUT2" },
420 { "Left Line Mux", "PGA", "Left PGA Mux" },
421 { "Left Line Mux", "Differential", "Differential Mux" },
423 { "Right Line Mux", "Line 1", "RINPUT1" },
424 { "Right Line Mux", "Line 2", "RINPUT2" },
425 { "Right Line Mux", "PGA", "Right PGA Mux" },
426 { "Right Line Mux", "Differential", "Differential Mux" },
429 { "Left Mixer", "Left Bypass Switch", "Left Line Mux" },
431 { "Left Mixer", "Right Bypass Switch", "Right Line Mux" },
434 { "Right Mixer", "Left Bypass Switch", "Left Line Mux" },
436 { "Right Mixer", "Right Bypass Switch", "Right Line Mux" },
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()
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()
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()
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()
841 static int wm8988_spi_probe(struct spi_device *spi) in wm8988_spi_probe() argument
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()
858 spi_set_drvdata(spi, wm8988); 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()
926 printk(KERN_ERR "Failed to register WM8988 SPI driver: %d\n", in wm8988_modinit()