Lines Matching +full:adc +full:- +full:diff +full:- +full:channels
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * (C) Copyright 2010-2016
9 * Mylène Josserand <mylene.josserand@free-electrons.com>
23 #include <sound/soc-dapm.h>
114 regcache_cache_only(scodec->regmap, false); in sun8i_codec_runtime_resume()
116 ret = regcache_sync(scodec->regmap); in sun8i_codec_runtime_resume()
129 regcache_cache_only(scodec->regmap, true); in sun8i_codec_runtime_suspend()
130 regcache_mark_dirty(scodec->regmap); in sun8i_codec_runtime_suspend()
164 return -EINVAL; in sun8i_codec_get_hw_rate()
182 return -EINVAL; in sun8i_set_fmt()
184 regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL, in sun8i_set_fmt()
197 return -EINVAL; in sun8i_set_fmt()
199 regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL, in sun8i_set_fmt()
213 value ^= scodec->quirks->lrck_inversion; in sun8i_set_fmt()
214 regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL, in sun8i_set_fmt()
234 return -EINVAL; in sun8i_set_fmt()
236 regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL, in sun8i_set_fmt()
269 unsigned long clk_rate = clk_get_rate(scodec->clk_module); in sun8i_codec_get_bclk_div()
276 unsigned int diff = abs(bdiv->div - div); in sun8i_codec_get_bclk_div() local
278 if (diff < best_diff) { in sun8i_codec_get_bclk_div()
279 best_diff = diff; in sun8i_codec_get_bclk_div()
280 best_val = bdiv->val; in sun8i_codec_get_bclk_div()
287 static int sun8i_codec_get_lrck_div(unsigned int channels, in sun8i_codec_get_lrck_div() argument
290 unsigned int div = word_size * channels; in sun8i_codec_get_lrck_div()
293 return -EINVAL; in sun8i_codec_get_lrck_div()
295 return ilog2(div) - 4; in sun8i_codec_get_lrck_div()
310 regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL, in sun8i_codec_hw_params()
315 regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL, in sun8i_codec_hw_params()
324 regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL, in sun8i_codec_hw_params()
332 regmap_update_bits(scodec->regmap, SUN8I_SYS_SR_CTRL, in sun8i_codec_hw_params()
354 SOC_DAPM_DOUBLE("AIF1 Slot 0 Digital ADC Capture Switch",
358 SOC_DAPM_DOUBLE("AIF2 Digital ADC Capture Switch",
362 SOC_DAPM_DOUBLE("AIF1 Data Digital ADC Capture Switch",
366 SOC_DAPM_DOUBLE("AIF2 Inv Digital ADC Capture Switch",
394 SOC_DAPM_DOUBLE("ADC Digital DAC Playback Switch", SUN8I_DAC_MXR_SRC,
414 SND_SOC_DAPM_SUPPLY("CLK ADC",
425 SND_SOC_DAPM_SUPPLY("RST ADC",
433 SND_SOC_DAPM_SUPPLY("ADC",
440 /* AIF "ADC" Outputs */
448 /* AIF "ADC" Mono/Stereo Muxes */
454 /* AIF "ADC" Mixers */
474 /* ADC Inputs (connected to analog codec DAPM context) */
503 { "CLK ADC", NULL, "SYSCLK" },
504 { "RST ADC", NULL, "CLK ADC" },
505 { "ADC", NULL, "RST ADC" },
506 { "ADCL", NULL, "ADC" },
507 { "ADCR", NULL, "ADC" },
515 /* AIF "ADC" Output Routes */
519 /* AIF "ADC" Mono/Stereo Mux Routes */
534 /* AIF "ADC" Mixer Routes */
535 { "AIF1 AD0L Mixer", "AIF1 Slot 0 Digital ADC Capture Switch", "AIF1 DA0L Stereo Mux" },
536 { "AIF1 AD0L Mixer", "AIF1 Data Digital ADC Capture Switch", "ADCL" },
538 { "AIF1 AD0R Mixer", "AIF1 Slot 0 Digital ADC Capture Switch", "AIF1 DA0R Stereo Mux" },
539 { "AIF1 AD0R Mixer", "AIF1 Data Digital ADC Capture Switch", "ADCR" },
562 { "DACL Mixer", "ADC Digital DAC Playback Switch", "ADCL" },
565 { "DACR Mixer", "ADC Digital DAC Playback Switch", "ADCR" },
569 /* Legacy ADC Inputs (connected to analog codec DAPM context) */
570 SND_SOC_DAPM_ADC("AIF1 Slot 0 Left ADC", NULL, SND_SOC_NOPM, 0, 0),
571 SND_SOC_DAPM_ADC("AIF1 Slot 0 Right ADC", NULL, SND_SOC_NOPM, 0, 0),
579 /* Legacy ADC Routes */
580 { "ADCL", NULL, "AIF1 Slot 0 Left ADC" },
581 { "ADCR", NULL, "AIF1 Slot 0 Right ADC" },
595 if (scodec->quirks->legacy_widgets) { in sun8i_codec_component_probe()
613 regmap_update_bits(scodec->regmap, SUN8I_SYSCLK_CTL, in sun8i_codec_component_probe()
620 regmap_update_bits(scodec->regmap, SUN8I_SYSCLK_CTL, in sun8i_codec_component_probe()
682 scodec = devm_kzalloc(&pdev->dev, sizeof(*scodec), GFP_KERNEL); in sun8i_codec_probe()
684 return -ENOMEM; in sun8i_codec_probe()
686 scodec->clk_module = devm_clk_get(&pdev->dev, "mod"); in sun8i_codec_probe()
687 if (IS_ERR(scodec->clk_module)) { in sun8i_codec_probe()
688 dev_err(&pdev->dev, "Failed to get the module clock\n"); in sun8i_codec_probe()
689 return PTR_ERR(scodec->clk_module); in sun8i_codec_probe()
694 dev_err(&pdev->dev, "Failed to map the registers\n"); in sun8i_codec_probe()
698 scodec->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "bus", base, in sun8i_codec_probe()
700 if (IS_ERR(scodec->regmap)) { in sun8i_codec_probe()
701 dev_err(&pdev->dev, "Failed to create our regmap\n"); in sun8i_codec_probe()
702 return PTR_ERR(scodec->regmap); in sun8i_codec_probe()
705 scodec->quirks = of_device_get_match_data(&pdev->dev); in sun8i_codec_probe()
709 pm_runtime_enable(&pdev->dev); in sun8i_codec_probe()
710 if (!pm_runtime_enabled(&pdev->dev)) { in sun8i_codec_probe()
711 ret = sun8i_codec_runtime_resume(&pdev->dev); in sun8i_codec_probe()
716 ret = devm_snd_soc_register_component(&pdev->dev, &sun8i_soc_component, in sun8i_codec_probe()
719 dev_err(&pdev->dev, "Failed to register codec\n"); in sun8i_codec_probe()
726 if (!pm_runtime_status_suspended(&pdev->dev)) in sun8i_codec_probe()
727 sun8i_codec_runtime_suspend(&pdev->dev); in sun8i_codec_probe()
730 pm_runtime_disable(&pdev->dev); in sun8i_codec_probe()
737 pm_runtime_disable(&pdev->dev); in sun8i_codec_remove()
738 if (!pm_runtime_status_suspended(&pdev->dev)) in sun8i_codec_remove()
739 sun8i_codec_runtime_suspend(&pdev->dev); in sun8i_codec_remove()
753 { .compatible = "allwinner,sun8i-a33-codec", .data = &sun8i_a33_quirks },
754 { .compatible = "allwinner,sun50i-a64-codec", .data = &sun50i_a64_quirks },
766 .name = "sun8i-codec",
776 MODULE_AUTHOR("Mylène Josserand <mylene.josserand@free-electrons.com>");
778 MODULE_ALIAS("platform:sun8i-codec");