.. | .. |
---|
1 | | -/* |
---|
2 | | - * Freescale MPC5200 PSC DMA |
---|
3 | | - * ALSA SoC Platform driver |
---|
4 | | - * |
---|
5 | | - * Copyright (C) 2008 Secret Lab Technologies Ltd. |
---|
6 | | - * Copyright (C) 2009 Jon Smirl, Digispeaker |
---|
7 | | - */ |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
| 2 | +// |
---|
| 3 | +// Freescale MPC5200 PSC DMA |
---|
| 4 | +// ALSA SoC Platform driver |
---|
| 5 | +// |
---|
| 6 | +// Copyright (C) 2008 Secret Lab Technologies Ltd. |
---|
| 7 | +// Copyright (C) 2009 Jon Smirl, Digispeaker |
---|
8 | 8 | |
---|
9 | 9 | #include <linux/module.h> |
---|
10 | 10 | #include <linux/of_device.h> |
---|
.. | .. |
---|
98 | 98 | return IRQ_HANDLED; |
---|
99 | 99 | } |
---|
100 | 100 | |
---|
101 | | -static int psc_dma_hw_free(struct snd_pcm_substream *substream) |
---|
| 101 | +static int psc_dma_hw_free(struct snd_soc_component *component, |
---|
| 102 | + struct snd_pcm_substream *substream) |
---|
102 | 103 | { |
---|
103 | 104 | snd_pcm_set_runtime_buffer(substream, NULL); |
---|
104 | 105 | return 0; |
---|
.. | .. |
---|
110 | 111 | * This function is called by ALSA to start, stop, pause, and resume the DMA |
---|
111 | 112 | * transfer of data. |
---|
112 | 113 | */ |
---|
113 | | -static int psc_dma_trigger(struct snd_pcm_substream *substream, int cmd) |
---|
| 114 | +static int psc_dma_trigger(struct snd_soc_component *component, |
---|
| 115 | + struct snd_pcm_substream *substream, int cmd) |
---|
114 | 116 | { |
---|
115 | | - struct snd_soc_pcm_runtime *rtd = substream->private_data; |
---|
116 | | - struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); |
---|
| 117 | + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); |
---|
| 118 | + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); |
---|
117 | 119 | struct snd_pcm_runtime *runtime = substream->runtime; |
---|
118 | 120 | struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma); |
---|
119 | 121 | struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs; |
---|
.. | .. |
---|
210 | 212 | .fifo_size = 512, |
---|
211 | 213 | }; |
---|
212 | 214 | |
---|
213 | | -static int psc_dma_open(struct snd_pcm_substream *substream) |
---|
| 215 | +static int psc_dma_open(struct snd_soc_component *component, |
---|
| 216 | + struct snd_pcm_substream *substream) |
---|
214 | 217 | { |
---|
215 | 218 | struct snd_pcm_runtime *runtime = substream->runtime; |
---|
216 | | - struct snd_soc_pcm_runtime *rtd = substream->private_data; |
---|
217 | | - struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); |
---|
| 219 | + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); |
---|
| 220 | + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); |
---|
218 | 221 | struct psc_dma_stream *s; |
---|
219 | 222 | int rc; |
---|
220 | 223 | |
---|
.. | .. |
---|
238 | 241 | return 0; |
---|
239 | 242 | } |
---|
240 | 243 | |
---|
241 | | -static int psc_dma_close(struct snd_pcm_substream *substream) |
---|
| 244 | +static int psc_dma_close(struct snd_soc_component *component, |
---|
| 245 | + struct snd_pcm_substream *substream) |
---|
242 | 246 | { |
---|
243 | | - struct snd_soc_pcm_runtime *rtd = substream->private_data; |
---|
244 | | - struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); |
---|
| 247 | + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); |
---|
| 248 | + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); |
---|
245 | 249 | struct psc_dma_stream *s; |
---|
246 | 250 | |
---|
247 | 251 | dev_dbg(psc_dma->dev, "psc_dma_close(substream=%p)\n", substream); |
---|
.. | .. |
---|
263 | 267 | } |
---|
264 | 268 | |
---|
265 | 269 | static snd_pcm_uframes_t |
---|
266 | | -psc_dma_pointer(struct snd_pcm_substream *substream) |
---|
| 270 | +psc_dma_pointer(struct snd_soc_component *component, |
---|
| 271 | + struct snd_pcm_substream *substream) |
---|
267 | 272 | { |
---|
268 | | - struct snd_soc_pcm_runtime *rtd = substream->private_data; |
---|
269 | | - struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(rtd->cpu_dai); |
---|
| 273 | + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); |
---|
| 274 | + struct psc_dma *psc_dma = snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); |
---|
270 | 275 | struct psc_dma_stream *s; |
---|
271 | 276 | dma_addr_t count; |
---|
272 | 277 | |
---|
.. | .. |
---|
280 | 285 | return bytes_to_frames(substream->runtime, count); |
---|
281 | 286 | } |
---|
282 | 287 | |
---|
283 | | -static int |
---|
284 | | -psc_dma_hw_params(struct snd_pcm_substream *substream, |
---|
285 | | - struct snd_pcm_hw_params *params) |
---|
| 288 | +static int psc_dma_hw_params(struct snd_soc_component *component, |
---|
| 289 | + struct snd_pcm_substream *substream, |
---|
| 290 | + struct snd_pcm_hw_params *params) |
---|
286 | 291 | { |
---|
287 | 292 | snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); |
---|
288 | 293 | |
---|
289 | 294 | return 0; |
---|
290 | 295 | } |
---|
291 | 296 | |
---|
292 | | -static const struct snd_pcm_ops psc_dma_ops = { |
---|
293 | | - .open = psc_dma_open, |
---|
294 | | - .close = psc_dma_close, |
---|
295 | | - .hw_free = psc_dma_hw_free, |
---|
296 | | - .ioctl = snd_pcm_lib_ioctl, |
---|
297 | | - .pointer = psc_dma_pointer, |
---|
298 | | - .trigger = psc_dma_trigger, |
---|
299 | | - .hw_params = psc_dma_hw_params, |
---|
300 | | -}; |
---|
301 | | - |
---|
302 | | -static int psc_dma_new(struct snd_soc_pcm_runtime *rtd) |
---|
| 297 | +static int psc_dma_new(struct snd_soc_component *component, |
---|
| 298 | + struct snd_soc_pcm_runtime *rtd) |
---|
303 | 299 | { |
---|
304 | 300 | struct snd_card *card = rtd->card->snd_card; |
---|
305 | | - struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); |
---|
306 | | - struct snd_soc_dai *dai = rtd->cpu_dai; |
---|
| 301 | + struct snd_soc_dai *dai = asoc_rtd_to_cpu(rtd, 0); |
---|
307 | 302 | struct snd_pcm *pcm = rtd->pcm; |
---|
308 | 303 | size_t size = psc_dma_hardware.buffer_bytes_max; |
---|
309 | 304 | int rc; |
---|
.. | .. |
---|
341 | 336 | return -ENOMEM; |
---|
342 | 337 | } |
---|
343 | 338 | |
---|
344 | | -static void psc_dma_free(struct snd_pcm *pcm) |
---|
| 339 | +static void psc_dma_free(struct snd_soc_component *component, |
---|
| 340 | + struct snd_pcm *pcm) |
---|
345 | 341 | { |
---|
346 | | - struct snd_soc_pcm_runtime *rtd = pcm->private_data; |
---|
347 | | - struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); |
---|
348 | 342 | struct snd_pcm_substream *substream; |
---|
349 | 343 | int stream; |
---|
350 | 344 | |
---|
.. | .. |
---|
362 | 356 | |
---|
363 | 357 | static const struct snd_soc_component_driver mpc5200_audio_dma_component = { |
---|
364 | 358 | .name = DRV_NAME, |
---|
365 | | - .ops = &psc_dma_ops, |
---|
366 | | - .pcm_new = &psc_dma_new, |
---|
367 | | - .pcm_free = &psc_dma_free, |
---|
| 359 | + .open = psc_dma_open, |
---|
| 360 | + .close = psc_dma_close, |
---|
| 361 | + .hw_free = psc_dma_hw_free, |
---|
| 362 | + .pointer = psc_dma_pointer, |
---|
| 363 | + .trigger = psc_dma_trigger, |
---|
| 364 | + .hw_params = psc_dma_hw_params, |
---|
| 365 | + .pcm_construct = psc_dma_new, |
---|
| 366 | + .pcm_destruct = psc_dma_free, |
---|
368 | 367 | }; |
---|
369 | 368 | |
---|
370 | 369 | int mpc5200_audio_dma_create(struct platform_device *op) |
---|