aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2012-09-25 16:24:30 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-10-14 22:29:38 -0400
commit344c5edefbc8fcec7e2863b44ca43a07d9cf46b6 (patch)
treee84f693d0827a96c3729ef0e6207451d0a4c4364 /sound/soc
parent9d01e9b246c37878098056e74a2f8862dc66812e (diff)
ASoC: bells: Add WM0010 support
The Bells system can take a WM0010 as well as a CODEC - assume there's one present by default. While we're at it stop using magic numbers for the DAIs for readability. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/samsung/bells.c72
1 files changed, 53 insertions, 19 deletions
diff --git a/sound/soc/samsung/bells.c b/sound/soc/samsung/bells.c
index 5dc10dfc0d42..b28d68846490 100644
--- a/sound/soc/samsung/bells.c
+++ b/sound/soc/samsung/bells.c
@@ -36,14 +36,19 @@
36 */ 36 */
37#define MCLK_RATE 24576000 37#define MCLK_RATE 24576000
38 38
39#define WM9081_AUDIO_RATE 44100 39#define SYS_AUDIO_RATE 44100
40#define WM9081_MCLK_RATE (WM9081_AUDIO_RATE * 256) 40#define SYS_MCLK_RATE (SYS_AUDIO_RATE * 256)
41
42#define DAI_AP_DSP 0
43#define DAI_DSP_CODEC 1
44#define DAI_CODEC_CP 2
45#define DAI_CODEC_SUB 3
41 46
42static int bells_set_bias_level(struct snd_soc_card *card, 47static int bells_set_bias_level(struct snd_soc_card *card,
43 struct snd_soc_dapm_context *dapm, 48 struct snd_soc_dapm_context *dapm,
44 enum snd_soc_bias_level level) 49 enum snd_soc_bias_level level)
45{ 50{
46 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 51 struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai;
47 struct snd_soc_codec *codec = codec_dai->codec; 52 struct snd_soc_codec *codec = codec_dai->codec;
48 int ret; 53 int ret;
49 54
@@ -80,7 +85,7 @@ static int bells_set_bias_level_post(struct snd_soc_card *card,
80 struct snd_soc_dapm_context *dapm, 85 struct snd_soc_dapm_context *dapm,
81 enum snd_soc_bias_level level) 86 enum snd_soc_bias_level level)
82{ 87{
83 struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; 88 struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai;
84 struct snd_soc_codec *codec = codec_dai->codec; 89 struct snd_soc_codec *codec = codec_dai->codec;
85 int ret; 90 int ret;
86 91
@@ -113,13 +118,20 @@ static int bells_set_bias_level_post(struct snd_soc_card *card,
113 118
114static int bells_late_probe(struct snd_soc_card *card) 119static int bells_late_probe(struct snd_soc_card *card)
115{ 120{
116 struct snd_soc_codec *codec = card->rtd[0].codec; 121 struct snd_soc_codec *wm0010 = card->rtd[DAI_AP_DSP].codec;
117 struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai; 122 struct snd_soc_codec *codec = card->rtd[DAI_DSP_CODEC].codec;
118 struct snd_soc_dai *aif2_dai = card->rtd[1].cpu_dai; 123 struct snd_soc_dai *aif1_dai = card->rtd[DAI_DSP_CODEC].codec_dai;
119 struct snd_soc_dai *aif3_dai = card->rtd[2].cpu_dai; 124 struct snd_soc_dai *aif2_dai = card->rtd[DAI_CODEC_CP].cpu_dai;
120 struct snd_soc_dai *wm9081_dai = card->rtd[2].codec_dai; 125 struct snd_soc_dai *aif3_dai = card->rtd[DAI_CODEC_SUB].cpu_dai;
126 struct snd_soc_dai *wm9081_dai = card->rtd[DAI_CODEC_SUB].codec_dai;
121 int ret; 127 int ret;
122 128
129 ret = snd_soc_codec_set_sysclk(wm0010, 0, 0, SYS_MCLK_RATE, 0);
130 if (ret != 0) {
131 dev_err(wm0010->dev, "Failed to set WM0010 clock: %d\n", ret);
132 return ret;
133 }
134
123 ret = snd_soc_dai_set_sysclk(aif1_dai, ARIZONA_CLK_SYSCLK, 0, 0); 135 ret = snd_soc_dai_set_sysclk(aif1_dai, ARIZONA_CLK_SYSCLK, 0, 0);
124 if (ret != 0) { 136 if (ret != 0) {
125 dev_err(aif1_dai->dev, "Failed to set AIF1 clock: %d\n", ret); 137 dev_err(aif1_dai->dev, "Failed to set AIF1 clock: %d\n", ret);
@@ -147,7 +159,7 @@ static int bells_late_probe(struct snd_soc_card *card)
147 } 159 }
148 160
149 ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_OPCLK, 0, 161 ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_OPCLK, 0,
150 WM9081_MCLK_RATE, SND_SOC_CLOCK_OUT); 162 SYS_MCLK_RATE, SND_SOC_CLOCK_OUT);
151 if (ret != 0) { 163 if (ret != 0) {
152 dev_err(codec->dev, "Failed to set OPCLK: %d\n", ret); 164 dev_err(codec->dev, "Failed to set OPCLK: %d\n", ret);
153 return ret; 165 return ret;
@@ -162,7 +174,7 @@ static int bells_late_probe(struct snd_soc_card *card)
162 } 174 }
163 175
164 ret = snd_soc_codec_set_sysclk(wm9081_dai->codec, WM9081_SYSCLK_MCLK, 176 ret = snd_soc_codec_set_sysclk(wm9081_dai->codec, WM9081_SYSCLK_MCLK,
165 0, WM9081_MCLK_RATE, 0); 177 0, SYS_MCLK_RATE, 0);
166 if (ret != 0) { 178 if (ret != 0) {
167 dev_err(wm9081_dai->dev, "Failed to set MCLK: %d\n", ret); 179 dev_err(wm9081_dai->dev, "Failed to set MCLK: %d\n", ret);
168 return ret; 180 return ret;
@@ -181,22 +193,33 @@ static const struct snd_soc_pcm_stream baseband_params = {
181 193
182static const struct snd_soc_pcm_stream sub_params = { 194static const struct snd_soc_pcm_stream sub_params = {
183 .formats = SNDRV_PCM_FMTBIT_S32_LE, 195 .formats = SNDRV_PCM_FMTBIT_S32_LE,
184 .rate_min = WM9081_AUDIO_RATE, 196 .rate_min = SYS_AUDIO_RATE,
185 .rate_max = WM9081_AUDIO_RATE, 197 .rate_max = SYS_AUDIO_RATE,
186 .channels_min = 2, 198 .channels_min = 2,
187 .channels_max = 2, 199 .channels_max = 2,
188}; 200};
189 201
190static struct snd_soc_dai_link bells_dai_wm5102[] = { 202static struct snd_soc_dai_link bells_dai_wm5102[] = {
191 { 203 {
192 .name = "CPU", 204 .name = "CPU-DSP",
193 .stream_name = "CPU", 205 .stream_name = "CPU-DSP",
194 .cpu_dai_name = "samsung-i2s.0", 206 .cpu_dai_name = "samsung-i2s.0",
195 .codec_dai_name = "wm5102-aif1", 207 .codec_dai_name = "wm0010-sdi1",
196 .platform_name = "samsung-audio", 208 .platform_name = "samsung-audio",
209 .codec_name = "spi0.0",
210 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
211 | SND_SOC_DAIFMT_CBM_CFM,
212 },
213 {
214 .name = "DSP-CODEC",
215 .stream_name = "DSP-CODEC",
216 .cpu_dai_name = "wm0010-sdi2",
217 .codec_dai_name = "wm5102-aif1",
197 .codec_name = "wm5102-codec", 218 .codec_name = "wm5102-codec",
198 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF 219 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
199 | SND_SOC_DAIFMT_CBM_CFM, 220 | SND_SOC_DAIFMT_CBM_CFM,
221 .params = &sub_params,
222 .ignore_suspend = 1,
200 }, 223 },
201 { 224 {
202 .name = "Baseband", 225 .name = "Baseband",
@@ -224,14 +247,25 @@ static struct snd_soc_dai_link bells_dai_wm5102[] = {
224 247
225static struct snd_soc_dai_link bells_dai_wm5110[] = { 248static struct snd_soc_dai_link bells_dai_wm5110[] = {
226 { 249 {
227 .name = "CPU", 250 .name = "CPU-DSP",
228 .stream_name = "CPU", 251 .stream_name = "CPU-DSP",
229 .cpu_dai_name = "samsung-i2s.0", 252 .cpu_dai_name = "samsung-i2s.0",
230 .codec_dai_name = "wm5110-aif1", 253 .codec_dai_name = "wm0010-sdi1",
231 .platform_name = "samsung-audio", 254 .platform_name = "samsung-audio",
255 .codec_name = "spi0.0",
256 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
257 | SND_SOC_DAIFMT_CBM_CFM,
258 },
259 {
260 .name = "DSP-CODEC",
261 .stream_name = "DSP-CODEC",
262 .cpu_dai_name = "wm0010-sdi2",
263 .codec_dai_name = "wm5110-aif1",
232 .codec_name = "wm5110-codec", 264 .codec_name = "wm5110-codec",
233 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF 265 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
234 | SND_SOC_DAIFMT_CBM_CFM, 266 | SND_SOC_DAIFMT_CBM_CFM,
267 .params = &sub_params,
268 .ignore_suspend = 1,
235 }, 269 },
236 { 270 {
237 .name = "Baseband", 271 .name = "Baseband",