Lines Matching +full:dmic +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 // This driver supports the DMIC in Allwinner's H6 SoCs.
77 struct snd_soc_pcm_runtime *rtd = substream->private_data; in sun50i_dmic_startup()
81 if (substream->stream != SNDRV_PCM_STREAM_CAPTURE) in sun50i_dmic_startup()
82 return -EINVAL; in sun50i_dmic_startup()
84 regmap_update_bits(host->regmap, SUN50I_DMIC_RXFIFO_CTL, in sun50i_dmic_startup()
87 regmap_write(host->regmap, SUN50I_DMIC_CNT, SUN50I_DMIC_CNT_N); in sun50i_dmic_startup()
100 unsigned int chan_en = (1 << channels) - 1; in sun50i_dmic_hw_params()
103 /* DMIC num is N+1 */ in sun50i_dmic_hw_params()
104 regmap_update_bits(host->regmap, SUN50I_DMIC_CH_NUM, in sun50i_dmic_hw_params()
106 SUN50I_DMIC_CH_NUM_N(channels - 1)); in sun50i_dmic_hw_params()
107 regmap_write(host->regmap, SUN50I_DMIC_HPF_CTRL, chan_en); in sun50i_dmic_hw_params()
108 regmap_update_bits(host->regmap, SUN50I_DMIC_EN_CTL, in sun50i_dmic_hw_params()
114 regmap_update_bits(host->regmap, SUN50I_DMIC_RXFIFO_CTL, in sun50i_dmic_hw_params()
119 regmap_update_bits(host->regmap, SUN50I_DMIC_RXFIFO_CTL, in sun50i_dmic_hw_params()
124 dev_err(cpu_dai->dev, "Invalid format!\n"); in sun50i_dmic_hw_params()
125 return -EINVAL; in sun50i_dmic_hw_params()
127 /* The hardware supports FIFO mode 1 for 24-bit samples */ in sun50i_dmic_hw_params()
128 regmap_update_bits(host->regmap, SUN50I_DMIC_RXFIFO_CTL, in sun50i_dmic_hw_params()
147 dev_err(cpu_dai->dev, "Invalid rate!\n"); in sun50i_dmic_hw_params()
148 return -EINVAL; in sun50i_dmic_hw_params()
151 if (clk_set_rate(host->dmic_clk, mclk)) { in sun50i_dmic_hw_params()
152 dev_err(cpu_dai->dev, "mclk : %u not support\n", mclk); in sun50i_dmic_hw_params()
153 return -EINVAL; in sun50i_dmic_hw_params()
158 regmap_update_bits(host->regmap, SUN50I_DMIC_SR, in sun50i_dmic_hw_params()
167 host->dma_params_rx.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; in sun50i_dmic_hw_params()
170 host->dma_params_rx.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in sun50i_dmic_hw_params()
173 dev_err(cpu_dai->dev, "Unsupported physical sample width: %d\n", in sun50i_dmic_hw_params()
175 return -EINVAL; in sun50i_dmic_hw_params()
180 regmap_update_bits(host->regmap, SUN50I_DMIC_CTL, in sun50i_dmic_hw_params()
184 regmap_update_bits(host->regmap, SUN50I_DMIC_CTL, in sun50i_dmic_hw_params()
196 if (substream->stream != SNDRV_PCM_STREAM_CAPTURE) in sun50i_dmic_trigger()
197 return -EINVAL; in sun50i_dmic_trigger()
204 regmap_update_bits(host->regmap, SUN50I_DMIC_INTC, in sun50i_dmic_trigger()
208 regmap_update_bits(host->regmap, SUN50I_DMIC_EN_CTL, in sun50i_dmic_trigger()
216 regmap_update_bits(host->regmap, SUN50I_DMIC_INTC, in sun50i_dmic_trigger()
219 regmap_update_bits(host->regmap, SUN50I_DMIC_EN_CTL, in sun50i_dmic_trigger()
223 ret = -EINVAL; in sun50i_dmic_trigger()
233 snd_soc_dai_init_dma_data(dai, NULL, &host->dma_params_rx); in sun50i_dmic_soc_dai_probe()
265 .name = "dmic",
270 .compatible = "allwinner,sun50i-h6-dmic",
277 .name = "sun50i-dmic",
284 clk_disable_unprepare(host->dmic_clk); in sun50i_dmic_runtime_suspend()
285 clk_disable_unprepare(host->bus_clk); in sun50i_dmic_runtime_suspend()
295 ret = clk_prepare_enable(host->dmic_clk); in sun50i_dmic_runtime_resume()
299 ret = clk_prepare_enable(host->bus_clk); in sun50i_dmic_runtime_resume()
301 clk_disable_unprepare(host->dmic_clk); in sun50i_dmic_runtime_resume()
315 host = devm_kzalloc(&pdev->dev, sizeof(*host), GFP_KERNEL); in sun50i_dmic_probe()
317 return -ENOMEM; in sun50i_dmic_probe()
321 base = devm_ioremap_resource(&pdev->dev, res); in sun50i_dmic_probe()
323 return dev_err_probe(&pdev->dev, PTR_ERR(base), in sun50i_dmic_probe()
326 host->regmap = devm_regmap_init_mmio(&pdev->dev, base, in sun50i_dmic_probe()
330 host->bus_clk = devm_clk_get(&pdev->dev, "bus"); in sun50i_dmic_probe()
331 if (IS_ERR(host->bus_clk)) in sun50i_dmic_probe()
332 return dev_err_probe(&pdev->dev, PTR_ERR(host->bus_clk), in sun50i_dmic_probe()
335 host->dmic_clk = devm_clk_get(&pdev->dev, "mod"); in sun50i_dmic_probe()
336 if (IS_ERR(host->dmic_clk)) in sun50i_dmic_probe()
337 return dev_err_probe(&pdev->dev, PTR_ERR(host->dmic_clk), in sun50i_dmic_probe()
338 "failed to get dmic clock.\n"); in sun50i_dmic_probe()
340 host->dma_params_rx.addr = res->start + SUN50I_DMIC_DATA; in sun50i_dmic_probe()
341 host->dma_params_rx.maxburst = 8; in sun50i_dmic_probe()
345 host->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL); in sun50i_dmic_probe()
346 if (IS_ERR(host->rst)) in sun50i_dmic_probe()
347 return dev_err_probe(&pdev->dev, PTR_ERR(host->rst), in sun50i_dmic_probe()
349 reset_control_deassert(host->rst); in sun50i_dmic_probe()
351 ret = devm_snd_soc_register_component(&pdev->dev, &sun50i_dmic_component, in sun50i_dmic_probe()
354 return dev_err_probe(&pdev->dev, ret, in sun50i_dmic_probe()
357 pm_runtime_enable(&pdev->dev); in sun50i_dmic_probe()
358 if (!pm_runtime_enabled(&pdev->dev)) { in sun50i_dmic_probe()
359 ret = sun50i_dmic_runtime_resume(&pdev->dev); in sun50i_dmic_probe()
364 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); in sun50i_dmic_probe()
370 if (!pm_runtime_status_suspended(&pdev->dev)) in sun50i_dmic_probe()
371 sun50i_dmic_runtime_suspend(&pdev->dev); in sun50i_dmic_probe()
373 pm_runtime_disable(&pdev->dev); in sun50i_dmic_probe()
379 pm_runtime_disable(&pdev->dev); in sun50i_dmic_remove()
380 if (!pm_runtime_status_suspended(&pdev->dev)) in sun50i_dmic_remove()
381 sun50i_dmic_runtime_suspend(&pdev->dev); in sun50i_dmic_remove()
393 .name = "sun50i-dmic",
403 MODULE_DESCRIPTION("Allwinner sun50i DMIC SoC Interface");
406 MODULE_ALIAS("platform:sun50i-dmic");