Blame view

sound/soc/au1x/db1200.c 4.98 KB
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
1
  /*
f869d42e5   Manuel Lauss   MIPS: Alchemy: Im...
2
   * DB1200/DB1300/DB1550 ASoC audio fabric support code.
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
3
   *
adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
4
   * (c) 2008-2011 Manuel Lauss <manuel.lauss@googlemail.com>
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
5
6
7
8
9
10
11
12
13
14
15
   *
   */
  
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/timer.h>
  #include <linux/interrupt.h>
  #include <linux/platform_device.h>
  #include <sound/core.h>
  #include <sound/pcm.h>
  #include <sound/soc.h>
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
16
17
18
19
  #include <asm/mach-au1x00/au1000.h>
  #include <asm/mach-au1x00/au1xxx_psc.h>
  #include <asm/mach-au1x00/au1xxx_dbdma.h>
  #include <asm/mach-db1x00/bcsr.h>
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
20
21
  #include "../codecs/wm8731.h"
  #include "psc.h"
adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
22
23
24
25
26
27
28
  static struct platform_device_id db1200_pids[] = {
  	{
  		.name		= "db1200-ac97",
  		.driver_data	= 0,
  	}, {
  		.name		= "db1200-i2s",
  		.driver_data	= 1,
64cd04d0c   Manuel Lauss   MIPS: Alchemy: Ba...
29
30
31
32
33
34
  	}, {
  		.name		= "db1300-ac97",
  		.driver_data	= 2,
  	}, {
  		.name		= "db1300-i2s",
  		.driver_data	= 3,
f869d42e5   Manuel Lauss   MIPS: Alchemy: Im...
35
36
37
38
39
40
  	}, {
  		.name		= "db1550-ac97",
  		.driver_data	= 4,
  	}, {
  		.name		= "db1550-i2s",
  		.driver_data	= 5,
adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
41
42
43
  	},
  	{},
  };
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
44
45
46
47
48
  /*-------------------------  AC97 PART  ---------------------------*/
  
  static struct snd_soc_dai_link db1200_ac97_dai = {
  	.name		= "AC97",
  	.stream_name	= "AC97 HiFi",
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
49
  	.codec_dai_name	= "ac97-hifi",
ffc4fdbbe   Manuel Lauss   ASoC: fix au1x pl...
50
51
52
  	.cpu_dai_name	= "au1xpsc_ac97.1",
  	.platform_name	= "au1xpsc-pcm.1",
  	.codec_name	= "ac97-codec.1",
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
53
54
55
56
  };
  
  static struct snd_soc_card db1200_ac97_machine = {
  	.name		= "DB1200_AC97",
662d4e5c2   Axel Lin   ASoC: au1x: Add ....
57
  	.owner		= THIS_MODULE,
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
58
59
  	.dai_link	= &db1200_ac97_dai,
  	.num_links	= 1,
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
60
  };
64cd04d0c   Manuel Lauss   MIPS: Alchemy: Ba...
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  static struct snd_soc_dai_link db1300_ac97_dai = {
  	.name		= "AC97",
  	.stream_name	= "AC97 HiFi",
  	.codec_dai_name	= "wm9712-hifi",
  	.cpu_dai_name	= "au1xpsc_ac97.1",
  	.platform_name	= "au1xpsc-pcm.1",
  	.codec_name	= "wm9712-codec.1",
  };
  
  static struct snd_soc_card db1300_ac97_machine = {
  	.name		= "DB1300_AC97",
  	.dai_link	= &db1300_ac97_dai,
  	.num_links	= 1,
  };
f869d42e5   Manuel Lauss   MIPS: Alchemy: Im...
75
76
77
78
79
  static struct snd_soc_card db1550_ac97_machine = {
  	.name		= "DB1550_AC97",
  	.dai_link	= &db1200_ac97_dai,
  	.num_links	= 1,
  };
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
80
81
82
83
84
  /*-------------------------  I2S PART  ---------------------------*/
  
  static int db1200_i2s_startup(struct snd_pcm_substream *substream)
  {
  	struct snd_soc_pcm_runtime *rtd = substream->private_data;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
85
86
  	struct snd_soc_dai *codec_dai = rtd->codec_dai;
  	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
87
88
89
  	int ret;
  
  	/* WM8731 has its own 12MHz crystal */
9745e824a   Mark Brown   ASoC: Support non...
90
  	snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL,
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  				12000000, SND_SOC_CLOCK_IN);
  
  	/* codec is bitclock and lrclk master */
  	ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_LEFT_J |
  			SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
  	if (ret < 0)
  		goto out;
  
  	ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_LEFT_J |
  			SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM);
  	if (ret < 0)
  		goto out;
  
  	ret = 0;
  out:
  	return ret;
  }
  
  static struct snd_soc_ops db1200_i2s_wm8731_ops = {
  	.startup	= db1200_i2s_startup,
  };
  
  static struct snd_soc_dai_link db1200_i2s_dai = {
  	.name		= "WM8731",
  	.stream_name	= "WM8731 PCM",
ffc4fdbbe   Manuel Lauss   ASoC: fix au1x pl...
116
117
118
  	.codec_dai_name	= "wm8731-hifi",
  	.cpu_dai_name	= "au1xpsc_i2s.1",
  	.platform_name	= "au1xpsc-pcm.1",
99b59f3cc   Mark Brown   ASoC: Remove -cod...
119
  	.codec_name	= "wm8731.0-001b",
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
120
121
122
123
124
  	.ops		= &db1200_i2s_wm8731_ops,
  };
  
  static struct snd_soc_card db1200_i2s_machine = {
  	.name		= "DB1200_I2S",
662d4e5c2   Axel Lin   ASoC: au1x: Add ....
125
  	.owner		= THIS_MODULE,
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
126
127
  	.dai_link	= &db1200_i2s_dai,
  	.num_links	= 1,
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
128
  };
