Lines Matching +full:analog +full:- +full:amplifier

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright 2015 Maxime Ripard <maxime.ripard@free-electrons.com>
7 * Copyright 2016 Chen-Yu Tsai <[email protected]>
50 /* Codec DAC side analog signal controls */
89 /* Codec ADC side analog signal controls */
123 * have been moved around to accommodate extra analog controls.
205 /* Analog performance tuning controls */
308 /* Analog Input Mixer controls */
347 regmap_field_set_bits(scodec->reg_dac_fifoc, in sun4i_codec_start_playback()
351 regmap_field_set_bits(scodec->reg_dac_fifoc, in sun4i_codec_start_playback()
358 regmap_field_clear_bits(scodec->reg_dac_fifoc, in sun4i_codec_stop_playback()
365 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_start_capture()
372 regmap_field_clear_bits(scodec->reg_adc_fifoc, in sun4i_codec_stop_capture()
380 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_trigger()
386 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_trigger()
395 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_trigger()
402 return -EINVAL; in sun4i_codec_trigger()
412 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_prepare_capture()
416 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_prepare_capture()
421 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_prepare_capture()
430 if (of_device_is_compatible(scodec->dev->of_node, in sun4i_codec_prepare_capture()
431 "allwinner,sun4i-a10-codec") || in sun4i_codec_prepare_capture()
432 of_device_is_compatible(scodec->dev->of_node, in sun4i_codec_prepare_capture()
433 "allwinner,sun7i-a20-codec")) { in sun4i_codec_prepare_capture()
434 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_ACTL, in sun4i_codec_prepare_capture()
439 if (of_device_is_compatible(scodec->dev->of_node, in sun4i_codec_prepare_capture()
440 "allwinner,sun7i-a20-codec")) in sun4i_codec_prepare_capture()
442 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_TUNE, in sun4i_codec_prepare_capture()
453 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_prepare_playback()
457 regmap_field_set_bits(scodec->reg_dac_fifoc, in sun4i_codec_prepare_playback()
461 regmap_field_update_bits(scodec->reg_dac_fifoc, in sun4i_codec_prepare_playback()
465 if (substream->runtime->rate > 32000) in sun4i_codec_prepare_playback()
472 regmap_field_update_bits(scodec->reg_dac_fifoc, in sun4i_codec_prepare_playback()
477 regmap_field_clear_bits(scodec->reg_dac_fifoc, in sun4i_codec_prepare_playback()
486 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_prepare()
560 return -EINVAL; in sun4i_codec_get_hw_rate()
569 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
575 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
578 regmap_field_clear_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
582 if (hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min == 32) { in sun4i_codec_hw_params_capture()
583 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
586 regmap_field_clear_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
589 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in sun4i_codec_hw_params_capture()
591 regmap_field_clear_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
595 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
598 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_hw_params_capture()
611 regmap_field_update_bits(scodec->reg_dac_fifoc, in sun4i_codec_hw_params_playback()
621 regmap_field_update_bits(scodec->reg_dac_fifoc, in sun4i_codec_hw_params_playback()
626 if (hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min == 32) { in sun4i_codec_hw_params_playback()
627 regmap_field_set_bits(scodec->reg_dac_fifoc, in sun4i_codec_hw_params_playback()
631 regmap_field_clear_bits(scodec->reg_dac_fifoc, in sun4i_codec_hw_params_playback()
634 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in sun4i_codec_hw_params_playback()
636 regmap_field_clear_bits(scodec->reg_dac_fifoc, in sun4i_codec_hw_params_playback()
640 regmap_field_set_bits(scodec->reg_dac_fifoc, in sun4i_codec_hw_params_playback()
643 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_hw_params_playback()
654 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_hw_params()
660 return -EINVAL; in sun4i_codec_hw_params()
662 ret = clk_set_rate(scodec->clk_module, clk_freq); in sun4i_codec_hw_params()
670 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_hw_params()
682 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_startup()
688 regmap_field_set_bits(scodec->reg_dac_fifoc, in sun4i_codec_startup()
691 return clk_prepare_enable(scodec->clk_module); in sun4i_codec_startup()
698 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_shutdown()
700 clk_disable_unprepare(scodec->clk_module); in sun4i_codec_shutdown()
750 static DECLARE_TLV_DB_SCALE(sun4i_codec_pa_volume_scale, -6300, 100, 1);
751 static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_loopback_gain_scale, -150, 150,
753 static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_preamp_gain_scale, -1200, 300,
755 static DECLARE_TLV_DB_SCALE(sun4i_codec_fmin_loopback_gain_scale, -450, 150,
757 static DECLARE_TLV_DB_SCALE(sun4i_codec_micin_loopback_gain_scale, -450, 150,
767 SOC_SINGLE_TLV("Power Amplifier Volume", SUN4I_CODEC_DAC_ACTL,
791 SOC_SINGLE_TLV("Power Amplifier Volume", SUN4I_CODEC_DAC_ACTL,
856 /* Analog parts of the ADCs */
862 /* Analog parts of the DACs */
884 /* Mic Pre-Amplifiers */
885 SND_SOC_DAPM_PGA("MIC1 Pre-Amplifier", SUN4I_CODEC_ADC_ACTL,
887 SND_SOC_DAPM_PGA("MIC2 Pre-Amplifier", SUN4I_CODEC_ADC_ACTL,
890 /* Power Amplifier */
891 SND_SOC_DAPM_MIXER("Power Amplifier", SUN4I_CODEC_ADC_ACTL,
895 SND_SOC_DAPM_SWITCH("Power Amplifier Mute", SND_SOC_NOPM, 0, 0,
924 { "Right Mixer", "Mic1 Playback Switch", "MIC1 Pre-Amplifier" },
925 { "Right Mixer", "Mic2 Playback Switch", "MIC2 Pre-Amplifier" },
932 { "Left Mixer", "Mic1 Playback Switch", "MIC1 Pre-Amplifier" },
933 { "Left Mixer", "Mic2 Playback Switch", "MIC2 Pre-Amplifier" },
935 /* Power Amplifier Routes */
936 { "Power Amplifier", "Mixer Playback Switch", "Left Mixer" },
937 { "Power Amplifier", "Mixer Playback Switch", "Right Mixer" },
938 { "Power Amplifier", "DAC Playback Switch", "Left DAC" },
939 { "Power Amplifier", "DAC Playback Switch", "Right DAC" },
942 { "Power Amplifier Mute", "Switch", "Power Amplifier" },
943 { "HP Right", NULL, "Power Amplifier Mute" },
944 { "HP Left", NULL, "Power Amplifier Mute" },
947 { "Left ADC", NULL, "MIC1 Pre-Amplifier" },
948 { "Right ADC", NULL, "MIC1 Pre-Amplifier" },
949 { "MIC1 Pre-Amplifier", NULL, "Mic1"},
953 { "Left ADC", NULL, "MIC2 Pre-Amplifier" },
954 { "Right ADC", NULL, "MIC2 Pre-Amplifier" },
955 { "MIC2 Pre-Amplifier", NULL, "Mic2"},
1060 SOC_DAPM_ENUM("Mic2 Amplifier Source Route",
1081 static const DECLARE_TLV_DB_SCALE(sun6i_codec_dvol_scale, -7308, 116, 0);
1082 static const DECLARE_TLV_DB_SCALE(sun6i_codec_hp_vol_scale, -6300, 100, 1);
1084 -450, 150, 0);
1087 2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
1114 /* Mixer pre-gains */
1151 SND_SOC_DAPM_MUX("Mic2 Amplifier Source Route",
1153 SND_SOC_DAPM_PGA("Mic1 Amplifier", SUN6I_CODEC_MIC_CTRL,
1155 SND_SOC_DAPM_PGA("Mic2 Amplifier", SUN6I_CODEC_MIC_CTRL,
1166 /* Analog parts of the ADCs */
1183 /* Analog parts of the DACs */
1222 { "Mic1 Amplifier", NULL, "MIC1"},
1223 { "Mic2 Amplifier Source Route", "Mic2", "MIC2" },
1224 { "Mic2 Amplifier Source Route", "Mic3", "MIC3" },
1225 { "Mic2 Amplifier", NULL, "Mic2 Amplifier Source Route"},
1231 { "Left Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
1232 { "Left Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
1238 { "Right Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
1239 { "Right Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
1245 { "Left ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
1246 { "Left ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
1252 { "Right ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
1253 { "Right ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
1377 static const DECLARE_TLV_DB_SCALE(suniv_codec_dvol_scale, -7308, 116, 0);
1378 static const DECLARE_TLV_DB_SCALE(suniv_codec_hp_vol_scale, -6300, 100, 1);
1380 -450, 150, 0);
1426 SND_SOC_DAPM_PGA("Mic Amplifier", SUNIV_CODEC_ADC_ACTL,
1441 /* Analog parts of the ADCs */
1455 /* Analog parts of the DACs */
1489 { "Mic Amplifier", NULL, "MIC"},
1496 { "Left Mixer", "Mic In Playback Switch", "Mic Amplifier" },
1503 { "Right Mixer", "Mic In Playback Switch", "Mic Amplifier" },
1511 { "ADC Mixer", "Mic Capture Switch", "Mic Amplifier" },
1540 .name = "sun4i-codec",
1555 snd_soc_dai_init_dma_data(dai, &scodec->playback_dma_data, in sun4i_codec_dai_probe()
1556 &scodec->capture_dma_data); in sun4i_codec_dai_probe()
1566 .name = "sun4i-codec-cpu-dai",
1596 link->cpus = &dlc[0]; in sun4i_codec_create_link()
1597 link->codecs = &dlc[1]; in sun4i_codec_create_link()
1598 link->platforms = &dlc[2]; in sun4i_codec_create_link()
1600 link->num_cpus = 1; in sun4i_codec_create_link()
1601 link->num_codecs = 1; in sun4i_codec_create_link()
1602 link->num_platforms = 1; in sun4i_codec_create_link()
1604 link->name = "cdc"; in sun4i_codec_create_link()
1605 link->stream_name = "CDC PCM"; in sun4i_codec_create_link()
1606 link->codecs->dai_name = "Codec"; in sun4i_codec_create_link()
1607 link->cpus->dai_name = dev_name(dev); in sun4i_codec_create_link()
1608 link->codecs->name = dev_name(dev); in sun4i_codec_create_link()
1609 link->platforms->name = dev_name(dev); in sun4i_codec_create_link()
1610 link->dai_fmt = SND_SOC_DAIFMT_I2S; in sun4i_codec_create_link()
1620 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(w->dapm->card); in sun4i_codec_spk_event()
1622 gpiod_set_value_cansleep(scodec->gpio_pa, in sun4i_codec_spk_event()
1652 return ERR_PTR(-ENOMEM); in sun4i_codec_create_card()
1654 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun4i_codec_create_card()
1655 if (!card->dai_link) in sun4i_codec_create_card()
1656 return ERR_PTR(-ENOMEM); in sun4i_codec_create_card()
1658 card->dev = dev; in sun4i_codec_create_card()
1659 card->owner = THIS_MODULE; in sun4i_codec_create_card()
1660 card->name = "sun4i-codec"; in sun4i_codec_create_card()
1661 card->dapm_widgets = sun4i_codec_card_dapm_widgets; in sun4i_codec_create_card()
1662 card->num_dapm_widgets = ARRAY_SIZE(sun4i_codec_card_dapm_widgets); in sun4i_codec_create_card()
1663 card->dapm_routes = sun4i_codec_card_dapm_routes; in sun4i_codec_create_card()
1664 card->num_dapm_routes = ARRAY_SIZE(sun4i_codec_card_dapm_routes); in sun4i_codec_create_card()
1685 return ERR_PTR(-ENOMEM); in sun6i_codec_create_card()
1687 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun6i_codec_create_card()
1688 if (!card->dai_link) in sun6i_codec_create_card()
1689 return ERR_PTR(-ENOMEM); in sun6i_codec_create_card()
1691 card->dev = dev; in sun6i_codec_create_card()
1692 card->owner = THIS_MODULE; in sun6i_codec_create_card()
1693 card->name = "A31 Audio Codec"; in sun6i_codec_create_card()
1694 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun6i_codec_create_card()
1695 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun6i_codec_create_card()
1696 card->fully_routed = true; in sun6i_codec_create_card()
1698 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun6i_codec_create_card()
1700 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun6i_codec_create_card()
1705 /* Connect digital side enables to analog side widgets */
1731 return ERR_PTR(-ENOMEM); in sun8i_a23_codec_create_card()
1733 aux_dev.dlc.of_node = of_parse_phandle(dev->of_node, in sun8i_a23_codec_create_card()
1734 "allwinner,codec-analog-controls", in sun8i_a23_codec_create_card()
1737 dev_err(dev, "Can't find analog controls for codec.\n"); in sun8i_a23_codec_create_card()
1738 return ERR_PTR(-EINVAL); in sun8i_a23_codec_create_card()
1741 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun8i_a23_codec_create_card()
1742 if (!card->dai_link) in sun8i_a23_codec_create_card()
1743 return ERR_PTR(-ENOMEM); in sun8i_a23_codec_create_card()
1745 card->dev = dev; in sun8i_a23_codec_create_card()
1746 card->owner = THIS_MODULE; in sun8i_a23_codec_create_card()
1747 card->name = "A23 Audio Codec"; in sun8i_a23_codec_create_card()
1748 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun8i_a23_codec_create_card()
1749 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun8i_a23_codec_create_card()
1750 card->dapm_routes = sun8i_codec_card_routes; in sun8i_a23_codec_create_card()
1751 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); in sun8i_a23_codec_create_card()
1752 card->aux_dev = &aux_dev; in sun8i_a23_codec_create_card()
1753 card->num_aux_devs = 1; in sun8i_a23_codec_create_card()
1754 card->fully_routed = true; in sun8i_a23_codec_create_card()
1756 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun8i_a23_codec_create_card()
1758 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun8i_a23_codec_create_card()
1770 return ERR_PTR(-ENOMEM); in sun8i_h3_codec_create_card()
1772 aux_dev.dlc.of_node = of_parse_phandle(dev->of_node, in sun8i_h3_codec_create_card()
1773 "allwinner,codec-analog-controls", in sun8i_h3_codec_create_card()
1776 dev_err(dev, "Can't find analog controls for codec.\n"); in sun8i_h3_codec_create_card()
1777 return ERR_PTR(-EINVAL); in sun8i_h3_codec_create_card()
1780 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun8i_h3_codec_create_card()
1781 if (!card->dai_link) in sun8i_h3_codec_create_card()
1782 return ERR_PTR(-ENOMEM); in sun8i_h3_codec_create_card()
1784 card->dev = dev; in sun8i_h3_codec_create_card()
1785 card->owner = THIS_MODULE; in sun8i_h3_codec_create_card()
1786 card->name = "H3 Audio Codec"; in sun8i_h3_codec_create_card()
1787 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun8i_h3_codec_create_card()
1788 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun8i_h3_codec_create_card()
1789 card->dapm_routes = sun8i_codec_card_routes; in sun8i_h3_codec_create_card()
1790 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); in sun8i_h3_codec_create_card()
1791 card->aux_dev = &aux_dev; in sun8i_h3_codec_create_card()
1792 card->num_aux_devs = 1; in sun8i_h3_codec_create_card()
1793 card->fully_routed = true; in sun8i_h3_codec_create_card()
1795 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun8i_h3_codec_create_card()
1797 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun8i_h3_codec_create_card()
1809 return ERR_PTR(-ENOMEM); in sun8i_v3s_codec_create_card()
1811 aux_dev.dlc.of_node = of_parse_phandle(dev->of_node, in sun8i_v3s_codec_create_card()
1812 "allwinner,codec-analog-controls", in sun8i_v3s_codec_create_card()
1815 dev_err(dev, "Can't find analog controls for codec.\n"); in sun8i_v3s_codec_create_card()
1816 return ERR_PTR(-EINVAL); in sun8i_v3s_codec_create_card()
1819 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun8i_v3s_codec_create_card()
1820 if (!card->dai_link) in sun8i_v3s_codec_create_card()
1821 return ERR_PTR(-ENOMEM); in sun8i_v3s_codec_create_card()
1823 card->dev = dev; in sun8i_v3s_codec_create_card()
1824 card->owner = THIS_MODULE; in sun8i_v3s_codec_create_card()
1825 card->name = "V3s Audio Codec"; in sun8i_v3s_codec_create_card()
1826 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun8i_v3s_codec_create_card()
1827 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun8i_v3s_codec_create_card()
1828 card->dapm_routes = sun8i_codec_card_routes; in sun8i_v3s_codec_create_card()
1829 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); in sun8i_v3s_codec_create_card()
1830 card->aux_dev = &aux_dev; in sun8i_v3s_codec_create_card()
1831 card->num_aux_devs = 1; in sun8i_v3s_codec_create_card()
1832 card->fully_routed = true; in sun8i_v3s_codec_create_card()
1834 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun8i_v3s_codec_create_card()
1836 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun8i_v3s_codec_create_card()
1883 /* Analog parts of the DACs */
1927 /* Connect digital side enables to analog side widgets */
1957 return ERR_PTR(-ENOMEM); in sun50i_h616_codec_create_card()
1959 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun50i_h616_codec_create_card()
1960 if (!card->dai_link) in sun50i_h616_codec_create_card()
1961 return ERR_PTR(-ENOMEM); in sun50i_h616_codec_create_card()
1963 card->dai_link->playback_only = true; in sun50i_h616_codec_create_card()
1964 card->dai_link->capture_only = false; in sun50i_h616_codec_create_card()
1966 card->dev = dev; in sun50i_h616_codec_create_card()
1967 card->owner = THIS_MODULE; in sun50i_h616_codec_create_card()
1968 card->name = "H616 Audio Codec"; in sun50i_h616_codec_create_card()
1969 card->driver_name = "sun4i-codec"; in sun50i_h616_codec_create_card()
1970 card->controls = sun50i_h616_card_controls; in sun50i_h616_codec_create_card()
1971 card->num_controls = ARRAY_SIZE(sun50i_h616_card_controls); in sun50i_h616_codec_create_card()
1972 card->dapm_widgets = sun50i_h616_codec_card_dapm_widgets; in sun50i_h616_codec_create_card()
1973 card->num_dapm_widgets = ARRAY_SIZE(sun50i_h616_codec_card_dapm_widgets); in sun50i_h616_codec_create_card()
1974 card->dapm_routes = sun50i_h616_codec_card_routes; in sun50i_h616_codec_create_card()
1975 card->num_dapm_routes = ARRAY_SIZE(sun50i_h616_codec_card_routes); in sun50i_h616_codec_create_card()
1976 card->fully_routed = true; in sun50i_h616_codec_create_card()
1978 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun50i_h616_codec_create_card()
1980 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun50i_h616_codec_create_card()
1994 /* Connect digital side enables to analog side widgets */
2014 return ERR_PTR(-ENOMEM); in suniv_codec_create_card()
2016 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in suniv_codec_create_card()
2017 if (!card->dai_link) in suniv_codec_create_card()
2018 return ERR_PTR(-ENOMEM); in suniv_codec_create_card()
2020 card->dev = dev; in suniv_codec_create_card()
2021 card->name = "F1C100s Audio Codec"; in suniv_codec_create_card()
2022 card->dapm_widgets = suniv_codec_card_dapm_widgets; in suniv_codec_create_card()
2023 card->num_dapm_widgets = ARRAY_SIZE(suniv_codec_card_dapm_widgets); in suniv_codec_create_card()
2024 card->dapm_routes = suniv_codec_card_routes; in suniv_codec_create_card()
2025 card->num_dapm_routes = ARRAY_SIZE(suniv_codec_card_routes); in suniv_codec_create_card()
2026 card->fully_routed = true; in suniv_codec_create_card()
2028 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in suniv_codec_create_card()
2030 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in suniv_codec_create_card()
2208 .compatible = "allwinner,sun4i-a10-codec",
2212 .compatible = "allwinner,sun6i-a31-codec",
2216 .compatible = "allwinner,sun7i-a20-codec",
2220 .compatible = "allwinner,sun8i-a23-codec",
2224 .compatible = "allwinner,sun8i-h3-codec",
2228 .compatible = "allwinner,sun8i-v3s-codec",
2232 .compatible = "allwinner,sun50i-h616-codec",
2236 .compatible = "allwinner,suniv-f1c100s-codec",
2252 scodec = devm_kzalloc(&pdev->dev, sizeof(*scodec), GFP_KERNEL); in sun4i_codec_probe()
2254 return -ENOMEM; in sun4i_codec_probe()
2256 scodec->dev = &pdev->dev; in sun4i_codec_probe()
2262 quirks = of_device_get_match_data(&pdev->dev); in sun4i_codec_probe()
2264 dev_err(&pdev->dev, "Failed to determine the quirks to use\n"); in sun4i_codec_probe()
2265 return -ENODEV; in sun4i_codec_probe()
2268 scodec->regmap = devm_regmap_init_mmio(&pdev->dev, base, in sun4i_codec_probe()
2269 quirks->regmap_config); in sun4i_codec_probe()
2270 if (IS_ERR(scodec->regmap)) { in sun4i_codec_probe()
2271 dev_err(&pdev->dev, "Failed to create our regmap\n"); in sun4i_codec_probe()
2272 return PTR_ERR(scodec->regmap); in sun4i_codec_probe()
2276 scodec->clk_apb = devm_clk_get_enabled(&pdev->dev, "apb"); in sun4i_codec_probe()
2277 if (IS_ERR(scodec->clk_apb)) { in sun4i_codec_probe()
2278 dev_err(&pdev->dev, "Failed to get the APB clock\n"); in sun4i_codec_probe()
2279 return PTR_ERR(scodec->clk_apb); in sun4i_codec_probe()
2282 scodec->clk_module = devm_clk_get(&pdev->dev, "codec"); in sun4i_codec_probe()
2283 if (IS_ERR(scodec->clk_module)) { in sun4i_codec_probe()
2284 dev_err(&pdev->dev, "Failed to get the module clock\n"); in sun4i_codec_probe()
2285 return PTR_ERR(scodec->clk_module); in sun4i_codec_probe()
2288 if (quirks->has_reset) { in sun4i_codec_probe()
2289 scodec->rst = devm_reset_control_get_exclusive_deasserted(&pdev->dev, NULL); in sun4i_codec_probe()
2290 if (IS_ERR(scodec->rst)) { in sun4i_codec_probe()
2291 dev_err(&pdev->dev, "Failed to get reset control\n"); in sun4i_codec_probe()
2292 return PTR_ERR(scodec->rst); in sun4i_codec_probe()
2296 scodec->gpio_pa = devm_gpiod_get_optional(&pdev->dev, "allwinner,pa", in sun4i_codec_probe()
2298 if (IS_ERR(scodec->gpio_pa)) { in sun4i_codec_probe()
2299 ret = PTR_ERR(scodec->gpio_pa); in sun4i_codec_probe()
2300 dev_err_probe(&pdev->dev, ret, "Failed to get pa gpio\n"); in sun4i_codec_probe()
2305 scodec->reg_adc_fifoc = devm_regmap_field_alloc(&pdev->dev, in sun4i_codec_probe()
2306 scodec->regmap, in sun4i_codec_probe()
2307 quirks->reg_adc_fifoc); in sun4i_codec_probe()
2308 if (IS_ERR(scodec->reg_adc_fifoc)) { in sun4i_codec_probe()
2309 ret = PTR_ERR(scodec->reg_adc_fifoc); in sun4i_codec_probe()
2310 dev_err(&pdev->dev, "Failed to create regmap fields: %d\n", in sun4i_codec_probe()
2315 scodec->reg_dac_fifoc = devm_regmap_field_alloc(&pdev->dev, in sun4i_codec_probe()
2316 scodec->regmap, in sun4i_codec_probe()
2317 quirks->reg_dac_fifoc); in sun4i_codec_probe()
2318 if (IS_ERR(scodec->reg_dac_fifoc)) { in sun4i_codec_probe()
2319 ret = PTR_ERR(scodec->reg_dac_fifoc); in sun4i_codec_probe()
2320 dev_err(&pdev->dev, "Failed to create regmap fields: %d\n", in sun4i_codec_probe()
2326 scodec->playback_dma_data.addr = res->start + quirks->reg_dac_txdata; in sun4i_codec_probe()
2327 scodec->playback_dma_data.maxburst = quirks->dma_max_burst; in sun4i_codec_probe()
2328 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_probe()
2330 if (!quirks->playback_only) { in sun4i_codec_probe()
2332 scodec->capture_dma_data.addr = res->start + in sun4i_codec_probe()
2333 quirks->reg_adc_rxdata; in sun4i_codec_probe()
2334 scodec->capture_dma_data.maxburst = quirks->dma_max_burst; in sun4i_codec_probe()
2335 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_probe()
2338 ret = devm_snd_soc_register_component(&pdev->dev, quirks->codec, in sun4i_codec_probe()
2341 dev_err(&pdev->dev, "Failed to register our codec\n"); in sun4i_codec_probe()
2345 ret = devm_snd_soc_register_component(&pdev->dev, in sun4i_codec_probe()
2349 dev_err(&pdev->dev, "Failed to register our DAI\n"); in sun4i_codec_probe()
2353 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); in sun4i_codec_probe()
2355 dev_err(&pdev->dev, "Failed to register against DMAEngine\n"); in sun4i_codec_probe()
2359 card = quirks->create_card(&pdev->dev); in sun4i_codec_probe()
2362 dev_err(&pdev->dev, "Failed to create our card\n"); in sun4i_codec_probe()
2370 dev_err_probe(&pdev->dev, ret, "Failed to register our card\n"); in sun4i_codec_probe()
2386 .name = "sun4i-codec",
2397 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
2398 MODULE_AUTHOR("Chen-Yu Tsai <[email protected]>");