Blame view

sound/soc/davinci/davinci-evm.c 8.95 KB
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
1
2
3
  /*
   * ASoC driver for TI DAVINCI EVM platform
   *
d6b52039c   Vladimir Barinov   ALSA: Correct Vla...
4
   * Author:      Vladimir Barinov, <vbarinov@embeddedalley.com>
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
5
6
7
8
9
10
11
12
13
14
15
16
   * Copyright:   (C) 2007 MontaVista Software, Inc., <source@mvista.com>
   *
   * 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.
   */
  
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/timer.h>
  #include <linux/interrupt.h>
  #include <linux/platform_device.h>
aa6b904e6   Ben Dooks   ASoC: tlv320aic3x...
17
  #include <linux/i2c.h>
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
18
19
20
21
  #include <sound/core.h>
  #include <sound/pcm.h>
  #include <sound/soc.h>
  #include <sound/soc-dapm.h>
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
22
  #include <asm/dma.h>
f492ec9f0   David Brownell   ASoC: DaVinci EVM...
23
24
25
26
27
  #include <asm/mach-types.h>
  
  #include <mach/asp.h>
  #include <mach/edma.h>
  #include <mach/mux.h>
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
28
29
  
  #include "../codecs/tlv320aic3x.h"
aa9b88ee8   Miguel Aguilar   DaVinci: DM365: V...
30
  #include "../codecs/cq93vc.h"
04f80f5c4   Chaithrika U S   ASoC: Add machine...
31
  #include "../codecs/spdif_transciever.h"
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
32
33
  #include "davinci-pcm.h"
  #include "davinci-i2s.h"
04f80f5c4   Chaithrika U S   ASoC: Add machine...
34
  #include "davinci-mcasp.h"
aa9b88ee8   Miguel Aguilar   DaVinci: DM365: V...
35
  #include "davinci-vcif.h"
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
36

d6f833965   Troy Kisky   ALSA: ASoc: DaVin...
37
38
  #define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \
  		SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF)
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
39
40
41
42
  static int evm_hw_params(struct snd_pcm_substream *substream,
  			 struct snd_pcm_hw_params *params)
  {
  	struct snd_soc_pcm_runtime *rtd = substream->private_data;
9cb132d74   Liam Girdwood   ALSA: asoc: davin...
43
44
  	struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
  	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
45
  	int ret = 0;
05d5e991a   David Brownell   ASoC: Clocking fi...
46
47
48
  	unsigned sysclk;
  
  	/* ASP1 on DM355 EVM is clocked by an external oscillator */
9b95b1667   Miguel Aguilar   ASoC: Davinci: Ad...
49
50
  	if (machine_is_davinci_dm355_evm() || machine_is_davinci_dm6467_evm() ||
  	    machine_is_davinci_dm365_evm())
05d5e991a   David Brownell   ASoC: Clocking fi...
51
52
53
54
55
56
57
58
  		sysclk = 27000000;
  
  	/* ASP0 in DM6446 EVM is clocked by U55, as configured by
  	 * board-dm644x-evm.c using GPIOs from U18.  There are six
  	 * options; here we "know" we use a 48 KHz sample rate.
  	 */
  	else if (machine_is_davinci_evm())
  		sysclk = 12288000;
30230f4cd   Chaithrika U S   ASoC: DaVinci: Ad...
59
60
  	else if (machine_is_davinci_da830_evm() ||
  				machine_is_davinci_da850_evm())
7ae5945f0   Chaithrika U S   ASoC: DaVinci: Su...
61
  		sysclk = 24576000;
05d5e991a   David Brownell   ASoC: Clocking fi...
62
63
  	else
  		return -EINVAL;
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
64
65
  
  	/* set codec DAI configuration */
9e031624d   Troy Kisky   ALSA: ASoC: DaVin...
66
  	ret = snd_soc_dai_set_fmt(codec_dai, AUDIO_FORMAT);
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
67
68
69
70
  	if (ret < 0)
  		return ret;
  
  	/* set cpu DAI configuration */
9e031624d   Troy Kisky   ALSA: ASoC: DaVin...
71
  	ret = snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT);
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
72
73
74
75
  	if (ret < 0)
  		return ret;
  
  	/* set the codec system clock */
