Lines Matching +full:playback +full:- +full:dma

1 // SPDX-License-Identifier: GPL-2.0+
2 // Copyright 2018-2021 NXP
5 #include <linux/clk-provider.h>
18 #include "imx-pcm.h"
46 struct clk *p = rpmsg->mclk, *pll = NULL, *npll = NULL; in fsl_rpmsg_hw_params()
51 while (p && rpmsg->pll8k && rpmsg->pll11k) { in fsl_rpmsg_hw_params()
54 if (clk_is_match(pp, rpmsg->pll8k) || in fsl_rpmsg_hw_params()
55 clk_is_match(pp, rpmsg->pll11k)) { in fsl_rpmsg_hw_params()
64 npll = (do_div(rate, 8000) ? rpmsg->pll11k : rpmsg->pll8k); in fsl_rpmsg_hw_params()
68 dev_warn(dai->dev, "failed to set parent %s: %d\n", in fsl_rpmsg_hw_params()
73 if (!(rpmsg->mclk_streams & BIT(substream->stream))) { in fsl_rpmsg_hw_params()
74 ret = clk_prepare_enable(rpmsg->mclk); in fsl_rpmsg_hw_params()
76 dev_err(dai->dev, "failed to enable mclk: %d\n", ret); in fsl_rpmsg_hw_params()
80 rpmsg->mclk_streams |= BIT(substream->stream); in fsl_rpmsg_hw_params()
91 if (rpmsg->mclk_streams & BIT(substream->stream)) { in fsl_rpmsg_hw_free()
92 clk_disable_unprepare(rpmsg->mclk); in fsl_rpmsg_hw_free()
93 rpmsg->mclk_streams &= ~BIT(substream->stream); in fsl_rpmsg_hw_free()
102 return snd_pcm_hw_constraint_list(substream->runtime, 0, in fsl_rpmsg_startup()
114 .playback = {
115 .stream_name = "CPU-Playback",
122 .stream_name = "CPU-Capture",
135 .name = "fsl-rpmsg",
185 { .compatible = "fsl,imx7ulp-rpmsg-audio", .data = &imx7ulp_data},
186 { .compatible = "fsl,imx8mm-rpmsg-audio", .data = &imx8mm_data},
187 { .compatible = "fsl,imx8mn-rpmsg-audio", .data = &imx8mn_data},
188 { .compatible = "fsl,imx8mp-rpmsg-audio", .data = &imx8mp_data},
189 { .compatible = "fsl,imx8ulp-rpmsg-audio", .data = &imx7ulp_data},
190 { .compatible = "fsl,imx93-rpmsg-audio", .data = &imx93_data},
191 { .compatible = "fsl,imx95-rpmsg-audio", .data = &imx95_data},
198 struct device_node *np = pdev->dev.of_node; in fsl_rpmsg_probe()
204 dai_drv = devm_kzalloc(&pdev->dev, sizeof(struct snd_soc_dai_driver), GFP_KERNEL); in fsl_rpmsg_probe()
206 return -ENOMEM; in fsl_rpmsg_probe()
209 rpmsg = devm_kzalloc(&pdev->dev, sizeof(struct fsl_rpmsg), GFP_KERNEL); in fsl_rpmsg_probe()
211 return -ENOMEM; in fsl_rpmsg_probe()
213 rpmsg->soc_data = of_device_get_match_data(&pdev->dev); in fsl_rpmsg_probe()
215 if (rpmsg->soc_data) { in fsl_rpmsg_probe()
216 dai_drv->playback.rates = rpmsg->soc_data->rates; in fsl_rpmsg_probe()
217 dai_drv->capture.rates = rpmsg->soc_data->rates; in fsl_rpmsg_probe()
218 dai_drv->playback.formats = rpmsg->soc_data->formats; in fsl_rpmsg_probe()
219 dai_drv->capture.formats = rpmsg->soc_data->formats; in fsl_rpmsg_probe()
223 ret = of_property_read_string(np, "fsl,rpmsg-channel-name", &dai_name); in fsl_rpmsg_probe()
225 if (ret == -EINVAL) { in fsl_rpmsg_probe()
226 dai_name = "rpmsg-audio-channel"; in fsl_rpmsg_probe()
228 dev_err(&pdev->dev, "Failed to get rpmsg channel name: %d!\n", ret); in fsl_rpmsg_probe()
232 dai_drv->name = dai_name; in fsl_rpmsg_probe()
234 /* Setup cpu dai for sound card that sits on rpmsg-micfil-channel */ in fsl_rpmsg_probe()
235 if (!strcmp(dai_name, "rpmsg-micfil-channel")) { in fsl_rpmsg_probe()
236 dai_drv->capture.channels_min = 1; in fsl_rpmsg_probe()
237 dai_drv->capture.channels_max = 8; in fsl_rpmsg_probe()
238 dai_drv->capture.rates = SNDRV_PCM_RATE_8000_48000; in fsl_rpmsg_probe()
239 dai_drv->capture.formats = SNDRV_PCM_FMTBIT_S32_LE; in fsl_rpmsg_probe()
240 if (of_device_is_compatible(np, "fsl,imx8mm-rpmsg-audio")) in fsl_rpmsg_probe()
241 dai_drv->capture.formats = SNDRV_PCM_FMTBIT_S16_LE; in fsl_rpmsg_probe()
244 if (of_property_read_bool(np, "fsl,enable-lpa")) { in fsl_rpmsg_probe()
245 rpmsg->enable_lpa = 1; in fsl_rpmsg_probe()
246 rpmsg->buffer_size[SNDRV_PCM_STREAM_PLAYBACK] = LPA_LARGE_BUFFER_SIZE; in fsl_rpmsg_probe()
247 rpmsg->buffer_size[SNDRV_PCM_STREAM_CAPTURE] = LPA_CAPTURE_BUFFER_SIZE; in fsl_rpmsg_probe()
249 rpmsg->buffer_size[SNDRV_PCM_STREAM_PLAYBACK] = IMX_DEFAULT_DMABUF_SIZE; in fsl_rpmsg_probe()
250 rpmsg->buffer_size[SNDRV_PCM_STREAM_CAPTURE] = IMX_DEFAULT_DMABUF_SIZE; in fsl_rpmsg_probe()
254 rpmsg->ipg = devm_clk_get_optional(&pdev->dev, "ipg"); in fsl_rpmsg_probe()
255 if (IS_ERR(rpmsg->ipg)) in fsl_rpmsg_probe()
256 return PTR_ERR(rpmsg->ipg); in fsl_rpmsg_probe()
258 rpmsg->mclk = devm_clk_get_optional(&pdev->dev, "mclk"); in fsl_rpmsg_probe()
259 if (IS_ERR(rpmsg->mclk)) in fsl_rpmsg_probe()
260 return PTR_ERR(rpmsg->mclk); in fsl_rpmsg_probe()
262 rpmsg->dma = devm_clk_get_optional(&pdev->dev, "dma"); in fsl_rpmsg_probe()
263 if (IS_ERR(rpmsg->dma)) in fsl_rpmsg_probe()
264 return PTR_ERR(rpmsg->dma); in fsl_rpmsg_probe()
266 rpmsg->pll8k = devm_clk_get_optional(&pdev->dev, "pll8k"); in fsl_rpmsg_probe()
267 if (IS_ERR(rpmsg->pll8k)) in fsl_rpmsg_probe()
268 return PTR_ERR(rpmsg->pll8k); in fsl_rpmsg_probe()
270 rpmsg->pll11k = devm_clk_get_optional(&pdev->dev, "pll11k"); in fsl_rpmsg_probe()
271 if (IS_ERR(rpmsg->pll11k)) in fsl_rpmsg_probe()
272 return PTR_ERR(rpmsg->pll11k); in fsl_rpmsg_probe()
275 pm_runtime_enable(&pdev->dev); in fsl_rpmsg_probe()
277 ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component, in fsl_rpmsg_probe()
285 pm_runtime_disable(&pdev->dev); in fsl_rpmsg_probe()
293 pm_runtime_disable(&pdev->dev); in fsl_rpmsg_remove()
295 if (rpmsg->card_pdev) in fsl_rpmsg_remove()
296 platform_device_unregister(rpmsg->card_pdev); in fsl_rpmsg_remove()
304 ret = clk_prepare_enable(rpmsg->ipg); in fsl_rpmsg_runtime_resume()
310 ret = clk_prepare_enable(rpmsg->dma); in fsl_rpmsg_runtime_resume()
312 dev_err(dev, "Failed to enable dma clock %d\n", ret); in fsl_rpmsg_runtime_resume()
319 clk_disable_unprepare(rpmsg->ipg); in fsl_rpmsg_runtime_resume()
328 clk_disable_unprepare(rpmsg->dma); in fsl_rpmsg_runtime_suspend()
329 clk_disable_unprepare(rpmsg->ipg); in fsl_rpmsg_runtime_suspend()