diff options
Diffstat (limited to 'sound/soc/atmel')
-rw-r--r-- | sound/soc/atmel/sam9g20_wm8731.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/sound/soc/atmel/sam9g20_wm8731.c b/sound/soc/atmel/sam9g20_wm8731.c index aa524235fd98..173a239a541c 100644 --- a/sound/soc/atmel/sam9g20_wm8731.c +++ b/sound/soc/atmel/sam9g20_wm8731.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/timer.h> | 36 | #include <linux/timer.h> |
37 | #include <linux/interrupt.h> | 37 | #include <linux/interrupt.h> |
38 | #include <linux/platform_device.h> | 38 | #include <linux/platform_device.h> |
39 | #include <linux/i2c.h> | ||
39 | 40 | ||
40 | #include <linux/atmel-ssc.h> | 41 | #include <linux/atmel-ssc.h> |
41 | 42 | ||
@@ -280,15 +281,41 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = { | |||
280 | .set_bias_level = at91sam9g20ek_set_bias_level, | 281 | .set_bias_level = at91sam9g20ek_set_bias_level, |
281 | }; | 282 | }; |
282 | 283 | ||
283 | static struct wm8731_setup_data at91sam9g20ek_wm8731_setup = { | 284 | /* |
284 | .i2c_bus = 0, | 285 | * FIXME: This is a temporary bodge to avoid cross-tree merge issues. |
285 | .i2c_address = 0x1b, | 286 | * New drivers should register the wm8731 I2C device in the machine |
286 | }; | 287 | * setup code (under arch/arm for ARM systems). |
288 | */ | ||
289 | static int wm8731_i2c_register(void) | ||
290 | { | ||
291 | struct i2c_board_info info; | ||
292 | struct i2c_adapter *adapter; | ||
293 | struct i2c_client *client; | ||
294 | |||
295 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
296 | info.addr = 0x1b; | ||
297 | strlcpy(info.type, "wm8731", I2C_NAME_SIZE); | ||
298 | |||
299 | adapter = i2c_get_adapter(0); | ||
300 | if (!adapter) { | ||
301 | printk(KERN_ERR "can't get i2c adapter 0\n"); | ||
302 | return -ENODEV; | ||
303 | } | ||
304 | |||
305 | client = i2c_new_device(adapter, &info); | ||
306 | i2c_put_adapter(adapter); | ||
307 | if (!client) { | ||
308 | printk(KERN_ERR "can't add i2c device at 0x%x\n", | ||
309 | (unsigned int)info.addr); | ||
310 | return -ENODEV; | ||
311 | } | ||
312 | |||
313 | return 0; | ||
314 | } | ||
287 | 315 | ||
288 | static struct snd_soc_device at91sam9g20ek_snd_devdata = { | 316 | static struct snd_soc_device at91sam9g20ek_snd_devdata = { |
289 | .card = &snd_soc_at91sam9g20ek, | 317 | .card = &snd_soc_at91sam9g20ek, |
290 | .codec_dev = &soc_codec_dev_wm8731, | 318 | .codec_dev = &soc_codec_dev_wm8731, |
291 | .codec_data = &at91sam9g20ek_wm8731_setup, | ||
292 | }; | 319 | }; |
293 | 320 | ||
294 | static struct platform_device *at91sam9g20ek_snd_device; | 321 | static struct platform_device *at91sam9g20ek_snd_device; |
@@ -340,6 +367,10 @@ static int __init at91sam9g20ek_init(void) | |||
340 | } | 367 | } |
341 | ssc_p->ssc = ssc; | 368 | ssc_p->ssc = ssc; |
342 | 369 | ||
370 | ret = wm8731_i2c_register(); | ||
371 | if (ret != 0) | ||
372 | goto err_ssc; | ||
373 | |||
343 | at91sam9g20ek_snd_device = platform_device_alloc("soc-audio", -1); | 374 | at91sam9g20ek_snd_device = platform_device_alloc("soc-audio", -1); |
344 | if (!at91sam9g20ek_snd_device) { | 375 | if (!at91sam9g20ek_snd_device) { |
345 | printk(KERN_ERR "ASoC: Platform device allocation failed\n"); | 376 | printk(KERN_ERR "ASoC: Platform device allocation failed\n"); |
@@ -359,6 +390,8 @@ static int __init at91sam9g20ek_init(void) | |||
359 | return ret; | 390 | return ret; |
360 | 391 | ||
361 | err_ssc: | 392 | err_ssc: |
393 | ssc_free(ssc); | ||
394 | ssc_p->ssc = NULL; | ||
362 | err_mclk: | 395 | err_mclk: |
363 | clk_put(mclk); | 396 | clk_put(mclk); |
364 | mclk = NULL; | 397 | mclk = NULL; |