diff options
author | Jean Delvare <khali@linux-fr.org> | 2008-09-01 13:47:01 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-09-04 04:34:25 -0400 |
commit | 81297c8a4b3a8d6ba000a3bfff0fd7ce650e72aa (patch) | |
tree | 3a32c1871a4c5100b7716a28e2b096b8a85d217b /sound | |
parent | ee1d0099c1850a61790c9bde8b0d171852c45d24 (diff) |
ALSA: ASoC: Convert wm8731 to a new-style i2c driver
Convert the wm8731 codec driver to the new (standard) device driver
binding model.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Tested-by: Manuel Lauss <mano@roarinelk.homelinux.net>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/at91/eti_b1_wm8731.c | 1 | ||||
-rw-r--r-- | sound/soc/codecs/wm8731.c | 108 | ||||
-rw-r--r-- | sound/soc/codecs/wm8731.h | 1 | ||||
-rw-r--r-- | sound/soc/pxa/corgi.c | 1 | ||||
-rw-r--r-- | sound/soc/pxa/poodle.c | 1 |
5 files changed, 57 insertions, 55 deletions
diff --git a/sound/soc/at91/eti_b1_wm8731.c b/sound/soc/at91/eti_b1_wm8731.c index b81d6b2cfa1d..684781e4088b 100644 --- a/sound/soc/at91/eti_b1_wm8731.c +++ b/sound/soc/at91/eti_b1_wm8731.c | |||
@@ -243,6 +243,7 @@ static struct snd_soc_machine snd_soc_machine_eti_b1 = { | |||
243 | }; | 243 | }; |
244 | 244 | ||
245 | static struct wm8731_setup_data eti_b1_wm8731_setup = { | 245 | static struct wm8731_setup_data eti_b1_wm8731_setup = { |
246 | .i2c_bus = 0, | ||
246 | .i2c_address = 0x1a, | 247 | .i2c_address = 0x1a, |
247 | }; | 248 | }; |
248 | 249 | ||
diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index 9402fcaf04fa..5814f9bdf0c0 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c | |||
@@ -570,86 +570,86 @@ static struct snd_soc_device *wm8731_socdev; | |||
570 | * low = 0x1a | 570 | * low = 0x1a |
571 | * high = 0x1b | 571 | * high = 0x1b |
572 | */ | 572 | */ |
573 | static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END }; | ||
574 | 573 | ||
575 | /* Magic definition of all other variables and things */ | 574 | static int wm8731_i2c_probe(struct i2c_client *i2c, |
576 | I2C_CLIENT_INSMOD; | 575 | const struct i2c_device_id *id) |
577 | |||
578 | static struct i2c_driver wm8731_i2c_driver; | ||
579 | static struct i2c_client client_template; | ||
580 | |||
581 | /* If the i2c layer weren't so broken, we could pass this kind of data | ||
582 | around */ | ||
583 | |||
584 | static int wm8731_codec_probe(struct i2c_adapter *adap, int addr, int kind) | ||
585 | { | 576 | { |
586 | struct snd_soc_device *socdev = wm8731_socdev; | 577 | struct snd_soc_device *socdev = wm8731_socdev; |
587 | struct wm8731_setup_data *setup = socdev->codec_data; | ||
588 | struct snd_soc_codec *codec = socdev->codec; | 578 | struct snd_soc_codec *codec = socdev->codec; |
589 | struct i2c_client *i2c; | ||
590 | int ret; | 579 | int ret; |
591 | 580 | ||
592 | if (addr != setup->i2c_address) | ||
593 | return -ENODEV; | ||
594 | |||
595 | client_template.adapter = adap; | ||
596 | client_template.addr = addr; | ||
597 | |||
598 | i2c = kmemdup(&client_template, sizeof(client_template), GFP_KERNEL); | ||
599 | if (i2c == NULL) | ||
600 | return -ENOMEM; | ||
601 | |||
602 | i2c_set_clientdata(i2c, codec); | 581 | i2c_set_clientdata(i2c, codec); |
603 | codec->control_data = i2c; | 582 | codec->control_data = i2c; |
604 | 583 | ||
605 | ret = i2c_attach_client(i2c); | ||
606 | if (ret < 0) { | ||
607 | pr_err("failed to attach codec at addr %x\n", addr); | ||
608 | goto err; | ||
609 | } | ||
610 | |||
611 | ret = wm8731_init(socdev); | 584 | ret = wm8731_init(socdev); |
612 | if (ret < 0) { | 585 | if (ret < 0) |
613 | pr_err("failed to initialise WM8731\n"); | 586 | pr_err("failed to initialise WM8731\n"); |
614 | goto err; | ||
615 | } | ||
616 | return ret; | ||
617 | 587 | ||
618 | err: | ||
619 | kfree(i2c); | ||
620 | return ret; | 588 | return ret; |
621 | } | 589 | } |
622 | 590 | ||
623 | static int wm8731_i2c_detach(struct i2c_client *client) | 591 | static int wm8731_i2c_remove(struct i2c_client *client) |
624 | { | 592 | { |
625 | struct snd_soc_codec *codec = i2c_get_clientdata(client); | 593 | struct snd_soc_codec *codec = i2c_get_clientdata(client); |
626 | i2c_detach_client(client); | ||
627 | kfree(codec->reg_cache); | 594 | kfree(codec->reg_cache); |
628 | kfree(client); | ||
629 | return 0; | 595 | return 0; |
630 | } | 596 | } |
631 | 597 | ||
632 | static int wm8731_i2c_attach(struct i2c_adapter *adap) | 598 | static const struct i2c_device_id wm8731_i2c_id[] = { |
633 | { | 599 | { "wm8731", 0 }, |
634 | return i2c_probe(adap, &addr_data, wm8731_codec_probe); | 600 | { } |
635 | } | 601 | }; |
602 | MODULE_DEVICE_TABLE(i2c, wm8731_i2c_id); | ||
636 | 603 | ||
637 | /* corgi i2c codec control layer */ | ||
638 | static struct i2c_driver wm8731_i2c_driver = { | 604 | static struct i2c_driver wm8731_i2c_driver = { |
639 | .driver = { | 605 | .driver = { |
640 | .name = "WM8731 I2C Codec", | 606 | .name = "WM8731 I2C Codec", |
641 | .owner = THIS_MODULE, | 607 | .owner = THIS_MODULE, |
642 | }, | 608 | }, |
643 | .id = I2C_DRIVERID_WM8731, | 609 | .probe = wm8731_i2c_probe, |
644 | .attach_adapter = wm8731_i2c_attach, | 610 | .remove = wm8731_i2c_remove, |
645 | .detach_client = wm8731_i2c_detach, | 611 | .id_table = wm8731_i2c_id, |
646 | .command = NULL, | ||
647 | }; | 612 | }; |
648 | 613 | ||
649 | static struct i2c_client client_template = { | 614 | static int wm8731_add_i2c_device(struct platform_device *pdev, |
650 | .name = "WM8731", | 615 | const struct wm8731_setup_data *setup) |
651 | .driver = &wm8731_i2c_driver, | 616 | { |
652 | }; | 617 | struct i2c_board_info info; |
618 | struct i2c_adapter *adapter; | ||
619 | struct i2c_client *client; | ||
620 | int ret; | ||
621 | |||
622 | ret = i2c_add_driver(&wm8731_i2c_driver); | ||
623 | if (ret != 0) { | ||
624 | dev_err(&pdev->dev, "can't add i2c driver\n"); | ||
625 | return ret; | ||
626 | } | ||
627 | |||
628 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
629 | info.addr = setup->i2c_address; | ||
630 | strlcpy(info.type, "wm8731", I2C_NAME_SIZE); | ||
631 | |||
632 | adapter = i2c_get_adapter(setup->i2c_bus); | ||
633 | if (!adapter) { | ||
634 | dev_err(&pdev->dev, "can't get i2c adapter %d\n", | ||
635 | setup->i2c_bus); | ||
636 | goto err_driver; | ||
637 | } | ||
638 | |||
639 | client = i2c_new_device(adapter, &info); | ||
640 | i2c_put_adapter(adapter); | ||
641 | if (!client) { | ||
642 | dev_err(&pdev->dev, "can't add i2c device at 0x%x\n", | ||
643 | (unsigned int)info.addr); | ||
644 | goto err_driver; | ||
645 | } | ||
646 | |||
647 | return 0; | ||
648 | |||
649 | err_driver: | ||
650 | i2c_del_driver(&wm8731_i2c_driver); | ||
651 | return -ENODEV; | ||
652 | } | ||
653 | #endif | 653 | #endif |
654 | 654 | ||
655 | static int wm8731_probe(struct platform_device *pdev) | 655 | static int wm8731_probe(struct platform_device *pdev) |
@@ -682,11 +682,8 @@ static int wm8731_probe(struct platform_device *pdev) | |||
682 | wm8731_socdev = socdev; | 682 | wm8731_socdev = socdev; |
683 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) | 683 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) |
684 | if (setup->i2c_address) { | 684 | if (setup->i2c_address) { |
685 | normal_i2c[0] = setup->i2c_address; | ||
686 | codec->hw_write = (hw_write_t)i2c_master_send; | 685 | codec->hw_write = (hw_write_t)i2c_master_send; |
687 | ret = i2c_add_driver(&wm8731_i2c_driver); | 686 | ret = wm8731_add_i2c_device(pdev, setup); |
688 | if (ret != 0) | ||
689 | printk(KERN_ERR "can't add i2c driver"); | ||
690 | } | 687 | } |
691 | #else | 688 | #else |
692 | /* Add other interfaces here */ | 689 | /* Add other interfaces here */ |
@@ -711,6 +708,7 @@ static int wm8731_remove(struct platform_device *pdev) | |||
711 | snd_soc_free_pcms(socdev); | 708 | snd_soc_free_pcms(socdev); |
712 | snd_soc_dapm_free(socdev); | 709 | snd_soc_dapm_free(socdev); |
713 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) | 710 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) |
711 | i2c_unregister_device(codec->control_data); | ||
714 | i2c_del_driver(&wm8731_i2c_driver); | 712 | i2c_del_driver(&wm8731_i2c_driver); |
715 | #endif | 713 | #endif |
716 | kfree(codec->private_data); | 714 | kfree(codec->private_data); |
diff --git a/sound/soc/codecs/wm8731.h b/sound/soc/codecs/wm8731.h index 99f2e3c60e33..0f8123909ab0 100644 --- a/sound/soc/codecs/wm8731.h +++ b/sound/soc/codecs/wm8731.h | |||
@@ -35,6 +35,7 @@ | |||
35 | #define WM8731_DAI 0 | 35 | #define WM8731_DAI 0 |
36 | 36 | ||
37 | struct wm8731_setup_data { | 37 | struct wm8731_setup_data { |
38 | int i2c_bus; | ||
38 | unsigned short i2c_address; | 39 | unsigned short i2c_address; |
39 | }; | 40 | }; |
40 | 41 | ||
diff --git a/sound/soc/pxa/corgi.c b/sound/soc/pxa/corgi.c index 0a53f72077fd..72b7a5140bf8 100644 --- a/sound/soc/pxa/corgi.c +++ b/sound/soc/pxa/corgi.c | |||
@@ -330,6 +330,7 @@ static struct snd_soc_machine snd_soc_machine_corgi = { | |||
330 | 330 | ||
331 | /* corgi audio private data */ | 331 | /* corgi audio private data */ |
332 | static struct wm8731_setup_data corgi_wm8731_setup = { | 332 | static struct wm8731_setup_data corgi_wm8731_setup = { |
333 | .i2c_bus = 0, | ||
333 | .i2c_address = 0x1b, | 334 | .i2c_address = 0x1b, |
334 | }; | 335 | }; |
335 | 336 | ||
diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c index a4697f7e2921..f84f7d8db09a 100644 --- a/sound/soc/pxa/poodle.c +++ b/sound/soc/pxa/poodle.c | |||
@@ -284,6 +284,7 @@ static struct snd_soc_machine snd_soc_machine_poodle = { | |||
284 | 284 | ||
285 | /* poodle audio private data */ | 285 | /* poodle audio private data */ |
286 | static struct wm8731_setup_data poodle_wm8731_setup = { | 286 | static struct wm8731_setup_data poodle_wm8731_setup = { |
287 | .i2c_bus = 0, | ||
287 | .i2c_address = 0x1b, | 288 | .i2c_address = 0x1b, |
288 | }; | 289 | }; |
289 | 290 | ||