Lines Matching +full:sun4i +full:- +full:a10 +full:- +full:cpu +full:- +full:clk

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]>
19 #include <linux/clk.h>
121 * sun6i shares the same digital control and FIFO registers as sun4i,
330 struct clk *clk_apb;
331 struct clk *clk_module;
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()
745 /*** sun4i Codec ***/
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,
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,
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" },
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"},
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 */
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);
1540 .name = "sun4i-codec",
1543 .debugfs_prefix = "cpu",
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()
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()
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()
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()
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()
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()
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",
2394 MODULE_DESCRIPTION("Allwinner A10 codec driver");
2397 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
2398 MODULE_AUTHOR("Chen-Yu Tsai <[email protected]>");