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 | ||
102 | static struct snd_soc_ops db1200_i2s_wm8731_ops = { | |
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", | |
132 | .ops = &db1200_i2s_wm8731_ops, | |
133 | }; | |
134 | ||
135 | static struct snd_soc_card db1300_i2s_machine = { | |
136 | .name = "DB1300_I2S", | |
35261edc | 137 | .owner = THIS_MODULE, |
64cd04d0 ML |
138 | .dai_link = &db1300_i2s_dai, |
139 | .num_links = 1, | |
140 | }; | |
141 | ||
f869d42e ML |
142 | static struct snd_soc_dai_link db1550_i2s_dai = { |
143 | .name = "WM8731", | |
144 | .stream_name = "WM8731 PCM", | |
145 | .codec_dai_name = "wm8731-hifi", | |
146 | .cpu_dai_name = "au1xpsc_i2s.3", | |
147 | .platform_name = "au1xpsc-pcm.3", | |
148 | .codec_name = "wm8731.0-001b", | |
149 | .ops = &db1200_i2s_wm8731_ops, | |
150 | }; | |
151 | ||
152 | static struct snd_soc_card db1550_i2s_machine = { | |
153 | .name = "DB1550_I2S", | |
35261edc | 154 | .owner = THIS_MODULE, |
f869d42e ML |
155 | .dai_link = &db1550_i2s_dai, |
156 | .num_links = 1, | |
157 | }; | |
158 | ||
05ae3231 ML |
159 | /*------------------------- COMMON PART ---------------------------*/ |
160 | ||
5c658be0 | 161 | static struct snd_soc_card *db1200_cards[] = { |
adbc7a5a ML |
162 | &db1200_ac97_machine, |
163 | &db1200_i2s_machine, | |
64cd04d0 ML |
164 | &db1300_ac97_machine, |
165 | &db1300_i2s_machine, | |
f869d42e ML |
166 | &db1550_ac97_machine, |
167 | &db1550_i2s_machine, | |
adbc7a5a | 168 | }; |
05ae3231 | 169 | |
5c658be0 | 170 | static int db1200_audio_probe(struct platform_device *pdev) |
05ae3231 | 171 | { |
adbc7a5a ML |
172 | const struct platform_device_id *pid = platform_get_device_id(pdev); |
173 | struct snd_soc_card *card; | |
05ae3231 | 174 | |
adbc7a5a ML |
175 | card = db1200_cards[pid->driver_data]; |
176 | card->dev = &pdev->dev; | |
177 | return snd_soc_register_card(card); | |
178 | } | |
05ae3231 | 179 | |
5c658be0 | 180 | static int db1200_audio_remove(struct platform_device *pdev) |
adbc7a5a ML |
181 | { |
182 | struct snd_soc_card *card = platform_get_drvdata(pdev); | |
183 | snd_soc_unregister_card(card); | |
184 | return 0; | |
185 | } | |
05ae3231 | 186 | |
adbc7a5a ML |
187 | static struct platform_driver db1200_audio_driver = { |
188 | .driver = { | |
189 | .name = "db1200-ac97", | |
adbc7a5a ML |
190 | .pm = &snd_soc_pm_ops, |
191 | }, | |
192 | .id_table = db1200_pids, | |
193 | .probe = db1200_audio_probe, | |
5c658be0 | 194 | .remove = db1200_audio_remove, |
adbc7a5a | 195 | }; |
05ae3231 | 196 | |
8a124f9c | 197 | module_platform_driver(db1200_audio_driver); |
05ae3231 ML |
198 | |
199 | MODULE_LICENSE("GPL"); | |
f869d42e | 200 | MODULE_DESCRIPTION("DB1200/DB1300/DB1550 ASoC audio support"); |
05ae3231 | 201 | MODULE_AUTHOR("Manuel Lauss"); |