diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-12-08 16:50:01 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-12-16 12:30:51 -0500 |
commit | cce2e9db718d823f33ac846c019763cdc84e8658 (patch) | |
tree | e1f82678787bb16ace87a68211e1b13db75553c1 /sound/soc/codecs/wm8727.c | |
parent | d207c68dd92455a3d618c37b5a9f0dc598723fd6 (diff) |
ASoC: Register the CODEC in WM8727
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound/soc/codecs/wm8727.c')
-rw-r--r-- | sound/soc/codecs/wm8727.c | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/sound/soc/codecs/wm8727.c b/sound/soc/codecs/wm8727.c index d8ffbd641d71..63a254e293ca 100644 --- a/sound/soc/codecs/wm8727.c +++ b/sound/soc/codecs/wm8727.c | |||
@@ -44,23 +44,16 @@ struct snd_soc_dai wm8727_dai = { | |||
44 | }; | 44 | }; |
45 | EXPORT_SYMBOL_GPL(wm8727_dai); | 45 | EXPORT_SYMBOL_GPL(wm8727_dai); |
46 | 46 | ||
47 | static struct snd_soc_codec *wm8727_codec; | ||
48 | |||
47 | static int wm8727_soc_probe(struct platform_device *pdev) | 49 | static int wm8727_soc_probe(struct platform_device *pdev) |
48 | { | 50 | { |
49 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | 51 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); |
50 | struct snd_soc_codec *codec; | ||
51 | int ret = 0; | 52 | int ret = 0; |
52 | 53 | ||
53 | codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); | 54 | BUG_ON(!wm8727_codec); |
54 | if (codec == NULL) | 55 | |
55 | return -ENOMEM; | 56 | socdev->card->codec = wm8727_codec; |
56 | mutex_init(&codec->mutex); | ||
57 | codec->name = "WM8727"; | ||
58 | codec->owner = THIS_MODULE; | ||
59 | codec->dai = &wm8727_dai; | ||
60 | codec->num_dai = 1; | ||
61 | socdev->card->codec = codec; | ||
62 | INIT_LIST_HEAD(&codec->dapm_widgets); | ||
63 | INIT_LIST_HEAD(&codec->dapm_paths); | ||
64 | 57 | ||
65 | /* register pcms */ | 58 | /* register pcms */ |
66 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); | 59 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); |
@@ -80,12 +73,9 @@ pcm_err: | |||
80 | static int wm8727_soc_remove(struct platform_device *pdev) | 73 | static int wm8727_soc_remove(struct platform_device *pdev) |
81 | { | 74 | { |
82 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | 75 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); |
83 | struct snd_soc_codec *codec = socdev->card->codec; | ||
84 | 76 | ||
85 | if (codec == NULL) | ||
86 | return 0; | ||
87 | snd_soc_free_pcms(socdev); | 77 | snd_soc_free_pcms(socdev); |
88 | kfree(codec); | 78 | |
89 | return 0; | 79 | return 0; |
90 | } | 80 | } |
91 | 81 | ||
@@ -98,13 +88,55 @@ EXPORT_SYMBOL_GPL(soc_codec_dev_wm8727); | |||
98 | 88 | ||
99 | static __devinit int wm8727_platform_probe(struct platform_device *pdev) | 89 | static __devinit int wm8727_platform_probe(struct platform_device *pdev) |
100 | { | 90 | { |
91 | struct snd_soc_codec *codec; | ||
92 | int ret; | ||
93 | |||
94 | if (wm8727_codec) { | ||
95 | dev_err(&pdev->dev, "Another WM8727 is registered\n"); | ||
96 | return -EBUSY; | ||
97 | } | ||
98 | |||
99 | codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); | ||
100 | if (codec == NULL) | ||
101 | return -ENOMEM; | ||
102 | wm8727_codec = codec; | ||
103 | |||
104 | platform_set_drvdata(pdev, codec); | ||
105 | |||
106 | mutex_init(&codec->mutex); | ||
107 | codec->dev = &pdev->dev; | ||
108 | codec->name = "WM8727"; | ||
109 | codec->owner = THIS_MODULE; | ||
110 | codec->dai = &wm8727_dai; | ||
111 | codec->num_dai = 1; | ||
112 | INIT_LIST_HEAD(&codec->dapm_widgets); | ||
113 | INIT_LIST_HEAD(&codec->dapm_paths); | ||
114 | |||
101 | wm8727_dai.dev = &pdev->dev; | 115 | wm8727_dai.dev = &pdev->dev; |
102 | return snd_soc_register_dai(&wm8727_dai); | 116 | |
117 | ret = snd_soc_register_codec(codec); | ||
118 | if (ret != 0) { | ||
119 | dev_err(&pdev->dev, "Failed to register CODEC: %d\n", ret); | ||
120 | goto err; | ||
121 | } | ||
122 | |||
123 | ret = snd_soc_register_dai(&wm8727_dai); | ||
124 | if (ret != 0) { | ||
125 | dev_err(&pdev->dev, "Failed to register DAI: %d\n", ret); | ||
126 | goto err_codec; | ||
127 | } | ||
128 | |||
129 | err_codec: | ||
130 | snd_soc_unregister_codec(codec); | ||
131 | err: | ||
132 | kfree(codec); | ||
133 | return ret; | ||
103 | } | 134 | } |
104 | 135 | ||
105 | static int __devexit wm8727_platform_remove(struct platform_device *pdev) | 136 | static int __devexit wm8727_platform_remove(struct platform_device *pdev) |
106 | { | 137 | { |
107 | snd_soc_unregister_dai(&wm8727_dai); | 138 | snd_soc_unregister_dai(&wm8727_dai); |
139 | snd_soc_unregister_codec(platform_get_drvdata(pdev)); | ||
108 | return 0; | 140 | return 0; |
109 | } | 141 | } |
110 | 142 | ||