diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-12-01 23:35:12 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-12-01 23:35:12 -0500 |
commit | 05cf9dd84b91fab91ddf2398ae974516445295f0 (patch) | |
tree | 1a269022425423f937946195e374875e0ebca9d7 | |
parent | 897074d89b26f3f287b144689974672b8b86b805 (diff) | |
parent | 1974a042dd15f1f007a3a1a2dd7a23ca0e42c01d (diff) |
Merge remote-tracking branch 'asoc/topic/samsung' into asoc-next
-rw-r--r-- | include/linux/platform_data/asoc-s3c.h | 6 | ||||
-rw-r--r-- | sound/soc/samsung/ac97.c | 6 | ||||
-rw-r--r-- | sound/soc/samsung/bells.c | 222 | ||||
-rw-r--r-- | sound/soc/samsung/i2s.c | 20 | ||||
-rw-r--r-- | sound/soc/samsung/pcm.c | 12 | ||||
-rw-r--r-- | sound/soc/samsung/spdif.c | 12 |
6 files changed, 190 insertions, 88 deletions
diff --git a/include/linux/platform_data/asoc-s3c.h b/include/linux/platform_data/asoc-s3c.h index aa9875f77c40..88272591a895 100644 --- a/include/linux/platform_data/asoc-s3c.h +++ b/include/linux/platform_data/asoc-s3c.h | |||
@@ -38,12 +38,6 @@ struct samsung_i2s { | |||
38 | #define QUIRK_NEED_RSTCLR (1 << 3) | 38 | #define QUIRK_NEED_RSTCLR (1 << 3) |
39 | /* Quirks of the I2S controller */ | 39 | /* Quirks of the I2S controller */ |
40 | u32 quirks; | 40 | u32 quirks; |
41 | |||
42 | /* | ||
43 | * Array of clock names that can be used to generate I2S signals. | ||
44 | * Also corresponds to clocks of I2SMOD[10] | ||
45 | */ | ||
46 | const char **src_clk; | ||
47 | dma_addr_t idma_addr; | 41 | dma_addr_t idma_addr; |
48 | }; | 42 | }; |
49 | 43 | ||
diff --git a/sound/soc/samsung/ac97.c b/sound/soc/samsung/ac97.c index 14fbcd30cae5..386bab1f99ab 100644 --- a/sound/soc/samsung/ac97.c +++ b/sound/soc/samsung/ac97.c | |||
@@ -442,7 +442,7 @@ static __devinit int s3c_ac97_probe(struct platform_device *pdev) | |||
442 | ret = -ENODEV; | 442 | ret = -ENODEV; |
443 | goto err2; | 443 | goto err2; |
444 | } | 444 | } |
445 | clk_enable(s3c_ac97.ac97_clk); | 445 | clk_prepare_enable(s3c_ac97.ac97_clk); |
446 | 446 | ||
447 | if (ac97_pdata->cfg_gpio(pdev)) { | 447 | if (ac97_pdata->cfg_gpio(pdev)) { |
448 | dev_err(&pdev->dev, "Unable to configure gpio\n"); | 448 | dev_err(&pdev->dev, "Unable to configure gpio\n"); |
@@ -468,7 +468,7 @@ err5: | |||
468 | free_irq(irq_res->start, NULL); | 468 | free_irq(irq_res->start, NULL); |
469 | err4: | 469 | err4: |
470 | err3: | 470 | err3: |
471 | clk_disable(s3c_ac97.ac97_clk); | 471 | clk_disable_unprepare(s3c_ac97.ac97_clk); |
472 | clk_put(s3c_ac97.ac97_clk); | 472 | clk_put(s3c_ac97.ac97_clk); |
473 | err2: | 473 | err2: |
474 | iounmap(s3c_ac97.regs); | 474 | iounmap(s3c_ac97.regs); |
@@ -488,7 +488,7 @@ static __devexit int s3c_ac97_remove(struct platform_device *pdev) | |||
488 | if (irq_res) | 488 | if (irq_res) |
489 | free_irq(irq_res->start, NULL); | 489 | free_irq(irq_res->start, NULL); |
490 | 490 | ||
491 | clk_disable(s3c_ac97.ac97_clk); | 491 | clk_disable_unprepare(s3c_ac97.ac97_clk); |
492 | clk_put(s3c_ac97.ac97_clk); | 492 | clk_put(s3c_ac97.ac97_clk); |
493 | 493 | ||
494 | iounmap(s3c_ac97.regs); | 494 | iounmap(s3c_ac97.regs); |
diff --git a/sound/soc/samsung/bells.c b/sound/soc/samsung/bells.c index a2ca1567b9e4..59ffd6c7ee30 100644 --- a/sound/soc/samsung/bells.c +++ b/sound/soc/samsung/bells.c | |||
@@ -18,15 +18,6 @@ | |||
18 | #include "../codecs/wm5102.h" | 18 | #include "../codecs/wm5102.h" |
19 | #include "../codecs/wm9081.h" | 19 | #include "../codecs/wm9081.h" |
20 | 20 | ||
21 | /* | ||
22 | * 44.1kHz based clocks for the SYSCLK domain, use a very high clock | ||
23 | * to allow all the DSP functionality to be enabled if desired. | ||
24 | */ | ||
25 | #define SYSCLK_RATE (44100 * 1024) | ||
26 | |||
27 | /* 48kHz based clocks for the ASYNC domain */ | ||
28 | #define ASYNCCLK_RATE (48000 * 512) | ||
29 | |||
30 | /* BCLK2 is fixed at this currently */ | 21 | /* BCLK2 is fixed at this currently */ |
31 | #define BCLK2_RATE (64 * 8000) | 22 | #define BCLK2_RATE (64 * 8000) |
32 | 23 | ||
@@ -36,15 +27,40 @@ | |||
36 | */ | 27 | */ |
37 | #define MCLK_RATE 24576000 | 28 | #define MCLK_RATE 24576000 |
38 | 29 | ||
39 | #define WM9081_AUDIO_RATE 44100 | 30 | #define SYS_AUDIO_RATE 44100 |
40 | #define WM9081_MCLK_RATE (WM9081_AUDIO_RATE * 256) | 31 | #define SYS_MCLK_RATE (SYS_AUDIO_RATE * 512) |
32 | |||
33 | #define DAI_AP_DSP 0 | ||
34 | #define DAI_DSP_CODEC 1 | ||
35 | #define DAI_CODEC_CP 2 | ||
36 | #define DAI_CODEC_SUB 3 | ||
37 | |||
38 | struct bells_drvdata { | ||
39 | int sysclk_rate; | ||
40 | int asyncclk_rate; | ||
41 | }; | ||
42 | |||
43 | static struct bells_drvdata wm2200_drvdata = { | ||
44 | .sysclk_rate = 22579200, | ||
45 | }; | ||
46 | |||
47 | static struct bells_drvdata wm5102_drvdata = { | ||
48 | .sysclk_rate = 45158400, | ||
49 | .asyncclk_rate = 49152000, | ||
50 | }; | ||
51 | |||
52 | static struct bells_drvdata wm5110_drvdata = { | ||
53 | .sysclk_rate = 135475200, | ||
54 | .asyncclk_rate = 147456000, | ||
55 | }; | ||
41 | 56 | ||
42 | static int bells_set_bias_level(struct snd_soc_card *card, | 57 | static int bells_set_bias_level(struct snd_soc_card *card, |
43 | struct snd_soc_dapm_context *dapm, | 58 | struct snd_soc_dapm_context *dapm, |
44 | enum snd_soc_bias_level level) | 59 | enum snd_soc_bias_level level) |
45 | { | 60 | { |
46 | struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; | 61 | struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai; |
47 | struct snd_soc_codec *codec = codec_dai->codec; | 62 | struct snd_soc_codec *codec = codec_dai->codec; |
63 | struct bells_drvdata *bells = card->drvdata; | ||
48 | int ret; | 64 | int ret; |
49 | 65 | ||
50 | if (dapm->dev != codec_dai->dev) | 66 | if (dapm->dev != codec_dai->dev) |
@@ -52,18 +68,21 @@ static int bells_set_bias_level(struct snd_soc_card *card, | |||
52 | 68 | ||
53 | switch (level) { | 69 | switch (level) { |
54 | case SND_SOC_BIAS_PREPARE: | 70 | case SND_SOC_BIAS_PREPARE: |
55 | if (dapm->bias_level == SND_SOC_BIAS_STANDBY) { | 71 | if (dapm->bias_level != SND_SOC_BIAS_STANDBY) |
56 | ret = snd_soc_codec_set_pll(codec, WM5102_FLL1, | 72 | break; |
57 | ARIZONA_FLL_SRC_MCLK1, | 73 | |
58 | MCLK_RATE, | 74 | ret = snd_soc_codec_set_pll(codec, WM5102_FLL1, |
59 | SYSCLK_RATE); | 75 | ARIZONA_FLL_SRC_MCLK1, |
60 | if (ret < 0) | 76 | MCLK_RATE, |
61 | pr_err("Failed to start FLL: %d\n", ret); | 77 | bells->sysclk_rate); |
78 | if (ret < 0) | ||
79 | pr_err("Failed to start FLL: %d\n", ret); | ||
62 | 80 | ||
81 | if (bells->asyncclk_rate) { | ||
63 | ret = snd_soc_codec_set_pll(codec, WM5102_FLL2, | 82 | ret = snd_soc_codec_set_pll(codec, WM5102_FLL2, |
64 | ARIZONA_FLL_SRC_AIF2BCLK, | 83 | ARIZONA_FLL_SRC_AIF2BCLK, |
65 | BCLK2_RATE, | 84 | BCLK2_RATE, |
66 | ASYNCCLK_RATE); | 85 | bells->asyncclk_rate); |
67 | if (ret < 0) | 86 | if (ret < 0) |
68 | pr_err("Failed to start FLL: %d\n", ret); | 87 | pr_err("Failed to start FLL: %d\n", ret); |
69 | } | 88 | } |
@@ -80,8 +99,9 @@ static int bells_set_bias_level_post(struct snd_soc_card *card, | |||
80 | struct snd_soc_dapm_context *dapm, | 99 | struct snd_soc_dapm_context *dapm, |
81 | enum snd_soc_bias_level level) | 100 | enum snd_soc_bias_level level) |
82 | { | 101 | { |
83 | struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; | 102 | struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai; |
84 | struct snd_soc_codec *codec = codec_dai->codec; | 103 | struct snd_soc_codec *codec = codec_dai->codec; |
104 | struct bells_drvdata *bells = card->drvdata; | ||
85 | int ret; | 105 | int ret; |
86 | 106 | ||
87 | if (dapm->dev != codec_dai->dev) | 107 | if (dapm->dev != codec_dai->dev) |
@@ -95,10 +115,13 @@ static int bells_set_bias_level_post(struct snd_soc_card *card, | |||
95 | return ret; | 115 | return ret; |
96 | } | 116 | } |
97 | 117 | ||
98 | ret = snd_soc_codec_set_pll(codec, WM5102_FLL2, 0, 0, 0); | 118 | if (bells->asyncclk_rate) { |
99 | if (ret < 0) { | 119 | ret = snd_soc_codec_set_pll(codec, WM5102_FLL2, |
100 | pr_err("Failed to stop FLL: %d\n", ret); | 120 | 0, 0, 0); |
101 | return ret; | 121 | if (ret < 0) { |
122 | pr_err("Failed to stop FLL: %d\n", ret); | ||
123 | return ret; | ||
124 | } | ||
102 | } | 125 | } |
103 | break; | 126 | break; |
104 | 127 | ||
@@ -113,56 +136,73 @@ static int bells_set_bias_level_post(struct snd_soc_card *card, | |||
113 | 136 | ||
114 | static int bells_late_probe(struct snd_soc_card *card) | 137 | static int bells_late_probe(struct snd_soc_card *card) |
115 | { | 138 | { |
116 | struct snd_soc_codec *codec = card->rtd[0].codec; | 139 | struct bells_drvdata *bells = card->drvdata; |
117 | struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai; | 140 | struct snd_soc_codec *wm0010 = card->rtd[DAI_AP_DSP].codec; |
118 | struct snd_soc_dai *aif2_dai = card->rtd[1].cpu_dai; | 141 | struct snd_soc_codec *codec = card->rtd[DAI_DSP_CODEC].codec; |
119 | struct snd_soc_dai *aif3_dai = card->rtd[2].cpu_dai; | 142 | struct snd_soc_dai *aif1_dai = card->rtd[DAI_DSP_CODEC].codec_dai; |
120 | struct snd_soc_dai *wm9081_dai = card->rtd[2].codec_dai; | 143 | struct snd_soc_dai *aif2_dai; |
144 | struct snd_soc_dai *aif3_dai; | ||
145 | struct snd_soc_dai *wm9081_dai; | ||
121 | int ret; | 146 | int ret; |
122 | 147 | ||
123 | ret = snd_soc_dai_set_sysclk(aif1_dai, ARIZONA_CLK_SYSCLK, 0, 0); | 148 | ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, |
149 | ARIZONA_CLK_SRC_FLL1, | ||
150 | bells->sysclk_rate, | ||
151 | SND_SOC_CLOCK_IN); | ||
124 | if (ret != 0) { | 152 | if (ret != 0) { |
125 | dev_err(aif1_dai->dev, "Failed to set AIF1 clock: %d\n", ret); | 153 | dev_err(codec->dev, "Failed to set SYSCLK: %d\n", ret); |
126 | return ret; | 154 | return ret; |
127 | } | 155 | } |
128 | 156 | ||
129 | ret = snd_soc_dai_set_sysclk(aif2_dai, ARIZONA_CLK_ASYNCCLK, 0, 0); | 157 | ret = snd_soc_codec_set_sysclk(wm0010, 0, 0, SYS_MCLK_RATE, 0); |
130 | if (ret != 0) { | 158 | if (ret != 0) { |
131 | dev_err(aif2_dai->dev, "Failed to set AIF2 clock: %d\n", ret); | 159 | dev_err(wm0010->dev, "Failed to set WM0010 clock: %d\n", ret); |
132 | return ret; | 160 | return ret; |
133 | } | 161 | } |
134 | 162 | ||
135 | ret = snd_soc_dai_set_sysclk(aif3_dai, ARIZONA_CLK_SYSCLK, 0, 0); | 163 | ret = snd_soc_dai_set_sysclk(aif1_dai, ARIZONA_CLK_SYSCLK, 0, 0); |
136 | if (ret != 0) { | 164 | if (ret != 0) |
137 | dev_err(aif1_dai->dev, "Failed to set AIF1 clock: %d\n", ret); | 165 | dev_err(aif1_dai->dev, "Failed to set AIF1 clock: %d\n", ret); |
138 | return ret; | ||
139 | } | ||
140 | 166 | ||
141 | ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, | 167 | ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_OPCLK, 0, |
142 | ARIZONA_CLK_SRC_FLL1, SYSCLK_RATE, | 168 | SYS_MCLK_RATE, SND_SOC_CLOCK_OUT); |
169 | if (ret != 0) | ||
170 | dev_err(codec->dev, "Failed to set OPCLK: %d\n", ret); | ||
171 | |||
172 | if (card->num_rtd == DAI_CODEC_CP) | ||
173 | return 0; | ||
174 | |||
175 | ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_ASYNCCLK, | ||
176 | ARIZONA_CLK_SRC_FLL2, | ||
177 | bells->asyncclk_rate, | ||
143 | SND_SOC_CLOCK_IN); | 178 | SND_SOC_CLOCK_IN); |
144 | if (ret != 0) { | 179 | if (ret != 0) { |
145 | dev_err(codec->dev, "Failed to set SYSCLK: %d\n", ret); | 180 | dev_err(codec->dev, "Failed to set ASYNCCLK: %d\n", ret); |
146 | return ret; | 181 | return ret; |
147 | } | 182 | } |
148 | 183 | ||
149 | ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_OPCLK, 0, | 184 | aif2_dai = card->rtd[DAI_CODEC_CP].cpu_dai; |
150 | WM9081_MCLK_RATE, SND_SOC_CLOCK_OUT); | 185 | |
186 | ret = snd_soc_dai_set_sysclk(aif2_dai, ARIZONA_CLK_ASYNCCLK, 0, 0); | ||
151 | if (ret != 0) { | 187 | if (ret != 0) { |
152 | dev_err(codec->dev, "Failed to set OPCLK: %d\n", ret); | 188 | dev_err(aif2_dai->dev, "Failed to set AIF2 clock: %d\n", ret); |
153 | return ret; | 189 | return ret; |
154 | } | 190 | } |
155 | 191 | ||
156 | ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_ASYNCCLK, | 192 | if (card->num_rtd == DAI_CODEC_SUB) |
157 | ARIZONA_CLK_SRC_FLL2, ASYNCCLK_RATE, | 193 | return 0; |
158 | SND_SOC_CLOCK_IN); | 194 | |
195 | aif3_dai = card->rtd[DAI_CODEC_SUB].cpu_dai; | ||
196 | wm9081_dai = card->rtd[DAI_CODEC_SUB].codec_dai; | ||
197 | |||
198 | ret = snd_soc_dai_set_sysclk(aif3_dai, ARIZONA_CLK_SYSCLK, 0, 0); | ||
159 | if (ret != 0) { | 199 | if (ret != 0) { |
160 | dev_err(codec->dev, "Failed to set SYSCLK: %d\n", ret); | 200 | dev_err(aif1_dai->dev, "Failed to set AIF1 clock: %d\n", ret); |
161 | return ret; | 201 | return ret; |
162 | } | 202 | } |
163 | 203 | ||
164 | ret = snd_soc_codec_set_sysclk(wm9081_dai->codec, WM9081_SYSCLK_MCLK, | 204 | ret = snd_soc_codec_set_sysclk(wm9081_dai->codec, WM9081_SYSCLK_MCLK, |
165 | 0, WM9081_MCLK_RATE, 0); | 205 | 0, SYS_MCLK_RATE, 0); |
166 | if (ret != 0) { | 206 | if (ret != 0) { |
167 | dev_err(wm9081_dai->dev, "Failed to set MCLK: %d\n", ret); | 207 | dev_err(wm9081_dai->dev, "Failed to set MCLK: %d\n", ret); |
168 | return ret; | 208 | return ret; |
@@ -181,22 +221,57 @@ static const struct snd_soc_pcm_stream baseband_params = { | |||
181 | 221 | ||
182 | static const struct snd_soc_pcm_stream sub_params = { | 222 | static const struct snd_soc_pcm_stream sub_params = { |
183 | .formats = SNDRV_PCM_FMTBIT_S32_LE, | 223 | .formats = SNDRV_PCM_FMTBIT_S32_LE, |
184 | .rate_min = WM9081_AUDIO_RATE, | 224 | .rate_min = SYS_AUDIO_RATE, |
185 | .rate_max = WM9081_AUDIO_RATE, | 225 | .rate_max = SYS_AUDIO_RATE, |
186 | .channels_min = 2, | 226 | .channels_min = 2, |
187 | .channels_max = 2, | 227 | .channels_max = 2, |
188 | }; | 228 | }; |
189 | 229 | ||
230 | static struct snd_soc_dai_link bells_dai_wm2200[] = { | ||
231 | { | ||
232 | .name = "CPU-DSP", | ||
233 | .stream_name = "CPU-DSP", | ||
234 | .cpu_dai_name = "samsung-i2s.0", | ||
235 | .codec_dai_name = "wm0010-sdi1", | ||
236 | .platform_name = "samsung-audio", | ||
237 | .codec_name = "spi0.0", | ||
238 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | ||
239 | | SND_SOC_DAIFMT_CBM_CFM, | ||
240 | }, | ||
241 | { | ||
242 | .name = "DSP-CODEC", | ||
243 | .stream_name = "DSP-CODEC", | ||
244 | .cpu_dai_name = "wm0010-sdi2", | ||
245 | .codec_dai_name = "wm2200", | ||
246 | .codec_name = "wm2200.1-003a", | ||
247 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | ||
248 | | SND_SOC_DAIFMT_CBM_CFM, | ||
249 | .params = &sub_params, | ||
250 | .ignore_suspend = 1, | ||
251 | }, | ||
252 | }; | ||
253 | |||
190 | static struct snd_soc_dai_link bells_dai_wm5102[] = { | 254 | static struct snd_soc_dai_link bells_dai_wm5102[] = { |
191 | { | 255 | { |
192 | .name = "CPU", | 256 | .name = "CPU-DSP", |
193 | .stream_name = "CPU", | 257 | .stream_name = "CPU-DSP", |
194 | .cpu_dai_name = "samsung-i2s.0", | 258 | .cpu_dai_name = "samsung-i2s.0", |
195 | .codec_dai_name = "wm5102-aif1", | 259 | .codec_dai_name = "wm0010-sdi1", |
196 | .platform_name = "samsung-audio", | 260 | .platform_name = "samsung-audio", |
261 | .codec_name = "spi0.0", | ||
262 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | ||
263 | | SND_SOC_DAIFMT_CBM_CFM, | ||
264 | }, | ||
265 | { | ||
266 | .name = "DSP-CODEC", | ||
267 | .stream_name = "DSP-CODEC", | ||
268 | .cpu_dai_name = "wm0010-sdi2", | ||
269 | .codec_dai_name = "wm5102-aif1", | ||
197 | .codec_name = "wm5102-codec", | 270 | .codec_name = "wm5102-codec", |
198 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 271 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
199 | | SND_SOC_DAIFMT_CBM_CFM, | 272 | | SND_SOC_DAIFMT_CBM_CFM, |
273 | .params = &sub_params, | ||
274 | .ignore_suspend = 1, | ||
200 | }, | 275 | }, |
201 | { | 276 | { |
202 | .name = "Baseband", | 277 | .name = "Baseband", |
@@ -224,14 +299,25 @@ static struct snd_soc_dai_link bells_dai_wm5102[] = { | |||
224 | 299 | ||
225 | static struct snd_soc_dai_link bells_dai_wm5110[] = { | 300 | static struct snd_soc_dai_link bells_dai_wm5110[] = { |
226 | { | 301 | { |
227 | .name = "CPU", | 302 | .name = "CPU-DSP", |
228 | .stream_name = "CPU", | 303 | .stream_name = "CPU-DSP", |
229 | .cpu_dai_name = "samsung-i2s.0", | 304 | .cpu_dai_name = "samsung-i2s.0", |
230 | .codec_dai_name = "wm5110-aif1", | 305 | .codec_dai_name = "wm0010-sdi1", |
231 | .platform_name = "samsung-audio", | 306 | .platform_name = "samsung-audio", |
307 | .codec_name = "spi0.0", | ||
308 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | ||
309 | | SND_SOC_DAIFMT_CBM_CFM, | ||
310 | }, | ||
311 | { | ||
312 | .name = "DSP-CODEC", | ||
313 | .stream_name = "DSP-CODEC", | ||
314 | .cpu_dai_name = "wm0010-sdi2", | ||
315 | .codec_dai_name = "wm5110-aif1", | ||
232 | .codec_name = "wm5110-codec", | 316 | .codec_name = "wm5110-codec", |
233 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 317 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
234 | | SND_SOC_DAIFMT_CBM_CFM, | 318 | | SND_SOC_DAIFMT_CBM_CFM, |
319 | .params = &sub_params, | ||
320 | .ignore_suspend = 1, | ||
235 | }, | 321 | }, |
236 | { | 322 | { |
237 | .name = "Baseband", | 323 | .name = "Baseband", |
@@ -270,6 +356,24 @@ static struct snd_soc_dapm_route bells_routes[] = { | |||
270 | 356 | ||
271 | static struct snd_soc_card bells_cards[] = { | 357 | static struct snd_soc_card bells_cards[] = { |
272 | { | 358 | { |
359 | .name = "Bells WM2200", | ||
360 | .owner = THIS_MODULE, | ||
361 | .dai_link = bells_dai_wm2200, | ||
362 | .num_links = ARRAY_SIZE(bells_dai_wm2200), | ||
363 | .codec_conf = bells_codec_conf, | ||
364 | .num_configs = ARRAY_SIZE(bells_codec_conf), | ||
365 | |||
366 | .late_probe = bells_late_probe, | ||
367 | |||
368 | .dapm_routes = bells_routes, | ||
369 | .num_dapm_routes = ARRAY_SIZE(bells_routes), | ||
370 | |||
371 | .set_bias_level = bells_set_bias_level, | ||
372 | .set_bias_level_post = bells_set_bias_level_post, | ||
373 | |||
374 | .drvdata = &wm2200_drvdata, | ||
375 | }, | ||
376 | { | ||
273 | .name = "Bells WM5102", | 377 | .name = "Bells WM5102", |
274 | .owner = THIS_MODULE, | 378 | .owner = THIS_MODULE, |
275 | .dai_link = bells_dai_wm5102, | 379 | .dai_link = bells_dai_wm5102, |
@@ -284,6 +388,8 @@ static struct snd_soc_card bells_cards[] = { | |||
284 | 388 | ||
285 | .set_bias_level = bells_set_bias_level, | 389 | .set_bias_level = bells_set_bias_level, |
286 | .set_bias_level_post = bells_set_bias_level_post, | 390 | .set_bias_level_post = bells_set_bias_level_post, |
391 | |||
392 | .drvdata = &wm5102_drvdata, | ||
287 | }, | 393 | }, |
288 | { | 394 | { |
289 | .name = "Bells WM5110", | 395 | .name = "Bells WM5110", |
@@ -300,6 +406,8 @@ static struct snd_soc_card bells_cards[] = { | |||
300 | 406 | ||
301 | .set_bias_level = bells_set_bias_level, | 407 | .set_bias_level = bells_set_bias_level, |
302 | .set_bias_level_post = bells_set_bias_level_post, | 408 | .set_bias_level_post = bells_set_bias_level_post, |
409 | |||
410 | .drvdata = &wm5110_drvdata, | ||
303 | }, | 411 | }, |
304 | }; | 412 | }; |
305 | 413 | ||
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c index 40b00a13dcd1..aaf57b7caebb 100644 --- a/sound/soc/samsung/i2s.c +++ b/sound/soc/samsung/i2s.c | |||
@@ -49,8 +49,6 @@ struct i2s_dai { | |||
49 | struct clk *clk; | 49 | struct clk *clk; |
50 | /* Clock for generating I2S signals */ | 50 | /* Clock for generating I2S signals */ |
51 | struct clk *op_clk; | 51 | struct clk *op_clk; |
52 | /* Array of clock names for op_clk */ | ||
53 | const char **src_clk; | ||
54 | /* Pointer to the Primary_Fifo if this is Sec_Fifo, NULL otherwise */ | 52 | /* Pointer to the Primary_Fifo if this is Sec_Fifo, NULL otherwise */ |
55 | struct i2s_dai *pri_dai; | 53 | struct i2s_dai *pri_dai; |
56 | /* Pointer to the Secondary_Fifo if it has one, NULL otherwise */ | 54 | /* Pointer to the Secondary_Fifo if it has one, NULL otherwise */ |
@@ -423,7 +421,7 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, | |||
423 | if (i2s->op_clk) { | 421 | if (i2s->op_clk) { |
424 | if ((clk_id && !(mod & MOD_IMS_SYSMUX)) || | 422 | if ((clk_id && !(mod & MOD_IMS_SYSMUX)) || |
425 | (!clk_id && (mod & MOD_IMS_SYSMUX))) { | 423 | (!clk_id && (mod & MOD_IMS_SYSMUX))) { |
426 | clk_disable(i2s->op_clk); | 424 | clk_disable_unprepare(i2s->op_clk); |
427 | clk_put(i2s->op_clk); | 425 | clk_put(i2s->op_clk); |
428 | } else { | 426 | } else { |
429 | i2s->rclk_srcrate = | 427 | i2s->rclk_srcrate = |
@@ -432,9 +430,13 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, | |||
432 | } | 430 | } |
433 | } | 431 | } |
434 | 432 | ||
435 | i2s->op_clk = clk_get(&i2s->pdev->dev, | 433 | if (clk_id) |
436 | i2s->src_clk[clk_id]); | 434 | i2s->op_clk = clk_get(&i2s->pdev->dev, |
437 | clk_enable(i2s->op_clk); | 435 | "i2s_opclk1"); |
436 | else | ||
437 | i2s->op_clk = clk_get(&i2s->pdev->dev, | ||
438 | "i2s_opclk0"); | ||
439 | clk_prepare_enable(i2s->op_clk); | ||
438 | i2s->rclk_srcrate = clk_get_rate(i2s->op_clk); | 440 | i2s->rclk_srcrate = clk_get_rate(i2s->op_clk); |
439 | 441 | ||
440 | /* Over-ride the other's */ | 442 | /* Over-ride the other's */ |
@@ -880,7 +882,7 @@ static int samsung_i2s_dai_probe(struct snd_soc_dai *dai) | |||
880 | iounmap(i2s->addr); | 882 | iounmap(i2s->addr); |
881 | return -ENOENT; | 883 | return -ENOENT; |
882 | } | 884 | } |
883 | clk_enable(i2s->clk); | 885 | clk_prepare_enable(i2s->clk); |
884 | 886 | ||
885 | if (other) { | 887 | if (other) { |
886 | other->addr = i2s->addr; | 888 | other->addr = i2s->addr; |
@@ -922,7 +924,7 @@ static int samsung_i2s_dai_remove(struct snd_soc_dai *dai) | |||
922 | if (i2s->quirks & QUIRK_NEED_RSTCLR) | 924 | if (i2s->quirks & QUIRK_NEED_RSTCLR) |
923 | writel(0, i2s->addr + I2SCON); | 925 | writel(0, i2s->addr + I2SCON); |
924 | 926 | ||
925 | clk_disable(i2s->clk); | 927 | clk_disable_unprepare(i2s->clk); |
926 | clk_put(i2s->clk); | 928 | clk_put(i2s->clk); |
927 | 929 | ||
928 | iounmap(i2s->addr); | 930 | iounmap(i2s->addr); |
@@ -1067,7 +1069,6 @@ static __devinit int samsung_i2s_probe(struct platform_device *pdev) | |||
1067 | (struct s3c2410_dma_client *)&pri_dai->dma_capture; | 1069 | (struct s3c2410_dma_client *)&pri_dai->dma_capture; |
1068 | pri_dai->dma_playback.channel = dma_pl_chan; | 1070 | pri_dai->dma_playback.channel = dma_pl_chan; |
1069 | pri_dai->dma_capture.channel = dma_cp_chan; | 1071 | pri_dai->dma_capture.channel = dma_cp_chan; |
1070 | pri_dai->src_clk = i2s_cfg->src_clk; | ||
1071 | pri_dai->dma_playback.dma_size = 4; | 1072 | pri_dai->dma_playback.dma_size = 4; |
1072 | pri_dai->dma_capture.dma_size = 4; | 1073 | pri_dai->dma_capture.dma_size = 4; |
1073 | pri_dai->base = regs_base; | 1074 | pri_dai->base = regs_base; |
@@ -1088,7 +1089,6 @@ static __devinit int samsung_i2s_probe(struct platform_device *pdev) | |||
1088 | (struct s3c2410_dma_client *)&sec_dai->dma_playback; | 1089 | (struct s3c2410_dma_client *)&sec_dai->dma_playback; |
1089 | /* Use iDMA always if SysDMA not provided */ | 1090 | /* Use iDMA always if SysDMA not provided */ |
1090 | sec_dai->dma_playback.channel = dma_pl_sec_chan ? : -1; | 1091 | sec_dai->dma_playback.channel = dma_pl_sec_chan ? : -1; |
1091 | sec_dai->src_clk = i2s_cfg->src_clk; | ||
1092 | sec_dai->dma_playback.dma_size = 4; | 1092 | sec_dai->dma_playback.dma_size = 4; |
1093 | sec_dai->base = regs_base; | 1093 | sec_dai->base = regs_base; |
1094 | sec_dai->quirks = quirks; | 1094 | sec_dai->quirks = quirks; |
diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c index c86081992dfd..45f4a752d2a0 100644 --- a/sound/soc/samsung/pcm.c +++ b/sound/soc/samsung/pcm.c | |||
@@ -543,7 +543,7 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev) | |||
543 | ret = PTR_ERR(pcm->cclk); | 543 | ret = PTR_ERR(pcm->cclk); |
544 | goto err1; | 544 | goto err1; |
545 | } | 545 | } |
546 | clk_enable(pcm->cclk); | 546 | clk_prepare_enable(pcm->cclk); |
547 | 547 | ||
548 | /* record our pcm structure for later use in the callbacks */ | 548 | /* record our pcm structure for later use in the callbacks */ |
549 | dev_set_drvdata(&pdev->dev, pcm); | 549 | dev_set_drvdata(&pdev->dev, pcm); |
@@ -568,7 +568,7 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev) | |||
568 | ret = -ENOENT; | 568 | ret = -ENOENT; |
569 | goto err4; | 569 | goto err4; |
570 | } | 570 | } |
571 | clk_enable(pcm->pclk); | 571 | clk_prepare_enable(pcm->pclk); |
572 | 572 | ||
573 | s3c_pcm_stereo_in[pdev->id].dma_addr = mem_res->start | 573 | s3c_pcm_stereo_in[pdev->id].dma_addr = mem_res->start |
574 | + S3C_PCM_RXFIFO; | 574 | + S3C_PCM_RXFIFO; |
@@ -592,14 +592,14 @@ static __devinit int s3c_pcm_dev_probe(struct platform_device *pdev) | |||
592 | return 0; | 592 | return 0; |
593 | 593 | ||
594 | err5: | 594 | err5: |
595 | clk_disable(pcm->pclk); | 595 | clk_disable_unprepare(pcm->pclk); |
596 | clk_put(pcm->pclk); | 596 | clk_put(pcm->pclk); |
597 | err4: | 597 | err4: |
598 | iounmap(pcm->regs); | 598 | iounmap(pcm->regs); |
599 | err3: | 599 | err3: |
600 | release_mem_region(mem_res->start, resource_size(mem_res)); | 600 | release_mem_region(mem_res->start, resource_size(mem_res)); |
601 | err2: | 601 | err2: |
602 | clk_disable(pcm->cclk); | 602 | clk_disable_unprepare(pcm->cclk); |
603 | clk_put(pcm->cclk); | 603 | clk_put(pcm->cclk); |
604 | err1: | 604 | err1: |
605 | return ret; | 605 | return ret; |
@@ -619,8 +619,8 @@ static __devexit int s3c_pcm_dev_remove(struct platform_device *pdev) | |||
619 | mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 619 | mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
620 | release_mem_region(mem_res->start, resource_size(mem_res)); | 620 | release_mem_region(mem_res->start, resource_size(mem_res)); |
621 | 621 | ||
622 | clk_disable(pcm->cclk); | 622 | clk_disable_unprepare(pcm->cclk); |
623 | clk_disable(pcm->pclk); | 623 | clk_disable_unprepare(pcm->pclk); |
624 | clk_put(pcm->pclk); | 624 | clk_put(pcm->pclk); |
625 | clk_put(pcm->cclk); | 625 | clk_put(pcm->cclk); |
626 | 626 | ||
diff --git a/sound/soc/samsung/spdif.c b/sound/soc/samsung/spdif.c index bc24c7af02b2..5f3b06d36e9c 100644 --- a/sound/soc/samsung/spdif.c +++ b/sound/soc/samsung/spdif.c | |||
@@ -397,7 +397,7 @@ static __devinit int spdif_probe(struct platform_device *pdev) | |||
397 | ret = -ENOENT; | 397 | ret = -ENOENT; |
398 | goto err0; | 398 | goto err0; |
399 | } | 399 | } |
400 | clk_enable(spdif->pclk); | 400 | clk_prepare_enable(spdif->pclk); |
401 | 401 | ||
402 | spdif->sclk = clk_get(&pdev->dev, "sclk_spdif"); | 402 | spdif->sclk = clk_get(&pdev->dev, "sclk_spdif"); |
403 | if (IS_ERR(spdif->sclk)) { | 403 | if (IS_ERR(spdif->sclk)) { |
@@ -405,7 +405,7 @@ static __devinit int spdif_probe(struct platform_device *pdev) | |||
405 | ret = -ENOENT; | 405 | ret = -ENOENT; |
406 | goto err1; | 406 | goto err1; |
407 | } | 407 | } |
408 | clk_enable(spdif->sclk); | 408 | clk_prepare_enable(spdif->sclk); |
409 | 409 | ||
410 | /* Request S/PDIF Register's memory region */ | 410 | /* Request S/PDIF Register's memory region */ |
411 | if (!request_mem_region(mem_res->start, | 411 | if (!request_mem_region(mem_res->start, |
@@ -444,10 +444,10 @@ err4: | |||
444 | err3: | 444 | err3: |
445 | release_mem_region(mem_res->start, resource_size(mem_res)); | 445 | release_mem_region(mem_res->start, resource_size(mem_res)); |
446 | err2: | 446 | err2: |
447 | clk_disable(spdif->sclk); | 447 | clk_disable_unprepare(spdif->sclk); |
448 | clk_put(spdif->sclk); | 448 | clk_put(spdif->sclk); |
449 | err1: | 449 | err1: |
450 | clk_disable(spdif->pclk); | 450 | clk_disable_unprepare(spdif->pclk); |
451 | clk_put(spdif->pclk); | 451 | clk_put(spdif->pclk); |
452 | err0: | 452 | err0: |
453 | return ret; | 453 | return ret; |
@@ -466,9 +466,9 @@ static __devexit int spdif_remove(struct platform_device *pdev) | |||
466 | if (mem_res) | 466 | if (mem_res) |
467 | release_mem_region(mem_res->start, resource_size(mem_res)); | 467 | release_mem_region(mem_res->start, resource_size(mem_res)); |
468 | 468 | ||
469 | clk_disable(spdif->sclk); | 469 | clk_disable_unprepare(spdif->sclk); |
470 | clk_put(spdif->sclk); | 470 | clk_put(spdif->sclk); |
471 | clk_disable(spdif->pclk); | 471 | clk_disable_unprepare(spdif->pclk); |
472 | clk_put(spdif->pclk); | 472 | clk_put(spdif->pclk); |
473 | 473 | ||
474 | return 0; | 474 | return 0; |