diff options
Diffstat (limited to 'sound/soc/davinci/davinci-evm.c')
-rw-r--r-- | sound/soc/davinci/davinci-evm.c | 140 |
1 files changed, 85 insertions, 55 deletions
diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c index 58fd1cbedd88..67414f659405 100644 --- a/sound/soc/davinci/davinci-evm.c +++ b/sound/soc/davinci/davinci-evm.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/timer.h> | 14 | #include <linux/timer.h> |
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/i2c.h> | ||
17 | #include <sound/core.h> | 18 | #include <sound/core.h> |
18 | #include <sound/pcm.h> | 19 | #include <sound/pcm.h> |
19 | #include <sound/soc.h> | 20 | #include <sound/soc.h> |
@@ -27,9 +28,10 @@ | |||
27 | #include <mach/mux.h> | 28 | #include <mach/mux.h> |
28 | 29 | ||
29 | #include "../codecs/tlv320aic3x.h" | 30 | #include "../codecs/tlv320aic3x.h" |
31 | #include "../codecs/spdif_transciever.h" | ||
30 | #include "davinci-pcm.h" | 32 | #include "davinci-pcm.h" |
31 | #include "davinci-i2s.h" | 33 | #include "davinci-i2s.h" |
32 | 34 | #include "davinci-mcasp.h" | |
33 | 35 | ||
34 | #define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \ | 36 | #define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \ |
35 | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF) | 37 | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF) |
@@ -43,7 +45,7 @@ static int evm_hw_params(struct snd_pcm_substream *substream, | |||
43 | unsigned sysclk; | 45 | unsigned sysclk; |
44 | 46 | ||
45 | /* ASP1 on DM355 EVM is clocked by an external oscillator */ | 47 | /* ASP1 on DM355 EVM is clocked by an external oscillator */ |
46 | if (machine_is_davinci_dm355_evm()) | 48 | if (machine_is_davinci_dm355_evm() || machine_is_davinci_dm6467_evm()) |
47 | sysclk = 27000000; | 49 | sysclk = 27000000; |
48 | 50 | ||
49 | /* ASP0 in DM6446 EVM is clocked by U55, as configured by | 51 | /* ASP0 in DM6446 EVM is clocked by U55, as configured by |
@@ -53,6 +55,10 @@ static int evm_hw_params(struct snd_pcm_substream *substream, | |||
53 | else if (machine_is_davinci_evm()) | 55 | else if (machine_is_davinci_evm()) |
54 | sysclk = 12288000; | 56 | sysclk = 12288000; |
55 | 57 | ||
58 | else if (machine_is_davinci_da830_evm() || | ||
59 | machine_is_davinci_da850_evm()) | ||
60 | sysclk = 24576000; | ||
61 | |||
56 | else | 62 | else |
57 | return -EINVAL; | 63 | return -EINVAL; |
58 | 64 | ||
@@ -144,6 +150,32 @@ static struct snd_soc_dai_link evm_dai = { | |||
144 | .ops = &evm_ops, | 150 | .ops = &evm_ops, |
145 | }; | 151 | }; |
146 | 152 | ||
153 | static struct snd_soc_dai_link dm6467_evm_dai[] = { | ||
154 | { | ||
155 | .name = "TLV320AIC3X", | ||
156 | .stream_name = "AIC3X", | ||
157 | .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI], | ||
158 | .codec_dai = &aic3x_dai, | ||
159 | .init = evm_aic3x_init, | ||
160 | .ops = &evm_ops, | ||
161 | }, | ||
162 | { | ||
163 | .name = "McASP", | ||
164 | .stream_name = "spdif", | ||
165 | .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_DIT_DAI], | ||
166 | .codec_dai = &dit_stub_dai, | ||
167 | .ops = &evm_ops, | ||
168 | }, | ||
169 | }; | ||
170 | static struct snd_soc_dai_link da8xx_evm_dai = { | ||
171 | .name = "TLV320AIC3X", | ||
172 | .stream_name = "AIC3X", | ||
173 | .cpu_dai = &davinci_mcasp_dai[DAVINCI_MCASP_I2S_DAI], | ||
174 | .codec_dai = &aic3x_dai, | ||
175 | .init = evm_aic3x_init, | ||
176 | .ops = &evm_ops, | ||
177 | }; | ||
178 | |||
147 | /* davinci-evm audio machine driver */ | 179 | /* davinci-evm audio machine driver */ |
148 | static struct snd_soc_card snd_soc_card_evm = { | 180 | static struct snd_soc_card snd_soc_card_evm = { |
149 | .name = "DaVinci EVM", | 181 | .name = "DaVinci EVM", |
@@ -152,73 +184,80 @@ static struct snd_soc_card snd_soc_card_evm = { | |||
152 | .num_links = 1, | 184 | .num_links = 1, |
153 | }; | 185 | }; |
154 | 186 | ||
155 | /* evm audio private data */ | 187 | /* davinci dm6467 evm audio machine driver */ |
156 | static struct aic3x_setup_data evm_aic3x_setup = { | 188 | static struct snd_soc_card dm6467_snd_soc_card_evm = { |
157 | .i2c_bus = 1, | 189 | .name = "DaVinci DM6467 EVM", |
158 | .i2c_address = 0x1b, | 190 | .platform = &davinci_soc_platform, |
191 | .dai_link = dm6467_evm_dai, | ||
192 | .num_links = ARRAY_SIZE(dm6467_evm_dai), | ||
159 | }; | 193 | }; |
160 | 194 | ||
195 | static struct snd_soc_card da830_snd_soc_card = { | ||
196 | .name = "DA830/OMAP-L137 EVM", | ||
197 | .dai_link = &da8xx_evm_dai, | ||
198 | .platform = &davinci_soc_platform, | ||
199 | .num_links = 1, | ||
200 | }; | ||
201 | |||
202 | static struct snd_soc_card da850_snd_soc_card = { | ||
203 | .name = "DA850/OMAP-L138 EVM", | ||
204 | .dai_link = &da8xx_evm_dai, | ||
205 | .platform = &davinci_soc_platform, | ||
206 | .num_links = 1, | ||
207 | }; | ||
208 | |||
209 | static struct aic3x_setup_data aic3x_setup; | ||
210 | |||
161 | /* evm audio subsystem */ | 211 | /* evm audio subsystem */ |
162 | static struct snd_soc_device evm_snd_devdata = { | 212 | static struct snd_soc_device evm_snd_devdata = { |
163 | .card = &snd_soc_card_evm, | 213 | .card = &snd_soc_card_evm, |
164 | .codec_dev = &soc_codec_dev_aic3x, | 214 | .codec_dev = &soc_codec_dev_aic3x, |
165 | .codec_data = &evm_aic3x_setup, | 215 | .codec_data = &aic3x_setup, |
166 | }; | ||
167 | |||
168 | /* DM6446 EVM uses ASP0; line-out is a pair of RCA jacks */ | ||
169 | static struct resource evm_snd_resources[] = { | ||
170 | { | ||
171 | .start = DAVINCI_ASP0_BASE, | ||
172 | .end = DAVINCI_ASP0_BASE + SZ_8K - 1, | ||
173 | .flags = IORESOURCE_MEM, | ||
174 | }, | ||
175 | }; | 216 | }; |
176 | 217 | ||
177 | static struct evm_snd_platform_data evm_snd_data = { | 218 | /* evm audio subsystem */ |
178 | .tx_dma_ch = DAVINCI_DMA_ASP0_TX, | 219 | static struct snd_soc_device dm6467_evm_snd_devdata = { |
179 | .rx_dma_ch = DAVINCI_DMA_ASP0_RX, | 220 | .card = &dm6467_snd_soc_card_evm, |
221 | .codec_dev = &soc_codec_dev_aic3x, | ||
222 | .codec_data = &aic3x_setup, | ||
180 | }; | 223 | }; |
181 | 224 | ||
182 | /* DM335 EVM uses ASP1; line-out is a stereo mini-jack */ | 225 | /* evm audio subsystem */ |
183 | static struct resource dm335evm_snd_resources[] = { | 226 | static struct snd_soc_device da830_evm_snd_devdata = { |
184 | { | 227 | .card = &da830_snd_soc_card, |
185 | .start = DAVINCI_ASP1_BASE, | 228 | .codec_dev = &soc_codec_dev_aic3x, |
186 | .end = DAVINCI_ASP1_BASE + SZ_8K - 1, | 229 | .codec_data = &aic3x_setup, |
187 | .flags = IORESOURCE_MEM, | ||
188 | }, | ||
189 | }; | 230 | }; |
190 | 231 | ||
191 | static struct evm_snd_platform_data dm335evm_snd_data = { | 232 | static struct snd_soc_device da850_evm_snd_devdata = { |
192 | .tx_dma_ch = DAVINCI_DMA_ASP1_TX, | 233 | .card = &da850_snd_soc_card, |
193 | .rx_dma_ch = DAVINCI_DMA_ASP1_RX, | 234 | .codec_dev = &soc_codec_dev_aic3x, |
235 | .codec_data = &aic3x_setup, | ||
194 | }; | 236 | }; |
195 | 237 | ||
196 | static struct platform_device *evm_snd_device; | 238 | static struct platform_device *evm_snd_device; |
197 | 239 | ||
198 | static int __init evm_init(void) | 240 | static int __init evm_init(void) |
199 | { | 241 | { |
200 | struct resource *resources; | 242 | struct snd_soc_device *evm_snd_dev_data; |
201 | unsigned num_resources; | ||
202 | struct evm_snd_platform_data *data; | ||
203 | int index; | 243 | int index; |
204 | int ret; | 244 | int ret; |
205 | 245 | ||
206 | if (machine_is_davinci_evm()) { | 246 | if (machine_is_davinci_evm()) { |
207 | davinci_cfg_reg(DM644X_MCBSP); | 247 | evm_snd_dev_data = &evm_snd_devdata; |
208 | |||
209 | resources = evm_snd_resources; | ||
210 | num_resources = ARRAY_SIZE(evm_snd_resources); | ||
211 | data = &evm_snd_data; | ||
212 | index = 0; | 248 | index = 0; |
213 | } else if (machine_is_davinci_dm355_evm()) { | 249 | } else if (machine_is_davinci_dm355_evm()) { |
214 | /* we don't use ASP1 IRQs, or we'd need to mux them ... */ | 250 | evm_snd_dev_data = &evm_snd_devdata; |
215 | davinci_cfg_reg(DM355_EVT8_ASP1_TX); | 251 | index = 1; |
216 | davinci_cfg_reg(DM355_EVT9_ASP1_RX); | 252 | } else if (machine_is_davinci_dm6467_evm()) { |
217 | 253 | evm_snd_dev_data = &dm6467_evm_snd_devdata; | |
218 | resources = dm335evm_snd_resources; | 254 | index = 0; |
219 | num_resources = ARRAY_SIZE(dm335evm_snd_resources); | 255 | } else if (machine_is_davinci_da830_evm()) { |
220 | data = &dm335evm_snd_data; | 256 | evm_snd_dev_data = &da830_evm_snd_devdata; |
221 | index = 1; | 257 | index = 1; |
258 | } else if (machine_is_davinci_da850_evm()) { | ||
259 | evm_snd_dev_data = &da850_evm_snd_devdata; | ||
260 | index = 0; | ||
222 | } else | 261 | } else |
223 | return -EINVAL; | 262 | return -EINVAL; |
224 | 263 | ||
@@ -226,17 +265,8 @@ static int __init evm_init(void) | |||
226 | if (!evm_snd_device) | 265 | if (!evm_snd_device) |
227 | return -ENOMEM; | 266 | return -ENOMEM; |
228 | 267 | ||
229 | platform_set_drvdata(evm_snd_device, &evm_snd_devdata); | 268 | platform_set_drvdata(evm_snd_device, evm_snd_dev_data); |
230 | evm_snd_devdata.dev = &evm_snd_device->dev; | 269 | evm_snd_dev_data->dev = &evm_snd_device->dev; |
231 | platform_device_add_data(evm_snd_device, data, sizeof(*data)); | ||
232 | |||
233 | ret = platform_device_add_resources(evm_snd_device, resources, | ||
234 | num_resources); | ||
235 | if (ret) { | ||
236 | platform_device_put(evm_snd_device); | ||
237 | return ret; | ||
238 | } | ||
239 | |||
240 | ret = platform_device_add(evm_snd_device); | 270 | ret = platform_device_add(evm_snd_device); |
241 | if (ret) | 271 | if (ret) |
242 | platform_device_put(evm_snd_device); | 272 | platform_device_put(evm_snd_device); |