05d5e991a   David Brownell   ASoC: Clocking fi...
76
  	ret = snd_soc_dai_set_sysclk(codec_dai, 0, sysclk, SND_SOC_CLOCK_OUT);
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
77
78
79
80
81
  	if (ret < 0)
  		return ret;
  
  	return 0;
  }
8d43d1bc8   Chaithrika U S   ASoC: DaVinci: Ad...
82
83
84
85
86
87
88
89
90
  static int evm_spdif_hw_params(struct snd_pcm_substream *substream,
  				struct snd_pcm_hw_params *params)
  {
  	struct snd_soc_pcm_runtime *rtd = substream->private_data;
  	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
  
  	/* set cpu DAI configuration */
  	return snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT);
  }
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
91
92
93
  static struct snd_soc_ops evm_ops = {
  	.hw_params = evm_hw_params,
  };
8d43d1bc8   Chaithrika U S   ASoC: DaVinci: Ad...
94
95
96
  static struct snd_soc_ops evm_spdif_ops = {
  	.hw_params = evm_spdif_hw_params,
  };
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
97
98
99
100
101
102
103
104
105
  /* davinci-evm machine dapm widgets */
  static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
  	SND_SOC_DAPM_HP("Headphone Jack", NULL),
  	SND_SOC_DAPM_LINE("Line Out", NULL),
  	SND_SOC_DAPM_MIC("Mic Jack", NULL),
  	SND_SOC_DAPM_LINE("Line In", NULL),
  };
  
  /* davinci-evm machine audio_mapnections to the codec pins */
acf497f99   Mark Brown   [ALSA] soc - davi...
106
  static const struct snd_soc_dapm_route audio_map[] = {
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
  	/* Headphone connected to HPLOUT, HPROUT */
  	{"Headphone Jack", NULL, "HPLOUT"},
  	{"Headphone Jack", NULL, "HPROUT"},
  
  	/* Line Out connected to LLOUT, RLOUT */
  	{"Line Out", NULL, "LLOUT"},
  	{"Line Out", NULL, "RLOUT"},
  
  	/* Mic connected to (MIC3L | MIC3R) */
  	{"MIC3L", NULL, "Mic Bias 2V"},
  	{"MIC3R", NULL, "Mic Bias 2V"},
  	{"Mic Bias 2V", NULL, "Mic Jack"},
  
  	/* Line In connected to (LINE1L | LINE2L), (LINE1R | LINE2R) */
  	{"LINE1L", NULL, "Line In"},
  	{"LINE2L", NULL, "Line In"},
  	{"LINE1R", NULL, "Line In"},
  	{"LINE2R", NULL, "Line In"},
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
125
126
127
128
129
  };
  
  /* Logic for a aic3x as connected on a davinci-evm */
  static int evm_aic3x_init(struct snd_soc_codec *codec)
  {
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
130
  	/* Add davinci-evm specific widgets */
acf497f99   Mark Brown   [ALSA] soc - davi...
131
132
  	snd_soc_dapm_new_controls(codec, aic3x_dapm_widgets,
  				  ARRAY_SIZE(aic3x_dapm_widgets));
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
133
134
  
  	/* Set up davinci-evm specific audio path audio_map */
acf497f99   Mark Brown   [ALSA] soc - davi...
135
  	snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
136
137
  
  	/* not connected */
a5302181e   Liam Girdwood   ALSA: asoc: core ...
138
139
140
  	snd_soc_dapm_disable_pin(codec, "MONO_LOUT");
  	snd_soc_dapm_disable_pin(codec, "HPLCOM");
  	snd_soc_dapm_disable_pin(codec, "HPRCOM");
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
141
142
  
  	/* always connected */
a5302181e   Liam Girdwood   ALSA: asoc: core ...
143
144
145
146
  	snd_soc_dapm_enable_pin(codec, "Headphone Jack");
  	snd_soc_dapm_enable_pin(codec, "Line Out");
  	snd_soc_dapm_enable_pin(codec, "Mic Jack");
  	snd_soc_dapm_enable_pin(codec, "Line In");
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
147

a5302181e   Liam Girdwood   ALSA: asoc: core ...
148
  	snd_soc_dapm_sync(codec);
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
149
150
151
152
153
154
155
156
157
158
159
160
161
  
  	return 0;
  }
  
  /* davinci-evm digital audio interface glue - connects codec <--> CPU */
  static struct snd_soc_dai_link evm_dai = {
  	.name = "TLV320AIC3X",
  	.stream_name = "AIC3X",
  	.cpu_dai = &davinci_i2s_dai,
  	.codec_dai = &aic3x_dai,
  	.init = evm_aic3x_init,
  	.ops = &evm_ops,
  };
