1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef __SOUND_DMAENGINE_PCM_H__
16#define __SOUND_DMAENGINE_PCM_H__
17
18#include <sound/pcm.h>
19#include <sound/soc.h>
20#include <linux/dmaengine.h>
21
22
23
24
25
26
27static inline enum dma_transfer_direction
28snd_pcm_substream_to_dma_direction(const struct snd_pcm_substream *substream)
29{
30 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
31 return DMA_MEM_TO_DEV;
32 else
33 return DMA_DEV_TO_MEM;
34}
35
36int snd_hwparams_to_dma_slave_config(const struct snd_pcm_substream *substream,
37 const struct snd_pcm_hw_params *params, struct dma_slave_config *slave_config);
38int snd_dmaengine_pcm_trigger(struct snd_pcm_substream *substream, int cmd);
39snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream);
40snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream *substream);
41
42int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
43 struct dma_chan *chan);
44int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream);
45
46int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
47 dma_filter_fn filter_fn, void *filter_data);
48int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream);
49
50struct dma_chan *snd_dmaengine_pcm_request_channel(dma_filter_fn filter_fn,
51 void *filter_data);
52struct dma_chan *snd_dmaengine_pcm_get_chan(struct snd_pcm_substream *substream);
53
54
55
56
57
58
59
60
61
62
63
64
65struct snd_dmaengine_dai_dma_data {
66 dma_addr_t addr;
67 enum dma_slave_buswidth addr_width;
68 u32 maxburst;
69 unsigned int slave_id;
70 void *filter_data;
71};
72
73void snd_dmaengine_pcm_set_config_from_dai_data(
74 const struct snd_pcm_substream *substream,
75 const struct snd_dmaengine_dai_dma_data *dma_data,
76 struct dma_slave_config *config);
77
78
79
80
81
82
83#define SND_DMAENGINE_PCM_FLAG_COMPAT BIT(0)
84
85
86
87
88#define SND_DMAENGINE_PCM_FLAG_NO_DT BIT(1)
89
90
91
92
93#define SND_DMAENGINE_PCM_FLAG_NO_RESIDUE BIT(2)
94
95
96
97
98#define SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX BIT(3)
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117struct snd_dmaengine_pcm_config {
118 int (*prepare_slave_config)(struct snd_pcm_substream *substream,
119 struct snd_pcm_hw_params *params,
120 struct dma_slave_config *slave_config);
121 struct dma_chan *(*compat_request_channel)(
122 struct snd_soc_pcm_runtime *rtd,
123 struct snd_pcm_substream *substream);
124 dma_filter_fn compat_filter_fn;
125
126 const struct snd_pcm_hardware *pcm_hardware;
127 unsigned int prealloc_buffer_size;
128};
129
130int snd_dmaengine_pcm_register(struct device *dev,
131 const struct snd_dmaengine_pcm_config *config,
132 unsigned int flags);
133void snd_dmaengine_pcm_unregister(struct device *dev);
134
135int snd_dmaengine_pcm_prepare_slave_config(struct snd_pcm_substream *substream,
136 struct snd_pcm_hw_params *params,
137 struct dma_slave_config *slave_config);
138
139#endif
140