| .. | .. |
|---|
| 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) |
|---|