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