Commit | Line | Data |
---|---|---|
8380222e SH |
1 | /* |
2 | * imx-pcm-dma-mx2.c -- ALSA Soc Audio Layer | |
3 | * | |
4 | * Copyright 2009 Sascha Hauer <s.hauer@pengutronix.de> | |
5 | * | |
6 | * This code is based on code copyrighted by Freescale, | |
7 | * Liam Girdwood, Javier Martin and probably others. | |
8 | * | |
9 | * This program is free software; you can redistribute it and/or modify it | |
10 | * under the terms of the GNU General Public License as published by the | |
11 | * Free Software Foundation; either version 2 of the License, or (at your | |
12 | * option) any later version. | |
13 | */ | |
8380222e | 14 | #include <linux/platform_device.h> |
bf974a0d | 15 | #include <linux/dmaengine.h> |
258aea76 | 16 | #include <linux/types.h> |
8380222e SH |
17 | |
18 | #include <sound/core.h> | |
8380222e | 19 | #include <sound/pcm.h> |
8380222e | 20 | #include <sound/soc.h> |
c307e8e3 | 21 | #include <sound/dmaengine_pcm.h> |
8380222e | 22 | |
4762fbab | 23 | #include "imx-pcm.h" |
8380222e | 24 | |
bf974a0d | 25 | static bool filter(struct dma_chan *chan, void *param) |
8380222e | 26 | { |
a8909c9b LPC |
27 | struct snd_dmaengine_dai_dma_data *dma_data = param; |
28 | ||
bf974a0d SH |
29 | if (!imx_dma_is_general_purpose(chan)) |
30 | return false; | |
8380222e | 31 | |
a8909c9b | 32 | chan->private = dma_data->filter_data; |
671999cb | 33 | |
c307e8e3 | 34 | return true; |
4564d10f LPC |
35 | } |
36 | ||
adaa3229 | 37 | static const struct snd_pcm_hardware imx_pcm_hardware = { |
8380222e SH |
38 | .info = SNDRV_PCM_INFO_INTERLEAVED | |
39 | SNDRV_PCM_INFO_BLOCK_TRANSFER | | |
40 | SNDRV_PCM_INFO_MMAP | | |
41 | SNDRV_PCM_INFO_MMAP_VALID | | |
42 | SNDRV_PCM_INFO_PAUSE | | |
43 | SNDRV_PCM_INFO_RESUME, | |
44 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | |
45 | .rate_min = 8000, | |
46 | .channels_min = 2, | |
47 | .channels_max = 2, | |
48 | .buffer_bytes_max = IMX_SSI_DMABUF_SIZE, | |
49 | .period_bytes_min = 128, | |
bf974a0d | 50 | .period_bytes_max = 65535, /* Limited by SDMA engine */ |
8380222e SH |
51 | .periods_min = 2, |
52 | .periods_max = 255, | |
53 | .fifo_size = 0, | |
54 | }; | |
55 | ||
adaa3229 LPC |
56 | static const struct snd_dmaengine_pcm_config imx_dmaengine_pcm_config = { |
57 | .pcm_hardware = &imx_pcm_hardware, | |
58 | .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, | |
59 | .compat_filter_fn = filter, | |
60 | .prealloc_buffer_size = IMX_SSI_DMABUF_SIZE, | |
8380222e SH |
61 | }; |
62 | ||
1927661b | 63 | int imx_pcm_dma_init(struct platform_device *pdev) |
8380222e | 64 | { |
adaa3229 LPC |
65 | return snd_dmaengine_pcm_register(&pdev->dev, &imx_dmaengine_pcm_config, |
66 | SND_DMAENGINE_PCM_FLAG_NO_RESIDUE | | |
67 | SND_DMAENGINE_PCM_FLAG_NO_DT | | |
68 | SND_DMAENGINE_PCM_FLAG_COMPAT); | |
69 | } | |
dbdf6b54 | 70 | EXPORT_SYMBOL_GPL(imx_pcm_dma_init); |
adaa3229 LPC |
71 | |
72 | void imx_pcm_dma_exit(struct platform_device *pdev) | |
73 | { | |
74 | snd_dmaengine_pcm_unregister(&pdev->dev); | |
f0fba2ad | 75 | } |
dbdf6b54 | 76 | EXPORT_SYMBOL_GPL(imx_pcm_dma_exit); |