aa9b88ee8   Miguel Aguilar   DaVinci: DM365: V...
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
  static struct snd_soc_dai_link dm365_evm_dai = {
  #ifdef CONFIG_SND_DM365_AIC3X_CODEC
  	.name = "TLV320AIC3X",
  	.stream_name = "AIC3X",
  	.cpu_dai = &davinci_i2s_dai,
  	.codec_dai = &aic3x_dai,
  	.init = evm_aic3x_init,
  	.ops = &evm_ops,
  #elif defined(CONFIG_SND_DM365_VOICE_CODEC)
  	.name = "Voice Codec - CQ93VC",
  	.stream_name = "CQ93",
  	.cpu_dai = &davinci_vcif_dai,
  	.codec_dai = &cq93vc_dai,
  #endif
  };
04f80f5c4   Chaithrika U S   ASoC: Add machine...
177
178
179
180
181
182
183
184
185
186
187
188
189
190
  static struct snd_soc_dai_link dm6467_evm_dai[] = {
  	{
  		.name = "TLV320AIC3X",
  		.stream_name = "AIC3X",
  		.cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI],
  		.codec_dai = &aic3x_dai,
  		.init = evm_aic3x_init,
  		.ops = &evm_ops,
  	},
  	{
  		.name = "McASP",
  		.stream_name = "spdif",
  		.cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_DIT_DAI],
  		.codec_dai = &dit_stub_dai,
8d43d1bc8   Chaithrika U S   ASoC: DaVinci: Ad...
191
  		.ops = &evm_spdif_ops,
04f80f5c4   Chaithrika U S   ASoC: Add machine...
192
193
  	},
  };
30230f4cd   Chaithrika U S   ASoC: DaVinci: Ad...
194
  static struct snd_soc_dai_link da8xx_evm_dai = {
7ae5945f0   Chaithrika U S   ASoC: DaVinci: Su...
195
196
197
198
199
200
201
  	.name = "TLV320AIC3X",
  	.stream_name = "AIC3X",
  	.cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI],
  	.codec_dai = &aic3x_dai,
  	.init = evm_aic3x_init,
  	.ops = &evm_ops,
  };
04f80f5c4   Chaithrika U S   ASoC: Add machine...
202

aa9b88ee8   Miguel Aguilar   DaVinci: DM365: V...
203
  /* davinci dm6446, dm355 evm audio machine driver */
875065491   Mark Brown   ASoC: Rename snd_...
204
  static struct snd_soc_card snd_soc_card_evm = {
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
205
  	.name = "DaVinci EVM",
87689d567   Mark Brown   ASoC: Push platfo...
206
  	.platform = &davinci_soc_platform,
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
207
208
209
  	.dai_link = &evm_dai,
  	.num_links = 1,
  };
