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
65
66
67struct snd_dmaengine_dai_dma_data {
68 dma_addr_t addr;
69 enum dma_slave_buswidth addr_width;
70 u32 maxburst;
71 unsigned int slave_id;
72 void *filter_data;
73 const char *chan_name;
74 unsigned int fifo_size;
75};
76
77void snd_dmaengine_pcm_set_config_from_dai_data(
78 const struct snd_pcm_substream *substream,
79 const struct snd_dmaengine_dai_dma_data *dma_data,
80 struct dma_slave_config *config);
81
82
83
84
85
86
87#define SND_DMAENGINE_PCM_FLAG_COMPAT BIT(0)
88
89
90
91
92#define SND_DMAENGINE_PCM_FLAG_NO_DT BIT(1)
93
94
95
96
97#define SND_DMAENGINE_PCM_FLAG_NO_RESIDUE BIT(2)
98
99
100
101
102#define SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX BIT(3)
103
104
105
106#define SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME BIT(4)
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129struct snd_dmaengine_pcm_config {
130 int (*prepare_slave_config)(struct snd_pcm_substream *substream,
131 struct snd_pcm_hw_params *params,
132 struct dma_slave_config *slave_config);
133 struct dma_chan *(*compat_request_channel)(
134 struct snd_soc_pcm_runtime *rtd,
135 struct snd_pcm_substream *substream);
136 dma_filter_fn compat_filter_fn;
137 struct device *dma_dev;
138 const char *chan_names[SNDRV_PCM_STREAM_LAST + 1];
139
140 const struct snd_pcm_hardware *pcm_hardware;
141 unsigned int prealloc_buffer_size;
142};
143
144int snd_dmaengine_pcm_register(struct device *dev,
145 const struct snd_dmaengine_pcm_config *config,
146 unsigned int flags);
147void snd_dmaengine_pcm_unregister(struct device *dev);
148
149int devm_snd_dmaengine_pcm_register(struct device *dev,
150 const struct snd_dmaengine_pcm_config *config,
151 unsigned int flags);
152
153int snd_dmaengine_pcm_prepare_slave_config(struct snd_pcm_substream *substream,
154 struct snd_pcm_hw_params *params,
155 struct dma_slave_config *slave_config);
156
157#endif
158