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