aa9b88ee8   Miguel Aguilar   DaVinci: DM365: V...
210
211
212
213
214
215
216
  /* davinci dm365 evm audio machine driver */
  static struct snd_soc_card dm365_snd_soc_card_evm = {
  	.name = "DaVinci DM365 EVM",
  	.platform = &davinci_soc_platform,
  	.dai_link = &dm365_evm_dai,
  	.num_links = 1,
  };
04f80f5c4   Chaithrika U S   ASoC: Add machine...
217
218
219
220
221
222
223
  /* davinci dm6467 evm audio machine driver */
  static struct snd_soc_card dm6467_snd_soc_card_evm = {
  	.name = "DaVinci DM6467 EVM",
  	.platform = &davinci_soc_platform,
  	.dai_link = dm6467_evm_dai,
  	.num_links = ARRAY_SIZE(dm6467_evm_dai),
  };
7ae5945f0   Chaithrika U S   ASoC: DaVinci: Su...
224
  static struct snd_soc_card da830_snd_soc_card = {
30230f4cd   Chaithrika U S   ASoC: DaVinci: Ad...
225
226
227
228
229
230
231
232
233
  	.name = "DA830/OMAP-L137 EVM",
  	.dai_link = &da8xx_evm_dai,
  	.platform = &davinci_soc_platform,
  	.num_links = 1,
  };
  
  static struct snd_soc_card da850_snd_soc_card = {
  	.name = "DA850/OMAP-L138 EVM",
  	.dai_link = &da8xx_evm_dai,
7ae5945f0   Chaithrika U S   ASoC: DaVinci: Su...
234
235
236
  	.platform = &davinci_soc_platform,
  	.num_links = 1,
  };
f4890b5c0   Chaithrika U S   ASoC: davinci: i2...
237
  static struct aic3x_setup_data aic3x_setup;
7ae5945f0   Chaithrika U S   ASoC: DaVinci: Su...
238

310355c11   Vladimir Barinov   [ALSA] Davinci AS...
239
240
  /* evm audio subsystem */
  static struct snd_soc_device evm_snd_devdata = {
875065491   Mark Brown   ASoC: Rename snd_...
241
  	.card = &snd_soc_card_evm,
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
242
  	.codec_dev = &soc_codec_dev_aic3x,
f4890b5c0   Chaithrika U S   ASoC: davinci: i2...
243
  	.codec_data = &aic3x_setup,
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
244
  };
04f80f5c4   Chaithrika U S   ASoC: Add machine...
245
  /* evm audio subsystem */
aa9b88ee8   Miguel Aguilar   DaVinci: DM365: V...
246
247
248
249
250
251
252
253
254
255
256
  static struct snd_soc_device dm365_evm_snd_devdata = {
  	.card = &dm365_snd_soc_card_evm,
  #ifdef CONFIG_SND_DM365_AIC3X_CODEC
  	.codec_dev = &soc_codec_dev_aic3x,
  	.codec_data = &aic3x_setup,
  #elif defined(CONFIG_SND_DM365_VOICE_CODEC)
  	.codec_dev = &soc_codec_dev_cq93vc,
  #endif
  };
  
  /* evm audio subsystem */
04f80f5c4   Chaithrika U S   ASoC: Add machine...
257
258
259
  static struct snd_soc_device dm6467_evm_snd_devdata = {
  	.card = &dm6467_snd_soc_card_evm,
  	.codec_dev = &soc_codec_dev_aic3x,
f4890b5c0   Chaithrika U S   ASoC: davinci: i2...
260
  	.codec_data = &aic3x_setup,
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
261
  };
