diff options
Diffstat (limited to 'sound/soc/codecs/cq93vc.c')
-rw-r--r-- | sound/soc/codecs/cq93vc.c | 132 |
1 files changed, 29 insertions, 103 deletions
diff --git a/sound/soc/codecs/cq93vc.c b/sound/soc/codecs/cq93vc.c index a320fb5a0e26..823643932dde 100644 --- a/sound/soc/codecs/cq93vc.c +++ b/sound/soc/codecs/cq93vc.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/clk.h> | 31 | #include <linux/clk.h> |
32 | #include <linux/mfd/davinci_voicecodec.h> | 32 | #include <linux/mfd/davinci_voicecodec.h> |
33 | #include <linux/spi/spi.h> | ||
33 | 34 | ||
34 | #include <sound/core.h> | 35 | #include <sound/core.h> |
35 | #include <sound/pcm.h> | 36 | #include <sound/pcm.h> |
@@ -41,8 +42,6 @@ | |||
41 | 42 | ||
42 | #include <mach/dm365.h> | 43 | #include <mach/dm365.h> |
43 | 44 | ||
44 | #include "cq93vc.h" | ||
45 | |||
46 | static inline unsigned int cq93vc_read(struct snd_soc_codec *codec, | 45 | static inline unsigned int cq93vc_read(struct snd_soc_codec *codec, |
47 | unsigned int reg) | 46 | unsigned int reg) |
48 | { | 47 | { |
@@ -130,8 +129,8 @@ static struct snd_soc_dai_ops cq93vc_dai_ops = { | |||
130 | .set_sysclk = cq93vc_set_dai_sysclk, | 129 | .set_sysclk = cq93vc_set_dai_sysclk, |
131 | }; | 130 | }; |
132 | 131 | ||
133 | struct snd_soc_dai cq93vc_dai = { | 132 | static struct snd_soc_dai_driver cq93vc_dai = { |
134 | .name = "CQ93VC", | 133 | .name = "cq93vc-hifi", |
135 | .playback = { | 134 | .playback = { |
136 | .stream_name = "Playback", | 135 | .stream_name = "Playback", |
137 | .channels_min = 1, | 136 | .channels_min = 1, |
@@ -146,36 +145,20 @@ struct snd_soc_dai cq93vc_dai = { | |||
146 | .formats = CQ93VC_FORMATS,}, | 145 | .formats = CQ93VC_FORMATS,}, |
147 | .ops = &cq93vc_dai_ops, | 146 | .ops = &cq93vc_dai_ops, |
148 | }; | 147 | }; |
149 | EXPORT_SYMBOL_GPL(cq93vc_dai); | ||
150 | 148 | ||
151 | static int cq93vc_resume(struct platform_device *pdev) | 149 | static int cq93vc_resume(struct snd_soc_codec *codec) |
152 | { | 150 | { |
153 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | ||
154 | struct snd_soc_codec *codec = socdev->card->codec; | ||
155 | |||
156 | cq93vc_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 151 | cq93vc_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
157 | 152 | ||
158 | return 0; | 153 | return 0; |
159 | } | 154 | } |
160 | 155 | ||
161 | static struct snd_soc_codec *cq93vc_codec; | 156 | static int cq93vc_probe(struct snd_soc_codec *codec) |
162 | |||
163 | static int cq93vc_probe(struct platform_device *pdev) | ||
164 | { | 157 | { |
165 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | 158 | struct davinci_vc *davinci_vc = codec->dev->platform_data; |
166 | struct device *dev = &pdev->dev; | 159 | |
167 | struct snd_soc_codec *codec; | 160 | davinci_vc->cq93vc.codec = codec; |
168 | int ret; | 161 | codec->control_data = davinci_vc; |
169 | |||
170 | socdev->card->codec = cq93vc_codec; | ||
171 | codec = socdev->card->codec; | ||
172 | |||
173 | /* Register pcms */ | ||
174 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); | ||
175 | if (ret < 0) { | ||
176 | dev_err(dev, "%s: failed to create pcms\n", pdev->name); | ||
177 | return ret; | ||
178 | } | ||
179 | 162 | ||
180 | /* Set controls */ | 163 | /* Set controls */ |
181 | snd_soc_add_controls(codec, cq93vc_snd_controls, | 164 | snd_soc_add_controls(codec, cq93vc_snd_controls, |
@@ -187,108 +170,51 @@ static int cq93vc_probe(struct platform_device *pdev) | |||
187 | return 0; | 170 | return 0; |
188 | } | 171 | } |
189 | 172 | ||
190 | static int cq93vc_remove(struct platform_device *pdev) | 173 | static int cq93vc_remove(struct snd_soc_codec *codec) |
191 | { | 174 | { |
192 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | 175 | cq93vc_set_bias_level(codec, SND_SOC_BIAS_OFF); |
193 | |||
194 | snd_soc_free_pcms(socdev); | ||
195 | snd_soc_dapm_free(socdev); | ||
196 | 176 | ||
197 | return 0; | 177 | return 0; |
198 | } | 178 | } |
199 | 179 | ||
200 | struct snd_soc_codec_device soc_codec_dev_cq93vc = { | 180 | static struct snd_soc_codec_driver soc_codec_dev_cq93vc = { |
181 | .read = cq93vc_read, | ||
182 | .write = cq93vc_write, | ||
183 | .set_bias_level = cq93vc_set_bias_level, | ||
201 | .probe = cq93vc_probe, | 184 | .probe = cq93vc_probe, |
202 | .remove = cq93vc_remove, | 185 | .remove = cq93vc_remove, |
203 | .resume = cq93vc_resume, | 186 | .resume = cq93vc_resume, |
204 | }; | 187 | }; |
205 | EXPORT_SYMBOL_GPL(soc_codec_dev_cq93vc); | ||
206 | 188 | ||
207 | static __init int cq93vc_codec_probe(struct platform_device *pdev) | 189 | static int cq93vc_platform_probe(struct platform_device *pdev) |
208 | { | 190 | { |
209 | struct davinci_vc *davinci_vc = platform_get_drvdata(pdev); | 191 | return snd_soc_register_codec(&pdev->dev, |
210 | struct snd_soc_codec *codec; | 192 | &soc_codec_dev_cq93vc, &cq93vc_dai, 1); |
211 | int ret; | ||
212 | |||
213 | codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL); | ||
214 | if (codec == NULL) { | ||
215 | dev_dbg(davinci_vc->dev, | ||
216 | "could not allocate memory for codec data\n"); | ||
217 | return -ENOMEM; | ||
218 | } | ||
219 | |||
220 | davinci_vc->cq93vc.codec = codec; | ||
221 | |||
222 | cq93vc_dai.dev = &pdev->dev; | ||
223 | |||
224 | mutex_init(&codec->mutex); | ||
225 | INIT_LIST_HEAD(&codec->dapm_widgets); | ||
226 | INIT_LIST_HEAD(&codec->dapm_paths); | ||
227 | codec->dev = &pdev->dev; | ||
228 | codec->name = "CQ93VC"; | ||
229 | codec->owner = THIS_MODULE; | ||
230 | codec->read = cq93vc_read; | ||
231 | codec->write = cq93vc_write; | ||
232 | codec->set_bias_level = cq93vc_set_bias_level; | ||
233 | codec->dai = &cq93vc_dai; | ||
234 | codec->num_dai = 1; | ||
235 | codec->control_data = davinci_vc; | ||
236 | |||
237 | cq93vc_codec = codec; | ||
238 | |||
239 | ret = snd_soc_register_codec(codec); | ||
240 | if (ret) { | ||
241 | dev_err(davinci_vc->dev, "failed to register codec\n"); | ||
242 | goto fail1; | ||
243 | } | ||
244 | |||
245 | ret = snd_soc_register_dai(&cq93vc_dai); | ||
246 | if (ret) { | ||
247 | dev_err(davinci_vc->dev, "could register dai\n"); | ||
248 | goto fail2; | ||
249 | } | ||
250 | return 0; | ||
251 | |||
252 | fail2: | ||
253 | snd_soc_unregister_codec(codec); | ||
254 | |||
255 | fail1: | ||
256 | kfree(codec); | ||
257 | cq93vc_codec = NULL; | ||
258 | |||
259 | return ret; | ||
260 | } | 193 | } |
261 | 194 | ||
262 | static int __devexit cq93vc_codec_remove(struct platform_device *pdev) | 195 | static int cq93vc_platform_remove(struct platform_device *pdev) |
263 | { | 196 | { |
264 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | 197 | snd_soc_unregister_codec(&pdev->dev); |
265 | struct snd_soc_codec *codec = socdev->card->codec; | ||
266 | |||
267 | snd_soc_unregister_dai(&cq93vc_dai); | ||
268 | snd_soc_unregister_codec(&codec); | ||
269 | |||
270 | kfree(codec); | ||
271 | cq93vc_codec = NULL; | ||
272 | |||
273 | return 0; | 198 | return 0; |
274 | } | 199 | } |
275 | 200 | ||
276 | static struct platform_driver cq93vc_codec_driver = { | 201 | static struct platform_driver cq93vc_codec_driver = { |
277 | .driver = { | 202 | .driver = { |
278 | .name = "cq93vc", | 203 | .name = "cq93vc-codec", |
279 | .owner = THIS_MODULE, | 204 | .owner = THIS_MODULE, |
280 | }, | 205 | }, |
281 | .probe = cq93vc_codec_probe, | 206 | |
282 | .remove = __devexit_p(cq93vc_codec_remove), | 207 | .probe = cq93vc_platform_probe, |
208 | .remove = __devexit_p(cq93vc_platform_remove), | ||
283 | }; | 209 | }; |
284 | 210 | ||
285 | static __init int cq93vc_init(void) | 211 | static int __init cq93vc_init(void) |
286 | { | 212 | { |
287 | return platform_driver_probe(&cq93vc_codec_driver, cq93vc_codec_probe); | 213 | return platform_driver_register(&cq93vc_codec_driver); |
288 | } | 214 | } |
289 | module_init(cq93vc_init); | 215 | module_init(cq93vc_init); |
290 | 216 | ||
291 | static __exit void cq93vc_exit(void) | 217 | static void __exit cq93vc_exit(void) |
292 | { | 218 | { |
293 | platform_driver_unregister(&cq93vc_codec_driver); | 219 | platform_driver_unregister(&cq93vc_codec_driver); |
294 | } | 220 | } |