aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/atmel/sam9g20_wm8731.c51
1 files changed, 22 insertions, 29 deletions
diff --git a/sound/soc/atmel/sam9g20_wm8731.c b/sound/soc/atmel/sam9g20_wm8731.c
index c88351488f45..228ca6a8e77b 100644
--- a/sound/soc/atmel/sam9g20_wm8731.c
+++ b/sound/soc/atmel/sam9g20_wm8731.c
@@ -195,22 +195,15 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = {
195 .set_bias_level = at91sam9g20ek_set_bias_level, 195 .set_bias_level = at91sam9g20ek_set_bias_level,
196}; 196};
197 197
198static struct platform_device *at91sam9g20ek_snd_device; 198static int __devinit at91sam9g20ek_audio_probe(struct platform_device *pdev)
199
200static int __init at91sam9g20ek_init(void)
201{ 199{
202 struct clk *pllb; 200 struct clk *pllb;
201 struct snd_soc_card *card = &snd_soc_at91sam9g20ek;
203 int ret; 202 int ret;
204 203
205 if (!(machine_is_at91sam9g20ek() || machine_is_at91sam9g20ek_2mmc())) 204 if (!(machine_is_at91sam9g20ek() || machine_is_at91sam9g20ek_2mmc()))
206 return -ENODEV; 205 return -ENODEV;
207 206
208 ret = atmel_ssc_set_audio(0);
209 if (ret != 0) {
210 pr_err("Failed to set SSC 0 for audio: %d\n", ret);
211 return ret;
212 }
213
214 /* 207 /*
215 * Codec MCLK is supplied by PCK0 - set it up. 208 * Codec MCLK is supplied by PCK0 - set it up.
216 */ 209 */
@@ -236,26 +229,14 @@ static int __init at91sam9g20ek_init(void)
236 229
237 clk_set_rate(mclk, MCLK_RATE); 230 clk_set_rate(mclk, MCLK_RATE);
238 231
239 at91sam9g20ek_snd_device = platform_device_alloc("soc-audio", -1); 232 card->dev = &pdev->dev;
240 if (!at91sam9g20ek_snd_device) { 233 ret = snd_soc_register_card(card);
241 printk(KERN_ERR "ASoC: Platform device allocation failed\n");
242 ret = -ENOMEM;
243 goto err_mclk;
244 }
245
246 platform_set_drvdata(at91sam9g20ek_snd_device,
247 &snd_soc_at91sam9g20ek);
248
249 ret = platform_device_add(at91sam9g20ek_snd_device);
250 if (ret) { 234 if (ret) {
251 printk(KERN_ERR "ASoC: Platform device allocation failed\n"); 235 printk(KERN_ERR "ASoC: snd_soc_register_card() failed\n");
252 goto err_device_add;
253 } 236 }
254 237
255 return ret; 238 return ret;
256 239
257err_device_add:
258 platform_device_put(at91sam9g20ek_snd_device);
259err_mclk: 240err_mclk:
260 clk_put(mclk); 241 clk_put(mclk);
261 mclk = NULL; 242 mclk = NULL;
@@ -263,18 +244,30 @@ err:
263 return ret; 244 return ret;
264} 245}
265 246
266static void __exit at91sam9g20ek_exit(void) 247static int __devexit at91sam9g20ek_audio_remove(struct platform_device *pdev)
267{ 248{
268 platform_device_unregister(at91sam9g20ek_snd_device); 249 struct snd_soc_card *card = platform_get_drvdata(pdev);
269 at91sam9g20ek_snd_device = NULL; 250
251 snd_soc_unregister_card(card);
270 clk_put(mclk); 252 clk_put(mclk);
271 mclk = NULL; 253 mclk = NULL;
254
255 return 0;
272} 256}
273 257
274module_init(at91sam9g20ek_init); 258static struct platform_driver at91sam9g20ek_audio_driver = {
275module_exit(at91sam9g20ek_exit); 259 .driver = {
260 .name = "at91sam9g20ek-audio",
261 .owner = THIS_MODULE,
262 },
263 .probe = at91sam9g20ek_audio_probe,
264 .remove = __devexit_p(at91sam9g20ek_audio_remove),
265};
266
267module_platform_driver(at91sam9g20ek_audio_driver);
276 268
277/* Module information */ 269/* Module information */
278MODULE_AUTHOR("Sedji Gaouaou <sedji.gaouaou@atmel.com>"); 270MODULE_AUTHOR("Sedji Gaouaou <sedji.gaouaou@atmel.com>");
279MODULE_DESCRIPTION("ALSA SoC AT91SAM9G20EK_WM8731"); 271MODULE_DESCRIPTION("ALSA SoC AT91SAM9G20EK_WM8731");
272MODULE_ALIAS("platform:at91sam9g20ek-audio");
280MODULE_LICENSE("GPL"); 273MODULE_LICENSE("GPL");