Lines Matching +full:sun8i +full:- +full:a23 +full:- +full:codec +full:- +full:analog

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 <wens@csie.org>
36 /* Codec DAC digital controls and FIFO registers */
54 /* Codec DAC side analog signal controls */
80 /* Codec ADC digital controls and FIFO registers */
93 /* Codec ADC side analog signal controls */
127 * have been moved around to accommodate extra analog controls.
130 /* Codec DAC digital controls and FIFO registers */
209 /* Analog performance tuning controls */
225 /* FIFO counters moved on A23 */
255 regmap_set_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_start_playback()
259 regmap_set_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_start_playback()
266 regmap_clear_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_stop_playback()
273 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_start_capture()
280 regmap_field_clear_bits(scodec->reg_adc_fifoc, in sun4i_codec_stop_capture()
288 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_trigger()
294 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_trigger()
303 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_trigger()
310 return -EINVAL; in sun4i_codec_trigger()
320 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_prepare_capture()
324 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_prepare_capture()
329 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_prepare_capture()
338 if (of_device_is_compatible(scodec->dev->of_node, in sun4i_codec_prepare_capture()
339 "allwinner,sun4i-a10-codec") || in sun4i_codec_prepare_capture()
340 of_device_is_compatible(scodec->dev->of_node, in sun4i_codec_prepare_capture()
341 "allwinner,sun7i-a20-codec")) { in sun4i_codec_prepare_capture()
342 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_ACTL, in sun4i_codec_prepare_capture()
347 if (of_device_is_compatible(scodec->dev->of_node, in sun4i_codec_prepare_capture()
348 "allwinner,sun7i-a20-codec")) in sun4i_codec_prepare_capture()
350 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_TUNE, in sun4i_codec_prepare_capture()
361 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_prepare_playback()
365 regmap_set_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_prepare_playback()
369 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_prepare_playback()
373 if (substream->runtime->rate > 32000) in sun4i_codec_prepare_playback()
380 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_prepare_playback()
385 regmap_clear_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_prepare_playback()
394 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_prepare()
468 return -EINVAL; in sun4i_codec_get_hw_rate()
477 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
483 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
486 regmap_field_clear_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
490 if (hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min == 32) { in sun4i_codec_hw_params_capture()
491 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
494 regmap_field_clear_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
497 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in sun4i_codec_hw_params_capture()
499 regmap_field_clear_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
503 regmap_field_set_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
506 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_hw_params_capture()
519 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
529 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
534 if (hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min == 32) { in sun4i_codec_hw_params_playback()
535 regmap_set_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
539 regmap_clear_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
542 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in sun4i_codec_hw_params_playback()
544 regmap_clear_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
548 regmap_set_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
551 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_hw_params_playback()
562 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_hw_params()
568 return -EINVAL; in sun4i_codec_hw_params()
570 ret = clk_set_rate(scodec->clk_module, clk_freq); in sun4i_codec_hw_params()
578 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_hw_params()
603 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_startup()
605 snd_pcm_hw_constraint_list(substream->runtime, 0, in sun4i_codec_startup()
612 regmap_set_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_startup()
615 return clk_prepare_enable(scodec->clk_module); in sun4i_codec_startup()
622 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_shutdown()
624 clk_disable_unprepare(scodec->clk_module); in sun4i_codec_shutdown()
636 .name = "Codec",
639 .stream_name = "Codec Playback",
650 .stream_name = "Codec Capture",
662 /*** sun4i Codec ***/
667 static DECLARE_TLV_DB_SCALE(sun4i_codec_pa_volume_scale, -6300, 100, 1);
668 static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_loopback_gain_scale, -150, 150,
670 static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_preamp_gain_scale, -1200, 300,
672 static DECLARE_TLV_DB_SCALE(sun4i_codec_fmin_loopback_gain_scale, -450, 150,
674 static DECLARE_TLV_DB_SCALE(sun4i_codec_micin_loopback_gain_scale, -450, 150,
773 /* Analog parts of the ADCs */
774 SND_SOC_DAPM_ADC("Left ADC", "Codec Capture", SUN4I_CODEC_ADC_ACTL,
776 SND_SOC_DAPM_ADC("Right ADC", "Codec Capture", SUN4I_CODEC_ADC_ACTL,
779 /* Analog parts of the DACs */
780 SND_SOC_DAPM_DAC("Left DAC", "Codec Playback", SUN4I_CODEC_DAC_ACTL,
782 SND_SOC_DAPM_DAC("Right DAC", "Codec Playback", SUN4I_CODEC_DAC_ACTL,
801 /* Mic Pre-Amplifiers */
802 SND_SOC_DAPM_PGA("MIC1 Pre-Amplifier", SUN4I_CODEC_ADC_ACTL,
804 SND_SOC_DAPM_PGA("MIC2 Pre-Amplifier", SUN4I_CODEC_ADC_ACTL,
841 { "Right Mixer", "Mic1 Playback Switch", "MIC1 Pre-Amplifier" },
842 { "Right Mixer", "Mic2 Playback Switch", "MIC2 Pre-Amplifier" },
849 { "Left Mixer", "Mic1 Playback Switch", "MIC1 Pre-Amplifier" },
850 { "Left Mixer", "Mic2 Playback Switch", "MIC2 Pre-Amplifier" },
864 { "Left ADC", NULL, "MIC1 Pre-Amplifier" },
865 { "Right ADC", NULL, "MIC1 Pre-Amplifier" },
866 { "MIC1 Pre-Amplifier", NULL, "Mic1"},
870 { "Left ADC", NULL, "MIC2 Pre-Amplifier" },
871 { "Right ADC", NULL, "MIC2 Pre-Amplifier" },
872 { "MIC2 Pre-Amplifier", NULL, "Mic2"},
900 /*** sun6i Codec ***/
998 static const DECLARE_TLV_DB_SCALE(sun6i_codec_dvol_scale, -7308, 116, 0);
999 static const DECLARE_TLV_DB_SCALE(sun6i_codec_hp_vol_scale, -6300, 100, 1);
1001 -450, 150, 0);
1004 2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
1031 /* Mixer pre-gains */
1083 /* Analog parts of the ADCs */
1084 SND_SOC_DAPM_ADC("Left ADC", "Codec Capture", SUN6I_CODEC_ADC_ACTL,
1086 SND_SOC_DAPM_ADC("Right ADC", "Codec Capture", SUN6I_CODEC_ADC_ACTL,
1100 /* Analog parts of the DACs */
1101 SND_SOC_DAPM_DAC("Left DAC", "Codec Playback",
1104 SND_SOC_DAPM_DAC("Right DAC", "Codec Playback",
1207 /* sun8i A23 codec */
1235 .name = "sun4i-codec",
1251 snd_soc_dai_init_dma_data(dai, &scodec->playback_dma_data, in sun4i_codec_dai_probe()
1252 &scodec->capture_dma_data); in sun4i_codec_dai_probe()
1262 .name = "sun4i-codec-cpu-dai",
1289 .name = "hp-det",
1296 struct snd_soc_card *card = rtd->card; in sun4i_codec_machine_init()
1300 if (scodec->gpio_hp) { in sun4i_codec_machine_init()
1307 dev_err(rtd->dev, in sun4i_codec_machine_init()
1312 sun4i_headphone_jack_gpio.desc = scodec->gpio_hp; in sun4i_codec_machine_init()
1317 dev_err(rtd->dev, "Headphone GPIO not added: %d\n", ret); in sun4i_codec_machine_init()
1335 link->cpus = &dlc[0]; in sun4i_codec_create_link()
1336 link->codecs = &dlc[1]; in sun4i_codec_create_link()
1337 link->platforms = &dlc[2]; in sun4i_codec_create_link()
1339 link->num_cpus = 1; in sun4i_codec_create_link()
1340 link->num_codecs = 1; in sun4i_codec_create_link()
1341 link->num_platforms = 1; in sun4i_codec_create_link()
1343 link->name = "cdc"; in sun4i_codec_create_link()
1344 link->stream_name = "CDC PCM"; in sun4i_codec_create_link()
1345 link->codecs->dai_name = "Codec"; in sun4i_codec_create_link()
1346 link->cpus->dai_name = dev_name(dev); in sun4i_codec_create_link()
1347 link->codecs->name = dev_name(dev); in sun4i_codec_create_link()
1348 link->platforms->name = dev_name(dev); in sun4i_codec_create_link()
1349 link->dai_fmt = SND_SOC_DAIFMT_I2S; in sun4i_codec_create_link()
1350 link->init = sun4i_codec_machine_init; in sun4i_codec_create_link()
1360 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(w->dapm->card); in sun4i_codec_spk_event()
1362 gpiod_set_value_cansleep(scodec->gpio_pa, in sun4i_codec_spk_event()
1392 return ERR_PTR(-ENOMEM); in sun4i_codec_create_card()
1394 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun4i_codec_create_card()
1395 if (!card->dai_link) in sun4i_codec_create_card()
1396 return ERR_PTR(-ENOMEM); in sun4i_codec_create_card()
1398 card->dev = dev; in sun4i_codec_create_card()
1399 card->owner = THIS_MODULE; in sun4i_codec_create_card()
1400 card->name = "sun4i-codec"; in sun4i_codec_create_card()
1401 card->dapm_widgets = sun4i_codec_card_dapm_widgets; in sun4i_codec_create_card()
1402 card->num_dapm_widgets = ARRAY_SIZE(sun4i_codec_card_dapm_widgets); in sun4i_codec_create_card()
1403 card->dapm_routes = sun4i_codec_card_dapm_routes; in sun4i_codec_create_card()
1404 card->num_dapm_routes = ARRAY_SIZE(sun4i_codec_card_dapm_routes); in sun4i_codec_create_card()
1425 return ERR_PTR(-ENOMEM); in sun6i_codec_create_card()
1427 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun6i_codec_create_card()
1428 if (!card->dai_link) in sun6i_codec_create_card()
1429 return ERR_PTR(-ENOMEM); in sun6i_codec_create_card()
1431 card->dev = dev; in sun6i_codec_create_card()
1432 card->owner = THIS_MODULE; in sun6i_codec_create_card()
1433 card->name = "A31 Audio Codec"; in sun6i_codec_create_card()
1434 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun6i_codec_create_card()
1435 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun6i_codec_create_card()
1436 card->fully_routed = true; in sun6i_codec_create_card()
1438 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun6i_codec_create_card()
1440 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun6i_codec_create_card()
1445 /* Connect digital side enables to analog side widgets */
1450 { "Codec Capture", NULL, "Left ADC" },
1451 { "Codec Capture", NULL, "Right ADC" },
1456 { "Left DAC", NULL, "Codec Playback" },
1457 { "Right DAC", NULL, "Codec Playback" },
1471 return ERR_PTR(-ENOMEM); in sun8i_a23_codec_create_card()
1473 aux_dev.dlc.of_node = of_parse_phandle(dev->of_node, in sun8i_a23_codec_create_card()
1474 "allwinner,codec-analog-controls", in sun8i_a23_codec_create_card()
1477 dev_err(dev, "Can't find analog controls for codec.\n"); in sun8i_a23_codec_create_card()
1478 return ERR_PTR(-EINVAL); in sun8i_a23_codec_create_card()
1481 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun8i_a23_codec_create_card()
1482 if (!card->dai_link) in sun8i_a23_codec_create_card()
1483 return ERR_PTR(-ENOMEM); in sun8i_a23_codec_create_card()
1485 card->dev = dev; in sun8i_a23_codec_create_card()
1486 card->owner = THIS_MODULE; in sun8i_a23_codec_create_card()
1487 card->name = "A23 Audio Codec"; in sun8i_a23_codec_create_card()
1488 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun8i_a23_codec_create_card()
1489 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun8i_a23_codec_create_card()
1490 card->dapm_routes = sun8i_codec_card_routes; in sun8i_a23_codec_create_card()
1491 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); in sun8i_a23_codec_create_card()
1492 card->aux_dev = &aux_dev; in sun8i_a23_codec_create_card()
1493 card->num_aux_devs = 1; in sun8i_a23_codec_create_card()
1494 card->fully_routed = true; in sun8i_a23_codec_create_card()
1496 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun8i_a23_codec_create_card()
1498 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun8i_a23_codec_create_card()
1510 return ERR_PTR(-ENOMEM); in sun8i_h3_codec_create_card()
1512 aux_dev.dlc.of_node = of_parse_phandle(dev->of_node, in sun8i_h3_codec_create_card()
1513 "allwinner,codec-analog-controls", in sun8i_h3_codec_create_card()
1516 dev_err(dev, "Can't find analog controls for codec.\n"); in sun8i_h3_codec_create_card()
1517 return ERR_PTR(-EINVAL); in sun8i_h3_codec_create_card()
1520 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun8i_h3_codec_create_card()
1521 if (!card->dai_link) in sun8i_h3_codec_create_card()
1522 return ERR_PTR(-ENOMEM); in sun8i_h3_codec_create_card()
1524 card->dev = dev; in sun8i_h3_codec_create_card()
1525 card->owner = THIS_MODULE; in sun8i_h3_codec_create_card()
1526 card->name = "H3 Audio Codec"; in sun8i_h3_codec_create_card()
1527 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun8i_h3_codec_create_card()
1528 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun8i_h3_codec_create_card()
1529 card->dapm_routes = sun8i_codec_card_routes; in sun8i_h3_codec_create_card()
1530 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); in sun8i_h3_codec_create_card()
1531 card->aux_dev = &aux_dev; in sun8i_h3_codec_create_card()
1532 card->num_aux_devs = 1; in sun8i_h3_codec_create_card()
1533 card->fully_routed = true; in sun8i_h3_codec_create_card()
1535 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun8i_h3_codec_create_card()
1537 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun8i_h3_codec_create_card()
1549 return ERR_PTR(-ENOMEM); in sun8i_v3s_codec_create_card()
1551 aux_dev.dlc.of_node = of_parse_phandle(dev->of_node, in sun8i_v3s_codec_create_card()
1552 "allwinner,codec-analog-controls", in sun8i_v3s_codec_create_card()
1555 dev_err(dev, "Can't find analog controls for codec.\n"); in sun8i_v3s_codec_create_card()
1556 return ERR_PTR(-EINVAL); in sun8i_v3s_codec_create_card()
1559 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun8i_v3s_codec_create_card()
1560 if (!card->dai_link) in sun8i_v3s_codec_create_card()
1561 return ERR_PTR(-ENOMEM); in sun8i_v3s_codec_create_card()
1563 card->dev = dev; in sun8i_v3s_codec_create_card()
1564 card->owner = THIS_MODULE; in sun8i_v3s_codec_create_card()
1565 card->name = "V3s Audio Codec"; in sun8i_v3s_codec_create_card()
1566 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun8i_v3s_codec_create_card()
1567 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun8i_v3s_codec_create_card()
1568 card->dapm_routes = sun8i_codec_card_routes; in sun8i_v3s_codec_create_card()
1569 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); in sun8i_v3s_codec_create_card()
1570 card->aux_dev = &aux_dev; in sun8i_v3s_codec_create_card()
1571 card->num_aux_devs = 1; in sun8i_v3s_codec_create_card()
1572 card->fully_routed = true; in sun8i_v3s_codec_create_card()
1574 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun8i_v3s_codec_create_card()
1576 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun8i_v3s_codec_create_card()
1625 const struct snd_soc_component_driver *codec; member
1635 .codec = &sun4i_codec_codec,
1644 .codec = &sun6i_codec_codec,
1654 .codec = &sun7i_codec_codec,
1663 .codec = &sun8i_a23_codec_codec,
1674 * TODO Share the codec structure with A23 for now.
1678 .codec = &sun8i_a23_codec_codec,
1689 * TODO The codec structure should be split out, like
1692 .codec = &sun8i_a23_codec_codec,
1702 .compatible = "allwinner,sun4i-a10-codec",
1706 .compatible = "allwinner,sun6i-a31-codec",
1710 .compatible = "allwinner,sun7i-a20-codec",
1714 .compatible = "allwinner,sun8i-a23-codec",
1718 .compatible = "allwinner,sun8i-h3-codec",
1722 .compatible = "allwinner,sun8i-v3s-codec",
1738 scodec = devm_kzalloc(&pdev->dev, sizeof(*scodec), GFP_KERNEL); in sun4i_codec_probe()
1740 return -ENOMEM; in sun4i_codec_probe()
1742 scodec->dev = &pdev->dev; in sun4i_codec_probe()
1748 quirks = of_device_get_match_data(&pdev->dev); in sun4i_codec_probe()
1750 dev_err(&pdev->dev, "Failed to determine the quirks to use\n"); in sun4i_codec_probe()
1751 return -ENODEV; in sun4i_codec_probe()
1754 scodec->regmap = devm_regmap_init_mmio(&pdev->dev, base, in sun4i_codec_probe()
1755 quirks->regmap_config); in sun4i_codec_probe()
1756 if (IS_ERR(scodec->regmap)) { in sun4i_codec_probe()
1757 dev_err(&pdev->dev, "Failed to create our regmap\n"); in sun4i_codec_probe()
1758 return PTR_ERR(scodec->regmap); in sun4i_codec_probe()
1762 scodec->clk_apb = devm_clk_get(&pdev->dev, "apb"); in sun4i_codec_probe()
1763 if (IS_ERR(scodec->clk_apb)) { in sun4i_codec_probe()
1764 dev_err(&pdev->dev, "Failed to get the APB clock\n"); in sun4i_codec_probe()
1765 return PTR_ERR(scodec->clk_apb); in sun4i_codec_probe()
1768 scodec->clk_module = devm_clk_get(&pdev->dev, "codec"); in sun4i_codec_probe()
1769 if (IS_ERR(scodec->clk_module)) { in sun4i_codec_probe()
1770 dev_err(&pdev->dev, "Failed to get the module clock\n"); in sun4i_codec_probe()
1771 return PTR_ERR(scodec->clk_module); in sun4i_codec_probe()
1774 if (quirks->has_reset) { in sun4i_codec_probe()
1775 scodec->rst = devm_reset_control_get_exclusive(&pdev->dev, in sun4i_codec_probe()
1777 if (IS_ERR(scodec->rst)) { in sun4i_codec_probe()
1778 dev_err(&pdev->dev, "Failed to get reset control\n"); in sun4i_codec_probe()
1779 return PTR_ERR(scodec->rst); in sun4i_codec_probe()
1783 scodec->gpio_pa = devm_gpiod_get_optional(&pdev->dev, "allwinner,pa", in sun4i_codec_probe()
1785 if (IS_ERR(scodec->gpio_pa)) { in sun4i_codec_probe()
1786 ret = PTR_ERR(scodec->gpio_pa); in sun4i_codec_probe()
1787 dev_err_probe(&pdev->dev, ret, "Failed to get pa gpio\n"); in sun4i_codec_probe()
1791 scodec->gpio_hp = devm_gpiod_get_optional(&pdev->dev, "hp-det", GPIOD_IN); in sun4i_codec_probe()
1792 if (IS_ERR(scodec->gpio_hp)) { in sun4i_codec_probe()
1793 ret = PTR_ERR(scodec->gpio_hp); in sun4i_codec_probe()
1794 dev_err_probe(&pdev->dev, ret, "Failed to get hp-det gpio\n"); in sun4i_codec_probe()
1799 scodec->reg_adc_fifoc = devm_regmap_field_alloc(&pdev->dev, in sun4i_codec_probe()
1800 scodec->regmap, in sun4i_codec_probe()
1801 quirks->reg_adc_fifoc); in sun4i_codec_probe()
1802 if (IS_ERR(scodec->reg_adc_fifoc)) { in sun4i_codec_probe()
1803 ret = PTR_ERR(scodec->reg_adc_fifoc); in sun4i_codec_probe()
1804 dev_err(&pdev->dev, "Failed to create regmap fields: %d\n", in sun4i_codec_probe()
1810 if (clk_prepare_enable(scodec->clk_apb)) { in sun4i_codec_probe()
1811 dev_err(&pdev->dev, "Failed to enable the APB clock\n"); in sun4i_codec_probe()
1812 return -EINVAL; in sun4i_codec_probe()
1816 if (scodec->rst) { in sun4i_codec_probe()
1817 ret = reset_control_deassert(scodec->rst); in sun4i_codec_probe()
1819 dev_err(&pdev->dev, in sun4i_codec_probe()
1826 scodec->playback_dma_data.addr = res->start + quirks->reg_dac_txdata; in sun4i_codec_probe()
1827 scodec->playback_dma_data.maxburst = 8; in sun4i_codec_probe()
1828 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_probe()
1831 scodec->capture_dma_data.addr = res->start + quirks->reg_adc_rxdata; in sun4i_codec_probe()
1832 scodec->capture_dma_data.maxburst = 8; in sun4i_codec_probe()
1833 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_probe()
1835 ret = devm_snd_soc_register_component(&pdev->dev, quirks->codec, in sun4i_codec_probe()
1838 dev_err(&pdev->dev, "Failed to register our codec\n"); in sun4i_codec_probe()
1842 ret = devm_snd_soc_register_component(&pdev->dev, in sun4i_codec_probe()
1846 dev_err(&pdev->dev, "Failed to register our DAI\n"); in sun4i_codec_probe()
1850 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); in sun4i_codec_probe()
1852 dev_err(&pdev->dev, "Failed to register against DMAEngine\n"); in sun4i_codec_probe()
1856 card = quirks->create_card(&pdev->dev); in sun4i_codec_probe()
1859 dev_err(&pdev->dev, "Failed to create our card\n"); in sun4i_codec_probe()
1867 dev_err_probe(&pdev->dev, ret, "Failed to register our card\n"); in sun4i_codec_probe()
1874 if (scodec->rst) in sun4i_codec_probe()
1875 reset_control_assert(scodec->rst); in sun4i_codec_probe()
1877 clk_disable_unprepare(scodec->clk_apb); in sun4i_codec_probe()
1887 if (scodec->rst) in sun4i_codec_remove()
1888 reset_control_assert(scodec->rst); in sun4i_codec_remove()
1889 clk_disable_unprepare(scodec->clk_apb); in sun4i_codec_remove()
1894 .name = "sun4i-codec",
1902 MODULE_DESCRIPTION("Allwinner A10 codec driver");
1905 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
1906 MODULE_AUTHOR("Chen-Yu Tsai <wens@csie.org>");