Commit | Line | Data |
---|---|---|
05ae3231 | 1 | /* |
f869d42e | 2 | * DB1200/DB1300/DB1550 ASoC audio fabric support code. |
05ae3231 | 3 | * |
adbc7a5a | 4 | * (c) 2008-2011 Manuel Lauss <manuel.lauss@googlemail.com> |
05ae3231 ML |
5 | * |
6 | */ | |
7 | ||
8 | #include <linux/module.h> | |
9 | #include <linux/moduleparam.h> | |
10 | #include <linux/timer.h> | |
11 | #include <linux/interrupt.h> | |
12 | #include <linux/platform_device.h> | |
13 | #include <sound/core.h> | |
14 | #include <sound/pcm.h> | |
15 | #include <sound/soc.h> | |
05ae3231 ML |
16 | #include <asm/mach-au1x00/au1000.h> |
17 | #include <asm/mach-au1x00/au1xxx_psc.h> | |
18 | #include <asm/mach-au1x00/au1xxx_dbdma.h> | |
19 | #include <asm/mach-db1x00/bcsr.h> | |
20 | ||
05ae3231 ML |
21 | #include "../codecs/wm8731.h" |
22 | #include "psc.h" | |
23 | ||
6c219192 | 24 | static const struct platform_device_id db1200_pids[] = { |
adbc7a5a ML |
25 | { |
26 | .name = "db1200-ac97", | |
27 | .driver_data = 0, | |
28 | }, { | |
29 | .name = "db1200-i2s", | |
30 | .driver_data = 1, | |
64cd04d0 ML |
31 | }, { |
32 | .name = "db1300-ac97", | |
33 | .driver_data = 2, | |
34 | }, { | |
35 | .name = "db1300-i2s", | |
36 | .driver_data = 3, | |
f869d42e ML |
37 | }, { |
38 | .name = "db1550-ac97", | |
39 | .driver_data = 4, | |
40 | }, { | |
41 | .name = "db1550-i2s", | |
42 | .driver_data = 5, | |
adbc7a5a ML |
43 | }, |
44 | {}, | |
45 | }; | |
46 | ||
05ae3231 ML |
47 | /*------------------------- AC97 PART ---------------------------*/ |
48 | ||
49 | static struct snd_soc_dai_link db1200_ac97_dai = { | |
50 | .name = "AC97", | |
51 | .stream_name = "AC97 HiFi", | |
f0fba2ad | 52 | .codec_dai_name = "ac97-hifi", |
ffc4fdbb ML |
53 | .cpu_dai_name = "au1xpsc_ac97.1", |
54 | .platform_name = "au1xpsc-pcm.1", | |
55 | .codec_name = "ac97-codec.1", | |
05ae3231 ML |
56 | }; |
57 | ||
58 | static struct snd_soc_card db1200_ac97_machine = { | |
59 | .name = "DB1200_AC97", | |
662d4e5c | 60 | .owner = THIS_MODULE, |
05ae3231 ML |
61 | .dai_link = &db1200_ac97_dai, |
62 | .num_links = 1, | |
05ae3231 ML |
63 | }; |
64 | ||
64cd04d0 ML |
65 | static struct snd_soc_dai_link db1300_ac97_dai = { |
66 | .name = "AC97", | |
67 | .stream_name = "AC97 HiFi", | |
68 | .codec_dai_name = "wm9712-hifi", | |
69 | .cpu_dai_name = "au1xpsc_ac97.1", | |
70 | .platform_name = "au1xpsc-pcm.1", | |
71 | .codec_name = "wm9712-codec.1", | |
72 | }; | |
73 | ||
74 | static struct snd_soc_card db1300_ac97_machine = { | |
75 | .name = "DB1300_AC97", | |
35261edc | 76 | .owner = THIS_MODULE, |
64cd04d0 ML |
77 | .dai_link = &db1300_ac97_dai, |
78 | .num_links = 1, | |
79 | }; | |
80 | ||
f869d42e ML |
81 | static struct snd_soc_card db1550_ac97_machine = { |
82 | .name = "DB1550_AC97", | |
35261edc | 83 | .owner = THIS_MODULE, |
f869d42e ML |
84 | .dai_link = &db1200_ac97_dai, |
85 | .num_links = 1, | |
86 | }; | |
87 | ||
05ae3231 ML |
88 | /*------------------------- I2S PART ---------------------------*/ |
89 | ||
90 | static int db1200_i2s_startup(struct snd_pcm_substream *substream) | |
91 | { | |
92 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | |
f0fba2ad | 93 | struct snd_soc_dai *codec_dai = rtd->codec_dai; |
05ae3231 ML |
94 | |
95 | /* WM8731 has its own 12MHz crystal */ | |
9745e824 | 96 | snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL, |
05ae3231 ML |
97 | 12000000, SND_SOC_CLOCK_IN); |
98 | ||
b4508d0f | 99 | return 0; |
05ae3231 ML |
100 | } |
101 | ||
052fba77 | 102 | static const struct snd_soc_ops db1200_i2s_wm8731_ops = { |
05ae3231 ML |
103 | .startup = db1200_i2s_startup, |
104 | }; | |
105 | ||
106 | static struct snd_soc_dai_link db1200_i2s_dai = { | |
107 | .name = "WM8731", | |
108 | .stream_name = "WM8731 PCM", | |
ffc4fdbb ML |
109 | .codec_dai_name = "wm8731-hifi", |
110 | .cpu_dai_name = "au1xpsc_i2s.1", | |
111 | .platform_name = "au1xpsc-pcm.1", | |
99b59f3c | 112 | .codec_name = "wm8731.0-001b", |
b4508d0f LPC |
113 | .dai_fmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF | |
114 | SND_SOC_DAIFMT_CBM_CFM, | |
05ae3231 ML |
115 | .ops = &db1200_i2s_wm8731_ops, |
116 | }; | |
117 | ||
118 | static struct snd_soc_card db1200_i2s_machine = { | |
119 | .name = "DB1200_I2S", | |
662d4e5c | 120 | .owner = THIS_MODULE, |
05ae3231 ML |
121 | .dai_link = &db1200_i2s_dai, |
122 | .num_links = 1, | |
05ae3231 ML |
123 | }; |
124 | ||
64cd04d0 ML |
125 | static struct snd_soc_dai_link db1300_i2s_dai = { |
126 | .name = "WM8731", | |
127 | .stream_name = "WM8731 PCM", | |
128 | .codec_dai_name = "wm8731-hifi", | |
129 | .cpu_dai_name = "au1xpsc_i2s.2", | |
130 | .platform_name = "au1xpsc-pcm.2", | |
131 | .codec_name = "wm8731.0-001b", | |
e74679b3 LPC |
132 | .dai_fmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF | |
133 | SND_SOC_DAIFMT_CBM_CFM, | |
64cd04d0 ML |
134 | .ops = &db1200_i2s_wm8731_ops, |
135 | }; | |
136 | ||
137 | static struct snd_soc_card db1300_i2s_machine = { | |
138 | .name = "DB1300_I2S", | |
35261edc | 139 | .owner = THIS_MODULE, |
64cd04d0 ML |
140 | .dai_link = &db1300_i2s_dai, |
141 | .num_links = 1, | |
142 | }; | |
143 | ||
f869d42e ML |
144 | static struct snd_soc_dai_link db1550_i2s_dai = { |
145 | .name = "WM8731", | |
146 | .stream_name = "WM8731 PCM", | |
147 | .codec_dai_name = "wm8731-hifi", | |
148 | .cpu_dai_name = "au1xpsc_i2s.3", | |
149 | .platform_name = "au1xpsc-pcm.3", | |
150 | .codec_name = "wm8731.0-001b", | |
e74679b3 LPC |
151 | .dai_fmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF | |
152 | SND_SOC_DAIFMT_CBM_CFM, | |
f869d42e ML |
153 | .ops = &db1200_i2s_wm8731_ops, |
154 | }; | |
155 | ||
156 | static struct snd_soc_card db1550_i2s_machine = { | |
157 | .name = "DB1550_I2S", | |
35261edc | 158 | .owner = THIS_MODULE, |
f869d42e ML |
159 | .dai_link = &db1550_i2s_dai, |
160 | .num_links = 1, | |
161 | }; | |
162 | ||
05ae3231 ML |
163 | /*------------------------- COMMON PART ---------------------------*/ |
164 | ||
5c658be0 | 165 | static struct snd_soc_card *db1200_cards[] = { |
adbc7a5a ML |
166 | &db1200_ac97_machine, |
167 | &db1200_i2s_machine, | |
64cd04d0 ML |
168 | &db1300_ac97_machine, |
169 | &db1300_i2s_machine, | |
f869d42e ML |
170 | &db1550_ac97_machine, |
171 | &db1550_i2s_machine, | |
adbc7a5a | 172 | }; |
05ae3231 | 173 | |
5c658be0 | 174 | static int db1200_audio_probe(struct platform_device *pdev) |
05ae3231 | 175 | { |
adbc7a5a ML |
176 | const struct platform_device_id *pid = platform_get_device_id(pdev); |
177 | struct snd_soc_card *card; | |
05ae3231 | 178 | |
adbc7a5a ML |
179 | card = db1200_cards[pid->driver_data]; |
180 | card->dev = &pdev->dev; | |
2342cafe | 181 | return devm_snd_soc_register_card(&pdev->dev, card); |
adbc7a5a | 182 | } |
05ae3231 | 183 | |
adbc7a5a ML |
184 | static struct platform_driver db1200_audio_driver = { |
185 | .driver = { | |
186 | .name = "db1200-ac97", | |
adbc7a5a ML |
187 | .pm = &snd_soc_pm_ops, |
188 | }, | |
189 | .id_table = db1200_pids, | |
190 | .probe = db1200_audio_probe, | |
adbc7a5a | 191 | }; |
05ae3231 | 192 | |
8a124f9c | 193 | module_platform_driver(db1200_audio_driver); |
05ae3231 ML |
194 | |
195 | MODULE_LICENSE("GPL"); | |
f869d42e | 196 | MODULE_DESCRIPTION("DB1200/DB1300/DB1550 ASoC audio support"); |
05ae3231 | 197 | MODULE_AUTHOR("Manuel Lauss"); |