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 <wens@csie.org>
22 #include <linux/clk.h>
124 * sun6i shares the same digital control and FIFO registers as sun4i,
238 struct clk *clk_apb;
239 struct clk *clk_module;
253 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_start_playback()
258 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_start_playback()
266 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_stop_playback()
274 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_start_capture()
282 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_stop_capture()
290 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_trigger()
296 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_trigger()
305 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_trigger()
312 return -EINVAL; in sun4i_codec_trigger()
322 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_prepare_capture()
326 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_prepare_capture()
332 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_prepare_capture()
341 if (of_device_is_compatible(scodec->dev->of_node, in sun4i_codec_prepare_capture()
342 "allwinner,sun4i-a10-codec") || in sun4i_codec_prepare_capture()
343 of_device_is_compatible(scodec->dev->of_node, in sun4i_codec_prepare_capture()
344 "allwinner,sun7i-a20-codec")) { in sun4i_codec_prepare_capture()
345 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_ACTL, in sun4i_codec_prepare_capture()
350 if (of_device_is_compatible(scodec->dev->of_node, in sun4i_codec_prepare_capture()
351 "allwinner,sun7i-a20-codec")) in sun4i_codec_prepare_capture()
353 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_TUNE, in sun4i_codec_prepare_capture()
364 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_prepare_playback()
368 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_prepare_playback()
373 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_prepare_playback()
377 if (substream->runtime->rate > 32000) in sun4i_codec_prepare_playback()
384 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_prepare_playback()
389 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_prepare_playback()
399 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_prepare()
473 return -EINVAL; in sun4i_codec_get_hw_rate()
482 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
488 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
492 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
497 if (hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min == 32) { in sun4i_codec_hw_params_capture()
498 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
502 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
506 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in sun4i_codec_hw_params_capture()
508 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
513 regmap_field_update_bits(scodec->reg_adc_fifoc, in sun4i_codec_hw_params_capture()
517 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_hw_params_capture()
530 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
540 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
545 if (hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min == 32) { in sun4i_codec_hw_params_playback()
546 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
551 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
555 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in sun4i_codec_hw_params_playback()
557 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
562 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_hw_params_playback()
566 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_hw_params_playback()
577 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_hw_params()
583 return -EINVAL; in sun4i_codec_hw_params()
585 ret = clk_set_rate(scodec->clk_module, clk_freq); in sun4i_codec_hw_params()
593 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) in sun4i_codec_hw_params()
618 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_startup()
620 snd_pcm_hw_constraint_list(substream->runtime, 0, in sun4i_codec_startup()
627 regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, in sun4i_codec_startup()
631 return clk_prepare_enable(scodec->clk_module); in sun4i_codec_startup()
638 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(rtd->card); in sun4i_codec_shutdown()
640 clk_disable_unprepare(scodec->clk_module); in sun4i_codec_shutdown()
678 /*** sun4i Codec ***/
683 static DECLARE_TLV_DB_SCALE(sun4i_codec_pa_volume_scale, -6300, 100, 1);
684 static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_loopback_gain_scale, -150, 150,
686 static DECLARE_TLV_DB_SCALE(sun4i_codec_linein_preamp_gain_scale, -1200, 300,
688 static DECLARE_TLV_DB_SCALE(sun4i_codec_fmin_loopback_gain_scale, -450, 150,
690 static DECLARE_TLV_DB_SCALE(sun4i_codec_micin_loopback_gain_scale, -450, 150,
817 /* Mic Pre-Amplifiers */
818 SND_SOC_DAPM_PGA("MIC1 Pre-Amplifier", SUN4I_CODEC_ADC_ACTL,
820 SND_SOC_DAPM_PGA("MIC2 Pre-Amplifier", SUN4I_CODEC_ADC_ACTL,
857 { "Right Mixer", "Mic1 Playback Switch", "MIC1 Pre-Amplifier" },
858 { "Right Mixer", "Mic2 Playback Switch", "MIC2 Pre-Amplifier" },
865 { "Left Mixer", "Mic1 Playback Switch", "MIC1 Pre-Amplifier" },
866 { "Left Mixer", "Mic2 Playback Switch", "MIC2 Pre-Amplifier" },
880 { "Left ADC", NULL, "MIC1 Pre-Amplifier" },
881 { "Right ADC", NULL, "MIC1 Pre-Amplifier" },
882 { "MIC1 Pre-Amplifier", NULL, "Mic1"},
886 { "Left ADC", NULL, "MIC2 Pre-Amplifier" },
887 { "Right ADC", NULL, "MIC2 Pre-Amplifier" },
888 { "MIC2 Pre-Amplifier", NULL, "Mic2"},
1016 static const DECLARE_TLV_DB_SCALE(sun6i_codec_dvol_scale, -7308, 116, 0);
1017 static const DECLARE_TLV_DB_SCALE(sun6i_codec_hp_vol_scale, -6300, 100, 1);
1019 -450, 150, 0);
1022 2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
1049 /* Mixer pre-gains */
1255 .name = "sun4i-codec",
1267 snd_soc_dai_init_dma_data(dai, &scodec->playback_dma_data, in sun4i_codec_dai_probe()
1268 &scodec->capture_dma_data); in sun4i_codec_dai_probe()
1274 .name = "sun4i-codec-cpu-dai",
1304 link->cpus = &dlc[0]; in sun4i_codec_create_link()
1305 link->codecs = &dlc[1]; in sun4i_codec_create_link()
1306 link->platforms = &dlc[2]; in sun4i_codec_create_link()
1308 link->num_cpus = 1; in sun4i_codec_create_link()
1309 link->num_codecs = 1; in sun4i_codec_create_link()
1310 link->num_platforms = 1; in sun4i_codec_create_link()
1312 link->name = "cdc"; in sun4i_codec_create_link()
1313 link->stream_name = "CDC PCM"; in sun4i_codec_create_link()
1314 link->codecs->dai_name = "Codec"; in sun4i_codec_create_link()
1315 link->cpus->dai_name = dev_name(dev); in sun4i_codec_create_link()
1316 link->codecs->name = dev_name(dev); in sun4i_codec_create_link()
1317 link->platforms->name = dev_name(dev); in sun4i_codec_create_link()
1318 link->dai_fmt = SND_SOC_DAIFMT_I2S; in sun4i_codec_create_link()
1328 struct sun4i_codec *scodec = snd_soc_card_get_drvdata(w->dapm->card); in sun4i_codec_spk_event()
1330 gpiod_set_value_cansleep(scodec->gpio_pa, in sun4i_codec_spk_event()
1360 return ERR_PTR(-ENOMEM); in sun4i_codec_create_card()
1362 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun4i_codec_create_card()
1363 if (!card->dai_link) in sun4i_codec_create_card()
1364 return ERR_PTR(-ENOMEM); in sun4i_codec_create_card()
1366 card->dev = dev; in sun4i_codec_create_card()
1367 card->name = "sun4i-codec"; in sun4i_codec_create_card()
1368 card->dapm_widgets = sun4i_codec_card_dapm_widgets; in sun4i_codec_create_card()
1369 card->num_dapm_widgets = ARRAY_SIZE(sun4i_codec_card_dapm_widgets); in sun4i_codec_create_card()
1370 card->dapm_routes = sun4i_codec_card_dapm_routes; in sun4i_codec_create_card()
1371 card->num_dapm_routes = ARRAY_SIZE(sun4i_codec_card_dapm_routes); in sun4i_codec_create_card()
1392 return ERR_PTR(-ENOMEM); in sun6i_codec_create_card()
1394 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun6i_codec_create_card()
1395 if (!card->dai_link) in sun6i_codec_create_card()
1396 return ERR_PTR(-ENOMEM); in sun6i_codec_create_card()
1398 card->dev = dev; in sun6i_codec_create_card()
1399 card->name = "A31 Audio Codec"; in sun6i_codec_create_card()
1400 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun6i_codec_create_card()
1401 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun6i_codec_create_card()
1402 card->fully_routed = true; in sun6i_codec_create_card()
1404 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun6i_codec_create_card()
1406 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun6i_codec_create_card()
1437 return ERR_PTR(-ENOMEM); in sun8i_a23_codec_create_card()
1439 aux_dev.dlc.of_node = of_parse_phandle(dev->of_node, in sun8i_a23_codec_create_card()
1440 "allwinner,codec-analog-controls", in sun8i_a23_codec_create_card()
1444 return ERR_PTR(-EINVAL); in sun8i_a23_codec_create_card()
1447 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun8i_a23_codec_create_card()
1448 if (!card->dai_link) in sun8i_a23_codec_create_card()
1449 return ERR_PTR(-ENOMEM); in sun8i_a23_codec_create_card()
1451 card->dev = dev; in sun8i_a23_codec_create_card()
1452 card->name = "A23 Audio Codec"; in sun8i_a23_codec_create_card()
1453 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun8i_a23_codec_create_card()
1454 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun8i_a23_codec_create_card()
1455 card->dapm_routes = sun8i_codec_card_routes; in sun8i_a23_codec_create_card()
1456 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); in sun8i_a23_codec_create_card()
1457 card->aux_dev = &aux_dev; in sun8i_a23_codec_create_card()
1458 card->num_aux_devs = 1; in sun8i_a23_codec_create_card()
1459 card->fully_routed = true; in sun8i_a23_codec_create_card()
1461 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun8i_a23_codec_create_card()
1463 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun8i_a23_codec_create_card()
1475 return ERR_PTR(-ENOMEM); in sun8i_h3_codec_create_card()
1477 aux_dev.dlc.of_node = of_parse_phandle(dev->of_node, in sun8i_h3_codec_create_card()
1478 "allwinner,codec-analog-controls", in sun8i_h3_codec_create_card()
1482 return ERR_PTR(-EINVAL); in sun8i_h3_codec_create_card()
1485 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun8i_h3_codec_create_card()
1486 if (!card->dai_link) in sun8i_h3_codec_create_card()
1487 return ERR_PTR(-ENOMEM); in sun8i_h3_codec_create_card()
1489 card->dev = dev; in sun8i_h3_codec_create_card()
1490 card->name = "H3 Audio Codec"; in sun8i_h3_codec_create_card()
1491 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun8i_h3_codec_create_card()
1492 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun8i_h3_codec_create_card()
1493 card->dapm_routes = sun8i_codec_card_routes; in sun8i_h3_codec_create_card()
1494 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); in sun8i_h3_codec_create_card()
1495 card->aux_dev = &aux_dev; in sun8i_h3_codec_create_card()
1496 card->num_aux_devs = 1; in sun8i_h3_codec_create_card()
1497 card->fully_routed = true; in sun8i_h3_codec_create_card()
1499 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun8i_h3_codec_create_card()
1501 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun8i_h3_codec_create_card()
1513 return ERR_PTR(-ENOMEM); in sun8i_v3s_codec_create_card()
1515 aux_dev.dlc.of_node = of_parse_phandle(dev->of_node, in sun8i_v3s_codec_create_card()
1516 "allwinner,codec-analog-controls", in sun8i_v3s_codec_create_card()
1520 return ERR_PTR(-EINVAL); in sun8i_v3s_codec_create_card()
1523 card->dai_link = sun4i_codec_create_link(dev, &card->num_links); in sun8i_v3s_codec_create_card()
1524 if (!card->dai_link) in sun8i_v3s_codec_create_card()
1525 return ERR_PTR(-ENOMEM); in sun8i_v3s_codec_create_card()
1527 card->dev = dev; in sun8i_v3s_codec_create_card()
1528 card->name = "V3s Audio Codec"; in sun8i_v3s_codec_create_card()
1529 card->dapm_widgets = sun6i_codec_card_dapm_widgets; in sun8i_v3s_codec_create_card()
1530 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); in sun8i_v3s_codec_create_card()
1531 card->dapm_routes = sun8i_codec_card_routes; in sun8i_v3s_codec_create_card()
1532 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); in sun8i_v3s_codec_create_card()
1533 card->aux_dev = &aux_dev; in sun8i_v3s_codec_create_card()
1534 card->num_aux_devs = 1; in sun8i_v3s_codec_create_card()
1535 card->fully_routed = true; in sun8i_v3s_codec_create_card()
1537 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); in sun8i_v3s_codec_create_card()
1539 dev_warn(dev, "failed to parse audio-routing: %d\n", ret); in sun8i_v3s_codec_create_card()
1665 .compatible = "allwinner,sun4i-a10-codec",
1669 .compatible = "allwinner,sun6i-a31-codec",
1673 .compatible = "allwinner,sun7i-a20-codec",
1677 .compatible = "allwinner,sun8i-a23-codec",
1681 .compatible = "allwinner,sun8i-h3-codec",
1685 .compatible = "allwinner,sun8i-v3s-codec",
1701 scodec = devm_kzalloc(&pdev->dev, sizeof(*scodec), GFP_KERNEL); in sun4i_codec_probe()
1703 return -ENOMEM; in sun4i_codec_probe()
1705 scodec->dev = &pdev->dev; in sun4i_codec_probe()
1708 base = devm_ioremap_resource(&pdev->dev, res); in sun4i_codec_probe()
1710 dev_err(&pdev->dev, "Failed to map the registers\n"); in sun4i_codec_probe()
1714 quirks = of_device_get_match_data(&pdev->dev); in sun4i_codec_probe()
1716 dev_err(&pdev->dev, "Failed to determine the quirks to use\n"); in sun4i_codec_probe()
1717 return -ENODEV; in sun4i_codec_probe()
1720 scodec->regmap = devm_regmap_init_mmio(&pdev->dev, base, in sun4i_codec_probe()
1721 quirks->regmap_config); in sun4i_codec_probe()
1722 if (IS_ERR(scodec->regmap)) { in sun4i_codec_probe()
1723 dev_err(&pdev->dev, "Failed to create our regmap\n"); in sun4i_codec_probe()
1724 return PTR_ERR(scodec->regmap); in sun4i_codec_probe()
1728 scodec->clk_apb = devm_clk_get(&pdev->dev, "apb"); in sun4i_codec_probe()
1729 if (IS_ERR(scodec->clk_apb)) { in sun4i_codec_probe()
1730 dev_err(&pdev->dev, "Failed to get the APB clock\n"); in sun4i_codec_probe()
1731 return PTR_ERR(scodec->clk_apb); in sun4i_codec_probe()
1734 scodec->clk_module = devm_clk_get(&pdev->dev, "codec"); in sun4i_codec_probe()
1735 if (IS_ERR(scodec->clk_module)) { in sun4i_codec_probe()
1736 dev_err(&pdev->dev, "Failed to get the module clock\n"); in sun4i_codec_probe()
1737 return PTR_ERR(scodec->clk_module); in sun4i_codec_probe()
1740 if (quirks->has_reset) { in sun4i_codec_probe()
1741 scodec->rst = devm_reset_control_get_exclusive(&pdev->dev, in sun4i_codec_probe()
1743 if (IS_ERR(scodec->rst)) { in sun4i_codec_probe()
1744 dev_err(&pdev->dev, "Failed to get reset control\n"); in sun4i_codec_probe()
1745 return PTR_ERR(scodec->rst); in sun4i_codec_probe()
1749 scodec->gpio_pa = devm_gpiod_get_optional(&pdev->dev, "allwinner,pa", in sun4i_codec_probe()
1751 if (IS_ERR(scodec->gpio_pa)) { in sun4i_codec_probe()
1752 ret = PTR_ERR(scodec->gpio_pa); in sun4i_codec_probe()
1753 if (ret != -EPROBE_DEFER) in sun4i_codec_probe()
1754 dev_err(&pdev->dev, "Failed to get pa gpio: %d\n", ret); in sun4i_codec_probe()
1759 scodec->reg_adc_fifoc = devm_regmap_field_alloc(&pdev->dev, in sun4i_codec_probe()
1760 scodec->regmap, in sun4i_codec_probe()
1761 quirks->reg_adc_fifoc); in sun4i_codec_probe()
1762 if (IS_ERR(scodec->reg_adc_fifoc)) { in sun4i_codec_probe()
1763 ret = PTR_ERR(scodec->reg_adc_fifoc); in sun4i_codec_probe()
1764 dev_err(&pdev->dev, "Failed to create regmap fields: %d\n", in sun4i_codec_probe()
1770 if (clk_prepare_enable(scodec->clk_apb)) { in sun4i_codec_probe()
1771 dev_err(&pdev->dev, "Failed to enable the APB clock\n"); in sun4i_codec_probe()
1772 return -EINVAL; in sun4i_codec_probe()
1776 if (scodec->rst) { in sun4i_codec_probe()
1777 ret = reset_control_deassert(scodec->rst); in sun4i_codec_probe()
1779 dev_err(&pdev->dev, in sun4i_codec_probe()
1786 scodec->playback_dma_data.addr = res->start + quirks->reg_dac_txdata; in sun4i_codec_probe()
1787 scodec->playback_dma_data.maxburst = 8; in sun4i_codec_probe()
1788 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_probe()
1791 scodec->capture_dma_data.addr = res->start + quirks->reg_adc_rxdata; in sun4i_codec_probe()
1792 scodec->capture_dma_data.maxburst = 8; in sun4i_codec_probe()
1793 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun4i_codec_probe()
1795 ret = devm_snd_soc_register_component(&pdev->dev, quirks->codec, in sun4i_codec_probe()
1798 dev_err(&pdev->dev, "Failed to register our codec\n"); in sun4i_codec_probe()
1802 ret = devm_snd_soc_register_component(&pdev->dev, in sun4i_codec_probe()
1806 dev_err(&pdev->dev, "Failed to register our DAI\n"); in sun4i_codec_probe()
1810 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); in sun4i_codec_probe()
1812 dev_err(&pdev->dev, "Failed to register against DMAEngine\n"); in sun4i_codec_probe()
1816 card = quirks->create_card(&pdev->dev); in sun4i_codec_probe()
1819 dev_err(&pdev->dev, "Failed to create our card\n"); in sun4i_codec_probe()
1827 dev_err(&pdev->dev, "Failed to register our card\n"); in sun4i_codec_probe()
1834 if (scodec->rst) in sun4i_codec_probe()
1835 reset_control_assert(scodec->rst); in sun4i_codec_probe()
1837 clk_disable_unprepare(scodec->clk_apb); in sun4i_codec_probe()
1847 if (scodec->rst) in sun4i_codec_remove()
1848 reset_control_assert(scodec->rst); in sun4i_codec_remove()
1849 clk_disable_unprepare(scodec->clk_apb); in sun4i_codec_remove()
1856 .name = "sun4i-codec",
1864 MODULE_DESCRIPTION("Allwinner A10 codec driver");
1867 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
1868 MODULE_AUTHOR("Chen-Yu Tsai <wens@csie.org>");