64cd04d0c   Manuel Lauss   MIPS: Alchemy: Ba...
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
  static struct snd_soc_dai_link db1300_i2s_dai = {
  	.name		= "WM8731",
  	.stream_name	= "WM8731 PCM",
  	.codec_dai_name	= "wm8731-hifi",
  	.cpu_dai_name	= "au1xpsc_i2s.2",
  	.platform_name	= "au1xpsc-pcm.2",
  	.codec_name	= "wm8731.0-001b",
  	.ops		= &db1200_i2s_wm8731_ops,
  };
  
  static struct snd_soc_card db1300_i2s_machine = {
  	.name		= "DB1300_I2S",
  	.dai_link	= &db1300_i2s_dai,
  	.num_links	= 1,
  };
f869d42e5   Manuel Lauss   MIPS: Alchemy: Im...
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
  static struct snd_soc_dai_link db1550_i2s_dai = {
  	.name		= "WM8731",
  	.stream_name	= "WM8731 PCM",
  	.codec_dai_name	= "wm8731-hifi",
  	.cpu_dai_name	= "au1xpsc_i2s.3",
  	.platform_name	= "au1xpsc-pcm.3",
  	.codec_name	= "wm8731.0-001b",
  	.ops		= &db1200_i2s_wm8731_ops,
  };
  
  static struct snd_soc_card db1550_i2s_machine = {
  	.name		= "DB1550_I2S",
  	.dai_link	= &db1550_i2s_dai,
  	.num_links	= 1,
  };
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
159
  /*-------------------------  COMMON PART  ---------------------------*/
adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
160
161
162
  static struct snd_soc_card *db1200_cards[] __devinitdata = {
  	&db1200_ac97_machine,
  	&db1200_i2s_machine,
64cd04d0c   Manuel Lauss   MIPS: Alchemy: Ba...
163
164
  	&db1300_ac97_machine,
  	&db1300_i2s_machine,
f869d42e5   Manuel Lauss   MIPS: Alchemy: Im...
165
166
  	&db1550_ac97_machine,
  	&db1550_i2s_machine,
adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
167
  };
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
168

adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
169
  static int __devinit db1200_audio_probe(struct platform_device *pdev)
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
170
  {
adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
171
172
  	const struct platform_device_id *pid = platform_get_device_id(pdev);
  	struct snd_soc_card *card;
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
173

adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
174
175
176
177
  	card = db1200_cards[pid->driver_data];
  	card->dev = &pdev->dev;
  	return snd_soc_register_card(card);
  }
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
178

adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
179
180
181
182
183
184
  static int __devexit db1200_audio_remove(struct platform_device *pdev)
  {
  	struct snd_soc_card *card = platform_get_drvdata(pdev);
  	snd_soc_unregister_card(card);
  	return 0;
  }
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
185

adbc7a5a6   Manuel Lauss   ASoC: au1x: updat...
186
187
188
189
190
191
192
193
194
195
  static struct platform_driver db1200_audio_driver = {
  	.driver	= {
  		.name	= "db1200-ac97",
  		.owner	= THIS_MODULE,
  		.pm	= &snd_soc_pm_ops,
  	},
  	.id_table	= db1200_pids,
  	.probe		= db1200_audio_probe,
  	.remove		= __devexit_p(db1200_audio_remove),
  };
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
196

8a124f9cc   Axel Lin   ASoC: Convert au1...
197
  module_platform_driver(db1200_audio_driver);
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
198
199
  
  MODULE_LICENSE("GPL");
f869d42e5   Manuel Lauss   MIPS: Alchemy: Im...
200
  MODULE_DESCRIPTION("DB1200/DB1300/DB1550 ASoC audio support");
05ae32318   Manuel Lauss   MIPS/SOUND: Alche...
201
  MODULE_AUTHOR("Manuel Lauss");