7ae5945f0   Chaithrika U S   ASoC: DaVinci: Su...
262
263
264
265
  /* evm audio subsystem */
  static struct snd_soc_device da830_evm_snd_devdata = {
  	.card = &da830_snd_soc_card,
  	.codec_dev = &soc_codec_dev_aic3x,
f4890b5c0   Chaithrika U S   ASoC: davinci: i2...
266
  	.codec_data = &aic3x_setup,
30230f4cd   Chaithrika U S   ASoC: DaVinci: Ad...
267
268
269
270
271
  };
  
  static struct snd_soc_device da850_evm_snd_devdata = {
  	.card		= &da850_snd_soc_card,
  	.codec_dev	= &soc_codec_dev_aic3x,
f4890b5c0   Chaithrika U S   ASoC: davinci: i2...
272
  	.codec_data	= &aic3x_setup,
7ae5945f0   Chaithrika U S   ASoC: DaVinci: Su...
273
  };
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
274
275
276
277
  static struct platform_device *evm_snd_device;
  
  static int __init evm_init(void)
  {
04f80f5c4   Chaithrika U S   ASoC: Add machine...
278
  	struct snd_soc_device *evm_snd_dev_data;
f492ec9f0   David Brownell   ASoC: DaVinci EVM...
279
  	int index;
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
280
  	int ret;
aa9b88ee8   Miguel Aguilar   DaVinci: DM365: V...
281
  	if (machine_is_davinci_evm()) {
04f80f5c4   Chaithrika U S   ASoC: Add machine...
282
  		evm_snd_dev_data = &evm_snd_devdata;
f492ec9f0   David Brownell   ASoC: DaVinci EVM...
283
284
  		index = 0;
  	} else if (machine_is_davinci_dm355_evm()) {
04f80f5c4   Chaithrika U S   ASoC: Add machine...
285
  		evm_snd_dev_data = &evm_snd_devdata;
f492ec9f0   David Brownell   ASoC: DaVinci EVM...
286
  		index = 1;
aa9b88ee8   Miguel Aguilar   DaVinci: DM365: V...
287
288
289
  	} else if (machine_is_davinci_dm365_evm()) {
  		evm_snd_dev_data = &dm365_evm_snd_devdata;
  		index = 0;
04f80f5c4   Chaithrika U S   ASoC: Add machine...
290
291
292
  	} else if (machine_is_davinci_dm6467_evm()) {
  		evm_snd_dev_data = &dm6467_evm_snd_devdata;
  		index = 0;
7ae5945f0   Chaithrika U S   ASoC: DaVinci: Su...
293
294
295
  	} else if (machine_is_davinci_da830_evm()) {
  		evm_snd_dev_data = &da830_evm_snd_devdata;
  		index = 1;
30230f4cd   Chaithrika U S   ASoC: DaVinci: Ad...
296
297
298
  	} else if (machine_is_davinci_da850_evm()) {
  		evm_snd_dev_data = &da850_evm_snd_devdata;
  		index = 0;
f492ec9f0   David Brownell   ASoC: DaVinci EVM...
299
300
301
302
  	} else
  		return -EINVAL;
  
  	evm_snd_device = platform_device_alloc("soc-audio", index);
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
303
304
  	if (!evm_snd_device)
  		return -ENOMEM;
04f80f5c4   Chaithrika U S   ASoC: Add machine...
305
306
  	platform_set_drvdata(evm_snd_device, evm_snd_dev_data);
  	evm_snd_dev_data->dev = &evm_snd_device->dev;
310355c11   Vladimir Barinov   [ALSA] Davinci AS...
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
  	ret = platform_device_add(evm_snd_device);
  	if (ret)
  		platform_device_put(evm_snd_device);
  
  	return ret;
  }
  
  static void __exit evm_exit(void)
  {
  	platform_device_unregister(evm_snd_device);
  }
  
  module_init(evm_init);
  module_exit(evm_exit);
  
  MODULE_AUTHOR("Vladimir Barinov");
  MODULE_DESCRIPTION("TI DAVINCI EVM ASoC driver");
  MODULE_LICENSE("GPL");