aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/davinci/davinci-evm.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/davinci/davinci-evm.c')
-rw-r--r--sound/soc/davinci/davinci-evm.c178
1 files changed, 85 insertions, 93 deletions
diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c
index 97f74d6a33e6..fe7984221eb9 100644
--- a/sound/soc/davinci/davinci-evm.c
+++ b/sound/soc/davinci/davinci-evm.c
@@ -18,7 +18,6 @@
18#include <sound/core.h> 18#include <sound/core.h>
19#include <sound/pcm.h> 19#include <sound/pcm.h>
20#include <sound/soc.h> 20#include <sound/soc.h>
21#include <sound/soc-dapm.h>
22 21
23#include <asm/dma.h> 22#include <asm/dma.h>
24#include <asm/mach-types.h> 23#include <asm/mach-types.h>
@@ -27,13 +26,9 @@
27#include <mach/edma.h> 26#include <mach/edma.h>
28#include <mach/mux.h> 27#include <mach/mux.h>
29 28
30#include "../codecs/tlv320aic3x.h"
31#include "../codecs/cq93vc.h"
32#include "../codecs/spdif_transciever.h"
33#include "davinci-pcm.h" 29#include "davinci-pcm.h"
34#include "davinci-i2s.h" 30#include "davinci-i2s.h"
35#include "davinci-mcasp.h" 31#include "davinci-mcasp.h"
36#include "davinci-vcif.h"
37 32
38#define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \ 33#define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \
39 SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF) 34 SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF)
@@ -41,8 +36,8 @@ static int evm_hw_params(struct snd_pcm_substream *substream,
41 struct snd_pcm_hw_params *params) 36 struct snd_pcm_hw_params *params)
42{ 37{
43 struct snd_soc_pcm_runtime *rtd = substream->private_data; 38 struct snd_soc_pcm_runtime *rtd = substream->private_data;
44 struct snd_soc_dai *codec_dai = rtd->dai->codec_dai; 39 struct snd_soc_dai *codec_dai = rtd->codec_dai;
45 struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; 40 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
46 int ret = 0; 41 int ret = 0;
47 unsigned sysclk; 42 unsigned sysclk;
48 43
@@ -87,7 +82,7 @@ static int evm_spdif_hw_params(struct snd_pcm_substream *substream,
87 struct snd_pcm_hw_params *params) 82 struct snd_pcm_hw_params *params)
88{ 83{
89 struct snd_soc_pcm_runtime *rtd = substream->private_data; 84 struct snd_soc_pcm_runtime *rtd = substream->private_data;
90 struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; 85 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
91 86
92 /* set cpu DAI configuration */ 87 /* set cpu DAI configuration */
93 return snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT); 88 return snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT);
@@ -132,37 +127,53 @@ static const struct snd_soc_dapm_route audio_map[] = {
132}; 127};
133 128
134/* Logic for a aic3x as connected on a davinci-evm */ 129/* Logic for a aic3x as connected on a davinci-evm */
135static int evm_aic3x_init(struct snd_soc_codec *codec) 130static int evm_aic3x_init(struct snd_soc_pcm_runtime *rtd)
136{ 131{
132 struct snd_soc_codec *codec = rtd->codec;
133 struct snd_soc_dapm_context *dapm = &codec->dapm;
134
137 /* Add davinci-evm specific widgets */ 135 /* Add davinci-evm specific widgets */
138 snd_soc_dapm_new_controls(codec, aic3x_dapm_widgets, 136 snd_soc_dapm_new_controls(dapm, aic3x_dapm_widgets,
139 ARRAY_SIZE(aic3x_dapm_widgets)); 137 ARRAY_SIZE(aic3x_dapm_widgets));
140 138
141 /* Set up davinci-evm specific audio path audio_map */ 139 /* Set up davinci-evm specific audio path audio_map */
142 snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map)); 140 snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
143 141
144 /* not connected */ 142 /* not connected */
145 snd_soc_dapm_disable_pin(codec, "MONO_LOUT"); 143 snd_soc_dapm_disable_pin(dapm, "MONO_LOUT");
146 snd_soc_dapm_disable_pin(codec, "HPLCOM"); 144 snd_soc_dapm_disable_pin(dapm, "HPLCOM");
147 snd_soc_dapm_disable_pin(codec, "HPRCOM"); 145 snd_soc_dapm_disable_pin(dapm, "HPRCOM");
148 146
149 /* always connected */ 147 /* always connected */
150 snd_soc_dapm_enable_pin(codec, "Headphone Jack"); 148 snd_soc_dapm_enable_pin(dapm, "Headphone Jack");
151 snd_soc_dapm_enable_pin(codec, "Line Out"); 149 snd_soc_dapm_enable_pin(dapm, "Line Out");
152 snd_soc_dapm_enable_pin(codec, "Mic Jack"); 150 snd_soc_dapm_enable_pin(dapm, "Mic Jack");
153 snd_soc_dapm_enable_pin(codec, "Line In"); 151 snd_soc_dapm_enable_pin(dapm, "Line In");
154 152
155 snd_soc_dapm_sync(codec); 153 snd_soc_dapm_sync(dapm);
156 154
157 return 0; 155 return 0;
158} 156}
159 157
160/* davinci-evm digital audio interface glue - connects codec <--> CPU */ 158/* davinci-evm digital audio interface glue - connects codec <--> CPU */
161static struct snd_soc_dai_link evm_dai = { 159static struct snd_soc_dai_link dm6446_evm_dai = {
160 .name = "TLV320AIC3X",
161 .stream_name = "AIC3X",
162 .cpu_dai_name = "davinci-mcbsp",
163 .codec_dai_name = "tlv320aic3x-hifi",
164 .codec_name = "tlv320aic3x-codec.1-001b",
165 .platform_name = "davinci-pcm-audio",
166 .init = evm_aic3x_init,
167 .ops = &evm_ops,
168};
169
170static struct snd_soc_dai_link dm355_evm_dai = {
162 .name = "TLV320AIC3X", 171 .name = "TLV320AIC3X",
163 .stream_name = "AIC3X", 172 .stream_name = "AIC3X",
164 .cpu_dai = &davinci_i2s_dai, 173 .cpu_dai_name = "davinci-mcbsp.1",
165 .codec_dai = &aic3x_dai, 174 .codec_dai_name = "tlv320aic3x-hifi",
175 .codec_name = "tlv320aic3x-codec.1-001b",
176 .platform_name = "davinci-pcm-audio",
166 .init = evm_aic3x_init, 177 .init = evm_aic3x_init,
167 .ops = &evm_ops, 178 .ops = &evm_ops,
168}; 179};
@@ -171,148 +182,130 @@ static struct snd_soc_dai_link dm365_evm_dai = {
171#ifdef CONFIG_SND_DM365_AIC3X_CODEC 182#ifdef CONFIG_SND_DM365_AIC3X_CODEC
172 .name = "TLV320AIC3X", 183 .name = "TLV320AIC3X",
173 .stream_name = "AIC3X", 184 .stream_name = "AIC3X",
174 .cpu_dai = &davinci_i2s_dai, 185 .cpu_dai_name = "davinci-mcbsp",
175 .codec_dai = &aic3x_dai, 186 .codec_dai_name = "tlv320aic3x-hifi",
176 .init = evm_aic3x_init, 187 .init = evm_aic3x_init,
188 .codec_name = "tlv320aic3x-codec.1-0018",
177 .ops = &evm_ops, 189 .ops = &evm_ops,
178#elif defined(CONFIG_SND_DM365_VOICE_CODEC) 190#elif defined(CONFIG_SND_DM365_VOICE_CODEC)
179 .name = "Voice Codec - CQ93VC", 191 .name = "Voice Codec - CQ93VC",
180 .stream_name = "CQ93", 192 .stream_name = "CQ93",
181 .cpu_dai = &davinci_vcif_dai, 193 .cpu_dai_name = "davinci-vcif",
182 .codec_dai = &cq93vc_dai, 194 .codec_dai_name = "cq93vc-hifi",
195 .codec_name = "cq93vc-codec",
183#endif 196#endif
197 .platform_name = "davinci-pcm-audio",
184}; 198};
185 199
186static struct snd_soc_dai_link dm6467_evm_dai[] = { 200static struct snd_soc_dai_link dm6467_evm_dai[] = {
187 { 201 {
188 .name = "TLV320AIC3X", 202 .name = "TLV320AIC3X",
189 .stream_name = "AIC3X", 203 .stream_name = "AIC3X",
190 .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI], 204 .cpu_dai_name= "davinci-mcasp.0",
191 .codec_dai = &aic3x_dai, 205 .codec_dai_name = "tlv320aic3x-hifi",
206 .platform_name ="davinci-pcm-audio",
207 .codec_name = "tlv320aic3x-codec.0-001a",
192 .init = evm_aic3x_init, 208 .init = evm_aic3x_init,
193 .ops = &evm_ops, 209 .ops = &evm_ops,
194 }, 210 },
195 { 211 {
196 .name = "McASP", 212 .name = "McASP",
197 .stream_name = "spdif", 213 .stream_name = "spdif",
198 .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_DIT_DAI], 214 .cpu_dai_name= "davinci-mcasp.1",
199 .codec_dai = &dit_stub_dai, 215 .codec_dai_name = "dit-hifi",
216 .codec_name = "spdif_dit",
217 .platform_name = "davinci-pcm-audio",
200 .ops = &evm_spdif_ops, 218 .ops = &evm_spdif_ops,
201 }, 219 },
202}; 220};
203static struct snd_soc_dai_link da8xx_evm_dai = { 221
222static struct snd_soc_dai_link da830_evm_dai = {
223 .name = "TLV320AIC3X",
224 .stream_name = "AIC3X",
225 .cpu_dai_name = "davinci-mcasp.1",
226 .codec_dai_name = "tlv320aic3x-hifi",
227 .codec_name = "tlv320aic3x-codec.1-0018",
228 .platform_name = "davinci-pcm-audio",
229 .init = evm_aic3x_init,
230 .ops = &evm_ops,
231};
232
233static struct snd_soc_dai_link da850_evm_dai = {
204 .name = "TLV320AIC3X", 234 .name = "TLV320AIC3X",
205 .stream_name = "AIC3X", 235 .stream_name = "AIC3X",
206 .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI], 236 .cpu_dai_name= "davinci-mcasp.0",
207 .codec_dai = &aic3x_dai, 237 .codec_dai_name = "tlv320aic3x-hifi",
238 .codec_name = "tlv320aic3x-codec.1-0018",
239 .platform_name = "davinci-pcm-audio",
208 .init = evm_aic3x_init, 240 .init = evm_aic3x_init,
209 .ops = &evm_ops, 241 .ops = &evm_ops,
210}; 242};
211 243
212/* davinci dm6446, dm355 evm audio machine driver */ 244/* davinci dm6446 evm audio machine driver */
213static struct snd_soc_card snd_soc_card_evm = { 245static struct snd_soc_card dm6446_snd_soc_card_evm = {
214 .name = "DaVinci EVM", 246 .name = "DaVinci DM6446 EVM",
215 .platform = &davinci_soc_platform, 247 .dai_link = &dm6446_evm_dai,
216 .dai_link = &evm_dai, 248 .num_links = 1,
249};
250
251/* davinci dm355 evm audio machine driver */
252static struct snd_soc_card dm355_snd_soc_card_evm = {
253 .name = "DaVinci DM355 EVM",
254 .dai_link = &dm355_evm_dai,
217 .num_links = 1, 255 .num_links = 1,
218}; 256};
219 257
220/* davinci dm365 evm audio machine driver */ 258/* davinci dm365 evm audio machine driver */
221static struct snd_soc_card dm365_snd_soc_card_evm = { 259static struct snd_soc_card dm365_snd_soc_card_evm = {
222 .name = "DaVinci DM365 EVM", 260 .name = "DaVinci DM365 EVM",
223 .platform = &davinci_soc_platform,
224 .dai_link = &dm365_evm_dai, 261 .dai_link = &dm365_evm_dai,
225 .num_links = 1, 262 .num_links = 1,
226}; 263};
227 264
228
229/* davinci dm6467 evm audio machine driver */ 265/* davinci dm6467 evm audio machine driver */
230static struct snd_soc_card dm6467_snd_soc_card_evm = { 266static struct snd_soc_card dm6467_snd_soc_card_evm = {
231 .name = "DaVinci DM6467 EVM", 267 .name = "DaVinci DM6467 EVM",
232 .platform = &davinci_soc_platform,
233 .dai_link = dm6467_evm_dai, 268 .dai_link = dm6467_evm_dai,
234 .num_links = ARRAY_SIZE(dm6467_evm_dai), 269 .num_links = ARRAY_SIZE(dm6467_evm_dai),
235}; 270};
236 271
237static struct snd_soc_card da830_snd_soc_card = { 272static struct snd_soc_card da830_snd_soc_card = {
238 .name = "DA830/OMAP-L137 EVM", 273 .name = "DA830/OMAP-L137 EVM",
239 .dai_link = &da8xx_evm_dai, 274 .dai_link = &da830_evm_dai,
240 .platform = &davinci_soc_platform,
241 .num_links = 1, 275 .num_links = 1,
242}; 276};
243 277
244static struct snd_soc_card da850_snd_soc_card = { 278static struct snd_soc_card da850_snd_soc_card = {
245 .name = "DA850/OMAP-L138 EVM", 279 .name = "DA850/OMAP-L138 EVM",
246 .dai_link = &da8xx_evm_dai, 280 .dai_link = &da850_evm_dai,
247 .platform = &davinci_soc_platform,
248 .num_links = 1, 281 .num_links = 1,
249}; 282};
250 283
251static struct aic3x_setup_data aic3x_setup;
252
253/* evm audio subsystem */
254static struct snd_soc_device evm_snd_devdata = {
255 .card = &snd_soc_card_evm,
256 .codec_dev = &soc_codec_dev_aic3x,
257 .codec_data = &aic3x_setup,
258};
259
260/* evm audio subsystem */
261static struct snd_soc_device dm365_evm_snd_devdata = {
262 .card = &dm365_snd_soc_card_evm,
263#ifdef CONFIG_SND_DM365_AIC3X_CODEC
264 .codec_dev = &soc_codec_dev_aic3x,
265 .codec_data = &aic3x_setup,
266#elif defined(CONFIG_SND_DM365_VOICE_CODEC)
267 .codec_dev = &soc_codec_dev_cq93vc,
268#endif
269};
270
271/* evm audio subsystem */
272static struct snd_soc_device dm6467_evm_snd_devdata = {
273 .card = &dm6467_snd_soc_card_evm,
274 .codec_dev = &soc_codec_dev_aic3x,
275 .codec_data = &aic3x_setup,
276};
277
278/* evm audio subsystem */
279static struct snd_soc_device da830_evm_snd_devdata = {
280 .card = &da830_snd_soc_card,
281 .codec_dev = &soc_codec_dev_aic3x,
282 .codec_data = &aic3x_setup,
283};
284
285static struct snd_soc_device da850_evm_snd_devdata = {
286 .card = &da850_snd_soc_card,
287 .codec_dev = &soc_codec_dev_aic3x,
288 .codec_data = &aic3x_setup,
289};
290
291static struct platform_device *evm_snd_device; 284static struct platform_device *evm_snd_device;
292 285
293static int __init evm_init(void) 286static int __init evm_init(void)
294{ 287{
295 struct snd_soc_device *evm_snd_dev_data; 288 struct snd_soc_card *evm_snd_dev_data;
296 int index; 289 int index;
297 int ret; 290 int ret;
298 291
299 if (machine_is_davinci_evm()) { 292 if (machine_is_davinci_evm()) {
300 evm_snd_dev_data = &evm_snd_devdata; 293 evm_snd_dev_data = &dm6446_snd_soc_card_evm;
301 index = 0; 294 index = 0;
302 } else if (machine_is_davinci_dm355_evm()) { 295 } else if (machine_is_davinci_dm355_evm()) {
303 evm_snd_dev_data = &evm_snd_devdata; 296 evm_snd_dev_data = &dm355_snd_soc_card_evm;
304 index = 1; 297 index = 1;
305 } else if (machine_is_davinci_dm365_evm()) { 298 } else if (machine_is_davinci_dm365_evm()) {
306 evm_snd_dev_data = &dm365_evm_snd_devdata; 299 evm_snd_dev_data = &dm365_snd_soc_card_evm;
307 index = 0; 300 index = 0;
308 } else if (machine_is_davinci_dm6467_evm()) { 301 } else if (machine_is_davinci_dm6467_evm()) {
309 evm_snd_dev_data = &dm6467_evm_snd_devdata; 302 evm_snd_dev_data = &dm6467_snd_soc_card_evm;
310 index = 0; 303 index = 0;
311 } else if (machine_is_davinci_da830_evm()) { 304 } else if (machine_is_davinci_da830_evm()) {
312 evm_snd_dev_data = &da830_evm_snd_devdata; 305 evm_snd_dev_data = &da830_snd_soc_card;
313 index = 1; 306 index = 1;
314 } else if (machine_is_davinci_da850_evm()) { 307 } else if (machine_is_davinci_da850_evm()) {
315 evm_snd_dev_data = &da850_evm_snd_devdata; 308 evm_snd_dev_data = &da850_snd_soc_card;
316 index = 0; 309 index = 0;
317 } else 310 } else
318 return -EINVAL; 311 return -EINVAL;
@@ -322,7 +315,6 @@ static int __init evm_init(void)
322 return -ENOMEM; 315 return -ENOMEM;
323 316
324 platform_set_drvdata(evm_snd_device, evm_snd_dev_data); 317 platform_set_drvdata(evm_snd_device, evm_snd_dev_data);
325 evm_snd_dev_data->dev = &evm_snd_device->dev;
326 ret = platform_device_add(evm_snd_device); 318 ret = platform_device_add(evm_snd_device);
327 if (ret) 319 if (ret)
328 platform_device_put(evm_snd_device); 320 platform_device_put(evm_snd_device);