Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
sound
soc-dai.h
Go to the documentation of this file.
1
/*
2
* linux/sound/soc-dai.h -- ALSA SoC Layer
3
*
4
* Copyright: 2005-2008 Wolfson Microelectronics. PLC.
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License version 2 as
8
* published by the Free Software Foundation.
9
*
10
* Digital Audio Interface (DAI) API.
11
*/
12
13
#ifndef __LINUX_SND_SOC_DAI_H
14
#define __LINUX_SND_SOC_DAI_H
15
16
17
#include <linux/list.h>
18
19
struct
snd_pcm_substream
;
20
struct
snd_soc_dapm_widget
;
21
struct
snd_compr_stream
;
22
23
/*
24
* DAI hardware audio formats.
25
*
26
* Describes the physical PCM data formating and clocking. Add new formats
27
* to the end.
28
*/
29
#define SND_SOC_DAIFMT_I2S 1
/* I2S mode */
30
#define SND_SOC_DAIFMT_RIGHT_J 2
/* Right Justified mode */
31
#define SND_SOC_DAIFMT_LEFT_J 3
/* Left Justified mode */
32
#define SND_SOC_DAIFMT_DSP_A 4
/* L data MSB after FRM LRC */
33
#define SND_SOC_DAIFMT_DSP_B 5
/* L data MSB during FRM LRC */
34
#define SND_SOC_DAIFMT_AC97 6
/* AC97 */
35
#define SND_SOC_DAIFMT_PDM 7
/* Pulse density modulation */
36
37
/* left and right justified also known as MSB and LSB respectively */
38
#define SND_SOC_DAIFMT_MSB SND_SOC_DAIFMT_LEFT_J
39
#define SND_SOC_DAIFMT_LSB SND_SOC_DAIFMT_RIGHT_J
40
41
/*
42
* DAI Clock gating.
43
*
44
* DAI bit clocks can be be gated (disabled) when the DAI is not
45
* sending or receiving PCM data in a frame. This can be used to save power.
46
*/
47
#define SND_SOC_DAIFMT_CONT (1 << 4)
/* continuous clock */
48
#define SND_SOC_DAIFMT_GATED (2 << 4)
/* clock is gated */
49
50
/*
51
* DAI hardware signal inversions.
52
*
53
* Specifies whether the DAI can also support inverted clocks for the specified
54
* format.
55
*/
56
#define SND_SOC_DAIFMT_NB_NF (1 << 8)
/* normal bit clock + frame */
57
#define SND_SOC_DAIFMT_NB_IF (2 << 8)
/* normal BCLK + inv FRM */
58
#define SND_SOC_DAIFMT_IB_NF (3 << 8)
/* invert BCLK + nor FRM */
59
#define SND_SOC_DAIFMT_IB_IF (4 << 8)
/* invert BCLK + FRM */
60
61
/*
62
* DAI hardware clock masters.
63
*
64
* This is wrt the codec, the inverse is true for the interface
65
* i.e. if the codec is clk and FRM master then the interface is
66
* clk and frame slave.
67
*/
68
#define SND_SOC_DAIFMT_CBM_CFM (1 << 12)
/* codec clk & FRM master */
69
#define SND_SOC_DAIFMT_CBS_CFM (2 << 12)
/* codec clk slave & FRM master */
70
#define SND_SOC_DAIFMT_CBM_CFS (3 << 12)
/* codec clk master & frame slave */
71
#define SND_SOC_DAIFMT_CBS_CFS (4 << 12)
/* codec clk & FRM slave */
72
73
#define SND_SOC_DAIFMT_FORMAT_MASK 0x000f
74
#define SND_SOC_DAIFMT_CLOCK_MASK 0x00f0
75
#define SND_SOC_DAIFMT_INV_MASK 0x0f00
76
#define SND_SOC_DAIFMT_MASTER_MASK 0xf000
77
78
/*
79
* Master Clock Directions
80
*/
81
#define SND_SOC_CLOCK_IN 0
82
#define SND_SOC_CLOCK_OUT 1
83
84
#define SND_SOC_STD_AC97_FMTS (SNDRV_PCM_FMTBIT_S8 |\
85
SNDRV_PCM_FMTBIT_S16_LE |\
86
SNDRV_PCM_FMTBIT_S16_BE |\
87
SNDRV_PCM_FMTBIT_S20_3LE |\
88
SNDRV_PCM_FMTBIT_S20_3BE |\
89
SNDRV_PCM_FMTBIT_S24_3LE |\
90
SNDRV_PCM_FMTBIT_S24_3BE |\
91
SNDRV_PCM_FMTBIT_S32_LE |\
92
SNDRV_PCM_FMTBIT_S32_BE)
93
94
struct
snd_soc_dai_driver
;
95
struct
snd_soc_dai
;
96
struct
snd_ac97_bus_ops
;
97
98
/* Digital Audio Interface registration */
99
int
snd_soc_register_dai
(
struct
device
*
dev
,
100
struct
snd_soc_dai_driver
*dai_drv);
101
void
snd_soc_unregister_dai
(
struct
device
*
dev
);
102
int
snd_soc_register_dais
(
struct
device
*
dev
,
103
struct
snd_soc_dai_driver
*dai_drv,
size_t
count
);
104
void
snd_soc_unregister_dais
(
struct
device
*
dev
,
size_t
count
);
105
106
/* Digital Audio Interface clocking API.*/
107
int
snd_soc_dai_set_sysclk
(
struct
snd_soc_dai
*
dai
,
int
clk_id,
108
unsigned
int
freq
,
int
dir);
109
110
int
snd_soc_dai_set_clkdiv
(
struct
snd_soc_dai
*
dai
,
111
int
div_id,
int
div
);
112
113
int
snd_soc_dai_set_pll
(
struct
snd_soc_dai
*
dai
,
114
int
pll_id,
int
source
,
unsigned
int
freq_in,
unsigned
int
freq_out);
115
116
/* Digital Audio interface formatting */
117
int
snd_soc_dai_set_fmt
(
struct
snd_soc_dai
*
dai
,
unsigned
int
fmt
);
118
119
int
snd_soc_dai_set_tdm_slot
(
struct
snd_soc_dai
*
dai
,
120
unsigned
int
tx_mask
,
unsigned
int
rx_mask
,
int
slots
,
int
slot_width
);
121
122
int
snd_soc_dai_set_channel_map
(
struct
snd_soc_dai
*
dai
,
123
unsigned
int
tx_num,
unsigned
int
*tx_slot,
124
unsigned
int
rx_num,
unsigned
int
*rx_slot);
125
126
int
snd_soc_dai_set_tristate
(
struct
snd_soc_dai
*
dai
,
int
tristate
);
127
128
/* Digital Audio Interface mute */
129
int
snd_soc_dai_digital_mute
(
struct
snd_soc_dai
*
dai
,
int
mute
);
130
131
struct
snd_soc_dai_ops
{
132
/*
133
* DAI clocking configuration, all optional.
134
* Called by soc_card drivers, normally in their hw_params.
135
*/
136
int
(*
set_sysclk
)(
struct
snd_soc_dai
*
dai
,
137
int
clk_id,
unsigned
int
freq
,
int
dir
);
138
int
(*
set_pll
)(
struct
snd_soc_dai
*
dai
,
int
pll_id,
int
source
,
139
unsigned
int
freq_in,
unsigned
int
freq_out);
140
int
(*
set_clkdiv
)(
struct
snd_soc_dai
*
dai
,
int
div_id,
int
div
);
141
142
/*
143
* DAI format configuration
144
* Called by soc_card drivers, normally in their hw_params.
145
*/
146
int
(*
set_fmt
)(
struct
snd_soc_dai
*
dai
,
unsigned
int
fmt
);
147
int
(*
set_tdm_slot
)(
struct
snd_soc_dai
*
dai
,
148
unsigned
int
tx_mask
,
unsigned
int
rx_mask
,
149
int
slots
,
int
slot_width
);
150
int
(*
set_channel_map
)(
struct
snd_soc_dai
*
dai
,
151
unsigned
int
tx_num,
unsigned
int
*tx_slot,
152
unsigned
int
rx_num,
unsigned
int
*rx_slot);
153
int
(*
set_tristate
)(
struct
snd_soc_dai
*
dai
,
int
tristate
);
154
155
/*
156
* DAI digital mute - optional.
157
* Called by soc-core to minimise any pops.
158
*/
159
int
(*
digital_mute
)(
struct
snd_soc_dai
*
dai
,
int
mute
);
160
161
/*
162
* ALSA PCM audio operations - all optional.
163
* Called by soc-core during audio PCM operations.
164
*/
165
int
(*
startup
)(
struct
snd_pcm_substream
*,
166
struct
snd_soc_dai
*);
167
void
(*
shutdown
)(
struct
snd_pcm_substream
*,
168
struct
snd_soc_dai
*);
169
int
(*
hw_params
)(
struct
snd_pcm_substream
*,
170
struct
snd_pcm_hw_params
*,
struct
snd_soc_dai
*);
171
int
(*
hw_free
)(
struct
snd_pcm_substream
*,
172
struct
snd_soc_dai
*);
173
int
(*
prepare
)(
struct
snd_pcm_substream
*,
174
struct
snd_soc_dai
*);
175
int
(*
trigger
)(
struct
snd_pcm_substream
*,
int
,
176
struct
snd_soc_dai
*);
177
int
(*
bespoke_trigger
)(
struct
snd_pcm_substream
*,
int
,
178
struct
snd_soc_dai
*);
179
/*
180
* For hardware based FIFO caused delay reporting.
181
* Optional.
182
*/
183
snd_pcm_sframes_t
(*
delay
)(
struct
snd_pcm_substream
*,
184
struct
snd_soc_dai
*);
185
};
186
187
/*
188
* Digital Audio Interface Driver.
189
*
190
* Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97
191
* operations and capabilities. Codec and platform drivers will register this
192
* structure for every DAI they have.
193
*
194
* This structure covers the clocking, formating and ALSA operations for each
195
* interface.
196
*/
197
struct
snd_soc_dai_driver
{
198
/* DAI description */
199
const
char
*
name
;
200
unsigned
int
id
;
201
int
ac97_control
;
202
unsigned
int
base
;
203
204
/* DAI driver callbacks */
205
int
(*
probe
)(
struct
snd_soc_dai
*
dai
);
206
int
(*
remove
)(
struct
snd_soc_dai
*
dai
);
207
int
(*
suspend
)(
struct
snd_soc_dai
*
dai
);
208
int
(*
resume
)(
struct
snd_soc_dai
*
dai
);
209
/* compress dai */
210
bool
compress_dai
;
211
212
/* ops */
213
const
struct
snd_soc_dai_ops
*
ops
;
214
215
/* DAI capabilities */
216
struct
snd_soc_pcm_stream
capture
;
217
struct
snd_soc_pcm_stream
playback
;
218
unsigned
int
symmetric_rates
:1;
219
220
/* probe ordering - for components with runtime dependencies */
221
int
probe_order
;
222
int
remove_order
;
223
};
224
225
/*
226
* Digital Audio Interface runtime data.
227
*
228
* Holds runtime data for a DAI.
229
*/
230
struct
snd_soc_dai
{
231
const
char
*
name
;
232
int
id
;
233
struct
device
*
dev
;
234
void
*
ac97_pdata
;
/* platform_data for the ac97 codec */
235
236
/* driver ops */
237
struct
snd_soc_dai_driver
*
driver
;
238
239
/* DAI runtime info */
240
unsigned
int
capture_active
:1;
/* stream is in use */
241
unsigned
int
playback_active
:1;
/* stream is in use */
242
unsigned
int
symmetric_rates
:1;
243
struct
snd_pcm_runtime
*
runtime
;
244
unsigned
int
active
;
245
unsigned
char
pop_wait
:1;
246
unsigned
char
probed
:1;
247
248
struct
snd_soc_dapm_widget
*
playback_widget
;
249
struct
snd_soc_dapm_widget
*
capture_widget
;
250
struct
snd_soc_dapm_context
dapm
;
251
252
/* DAI DMA data */
253
void
*
playback_dma_data
;
254
void
*
capture_dma_data
;
255
256
/* Symmetry data - only valid if symmetry is being enforced */
257
unsigned
int
rate
;
258
259
/* parent platform/codec */
260
struct
snd_soc_platform
*
platform
;
261
struct
snd_soc_codec
*
codec
;
262
263
struct
snd_soc_card
*
card
;
264
265
struct
list_head
list
;
266
struct
list_head
card_list
;
267
};
268
269
static
inline
void
*snd_soc_dai_get_dma_data(
const
struct
snd_soc_dai
*
dai
,
270
const
struct
snd_pcm_substream
*
ss
)
271
{
272
return
(ss->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
) ?
273
dai->
playback_dma_data
: dai->
capture_dma_data
;
274
}
275
276
static
inline
void
snd_soc_dai_set_dma_data(
struct
snd_soc_dai
*dai,
277
const
struct
snd_pcm_substream
*ss,
278
void
*
data
)
279
{
280
if
(ss->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
281
dai->
playback_dma_data
=
data
;
282
else
283
dai->
capture_dma_data
=
data
;
284
}
285
286
static
inline
void
snd_soc_dai_set_drvdata(
struct
snd_soc_dai
*dai,
287
void
*data)
288
{
289
dev_set_drvdata
(dai->
dev
, data);
290
}
291
292
static
inline
void
*snd_soc_dai_get_drvdata(
struct
snd_soc_dai
*dai)
293
{
294
return
dev_get_drvdata
(dai->
dev
);
295
}
296
297
#endif
Generated on Thu Jan 10 2013 14:53:36 for Linux Kernel by
1.8.2