Merge branch 'topic/asoc' into for-linus
[safe/jmp/linux-2.6] / sound / soc / codecs / ad1836.c
1 /*
2  * File:         sound/soc/codecs/ad1836.c
3  * Author:       Barry Song <Barry.Song@analog.com>
4  *
5  * Created:      Aug 04 2009
6  * Description:  Driver for AD1836 sound chip
7  *
8  * Modified:
9  *               Copyright 2009 Analog Devices Inc.
10  *
11  * Bugs:         Enter bugs at http://blackfin.uclinux.org/
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  */
18
19 #include <linux/init.h>
20 #include <linux/slab.h>
21 #include <linux/module.h>
22 #include <linux/kernel.h>
23 #include <linux/device.h>
24 #include <sound/core.h>
25 #include <sound/pcm.h>
26 #include <sound/pcm_params.h>
27 #include <sound/initval.h>
28 #include <sound/soc.h>
29 #include <sound/tlv.h>
30 #include <sound/soc-dapm.h>
31 #include <linux/spi/spi.h>
32 #include "ad1836.h"
33
34 /* codec private data */
35 struct ad1836_priv {
36         struct snd_soc_codec codec;
37         u16 reg_cache[AD1836_NUM_REGS];
38 };
39
40 static struct snd_soc_codec *ad1836_codec;
41 struct snd_soc_codec_device soc_codec_dev_ad1836;
42 static int ad1836_register(struct ad1836_priv *ad1836);
43 static void ad1836_unregister(struct ad1836_priv *ad1836);
44
45 /*
46  * AD1836 volume/mute/de-emphasis etc. controls
47  */
48 static const char *ad1836_deemp[] = {"None", "44.1kHz", "32kHz", "48kHz"};
49
50 static const struct soc_enum ad1836_deemp_enum =
51         SOC_ENUM_SINGLE(AD1836_DAC_CTRL1, 8, 4, ad1836_deemp);
52
53 static const struct snd_kcontrol_new ad1836_snd_controls[] = {
54         /* DAC volume control */
55         SOC_DOUBLE_R("DAC1 Volume", AD1836_DAC_L1_VOL,
56                         AD1836_DAC_R1_VOL, 0, 0x3FF, 0),
57         SOC_DOUBLE_R("DAC2 Volume", AD1836_DAC_L2_VOL,
58                         AD1836_DAC_R2_VOL, 0, 0x3FF, 0),
59         SOC_DOUBLE_R("DAC3 Volume", AD1836_DAC_L3_VOL,
60                         AD1836_DAC_R3_VOL, 0, 0x3FF, 0),
61
62         /* ADC switch control */
63         SOC_DOUBLE("ADC1 Switch", AD1836_ADC_CTRL2, AD1836_ADCL1_MUTE,
64                 AD1836_ADCR1_MUTE, 1, 1),
65         SOC_DOUBLE("ADC2 Switch", AD1836_ADC_CTRL2, AD1836_ADCL2_MUTE,
66                 AD1836_ADCR2_MUTE, 1, 1),
67
68         /* DAC switch control */
69         SOC_DOUBLE("DAC1 Switch", AD1836_DAC_CTRL2, AD1836_DACL1_MUTE,
70                 AD1836_DACR1_MUTE, 1, 1),
71         SOC_DOUBLE("DAC2 Switch", AD1836_DAC_CTRL2, AD1836_DACL2_MUTE,
72                 AD1836_DACR2_MUTE, 1, 1),
73         SOC_DOUBLE("DAC3 Switch", AD1836_DAC_CTRL2, AD1836_DACL3_MUTE,
74                 AD1836_DACR3_MUTE, 1, 1),
75
76         /* ADC high-pass filter */
77         SOC_SINGLE("ADC High Pass Filter Switch", AD1836_ADC_CTRL1,
78                         AD1836_ADC_HIGHPASS_FILTER, 1, 0),
79
80         /* DAC de-emphasis */
81         SOC_ENUM("Playback Deemphasis", ad1836_deemp_enum),
82 };
83
84 static const struct snd_soc_dapm_widget ad1836_dapm_widgets[] = {
85         SND_SOC_DAPM_DAC("DAC", "Playback", AD1836_DAC_CTRL1,
86                                 AD1836_DAC_POWERDOWN, 1),
87         SND_SOC_DAPM_ADC("ADC", "Capture", SND_SOC_NOPM, 0, 0),
88         SND_SOC_DAPM_SUPPLY("ADC_PWR", AD1836_ADC_CTRL1,
89                                 AD1836_ADC_POWERDOWN, 1, NULL, 0),
90         SND_SOC_DAPM_OUTPUT("DAC1OUT"),
91         SND_SOC_DAPM_OUTPUT("DAC2OUT"),
92         SND_SOC_DAPM_OUTPUT("DAC3OUT"),
93         SND_SOC_DAPM_INPUT("ADC1IN"),
94         SND_SOC_DAPM_INPUT("ADC2IN"),
95 };
96
97 static const struct snd_soc_dapm_route audio_paths[] = {
98         { "DAC", NULL, "ADC_PWR" },
99         { "ADC", NULL, "ADC_PWR" },
100         { "DAC1OUT", "DAC1 Switch", "DAC" },
101         { "DAC2OUT", "DAC2 Switch", "DAC" },
102         { "DAC3OUT", "DAC3 Switch", "DAC" },
103         { "ADC", "ADC1 Switch", "ADC1IN" },
104         { "ADC", "ADC2 Switch", "ADC2IN" },
105 };
106
107 /*
108  * DAI ops entries
109  */
110
111 static int ad1836_set_dai_fmt(struct snd_soc_dai *codec_dai,
112                 unsigned int fmt)
113 {
114         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
115         /* at present, we support adc aux mode to interface with
116          * blackfin sport tdm mode
117          */
118         case SND_SOC_DAIFMT_DSP_A:
119                 break;
120         default:
121                 return -EINVAL;
122         }
123
124         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
125         case SND_SOC_DAIFMT_IB_IF:
126                 break;
127         default:
128                 return -EINVAL;
129         }
130
131         switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
132         /* ALCLK,ABCLK are both output, AD1836 can only be master */
133         case SND_SOC_DAIFMT_CBM_CFM:
134                 break;
135         default:
136                 return -EINVAL;
137         }
138
139         return 0;
140 }
141
142 static int ad1836_hw_params(struct snd_pcm_substream *substream,
143                 struct snd_pcm_hw_params *params,
144                 struct snd_soc_dai *dai)
145 {
146         int word_len = 0;
147
148         struct snd_soc_pcm_runtime *rtd = substream->private_data;
149         struct snd_soc_device *socdev = rtd->socdev;
150         struct snd_soc_codec *codec = socdev->card->codec;
151
152         /* bit size */
153         switch (params_format(params)) {
154         case SNDRV_PCM_FORMAT_S16_LE:
155                 word_len = 3;
156                 break;
157         case SNDRV_PCM_FORMAT_S20_3LE:
158                 word_len = 1;
159                 break;
160         case SNDRV_PCM_FORMAT_S24_LE:
161         case SNDRV_PCM_FORMAT_S32_LE:
162                 word_len = 0;
163                 break;
164         }
165
166         snd_soc_update_bits(codec, AD1836_DAC_CTRL1,
167                 AD1836_DAC_WORD_LEN_MASK, word_len);
168
169         snd_soc_update_bits(codec, AD1836_ADC_CTRL2,
170                 AD1836_ADC_WORD_LEN_MASK, word_len);
171
172         return 0;
173 }
174
175 #ifdef CONFIG_PM
176 static int ad1836_soc_suspend(struct platform_device *pdev,
177                 pm_message_t state)
178 {
179         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
180         struct snd_soc_codec *codec = socdev->card->codec;
181
182         /* reset clock control mode */
183         u16 adc_ctrl2 = snd_soc_read(codec, AD1836_ADC_CTRL2);
184         adc_ctrl2 &= ~AD1836_ADC_SERFMT_MASK;
185
186         return snd_soc_write(codec, AD1836_ADC_CTRL2, adc_ctrl2);
187 }
188
189 static int ad1836_soc_resume(struct platform_device *pdev)
190 {
191         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
192         struct snd_soc_codec *codec = socdev->card->codec;
193
194         /* restore clock control mode */
195         u16 adc_ctrl2 = snd_soc_read(codec, AD1836_ADC_CTRL2);
196         adc_ctrl2 |= AD1836_ADC_AUX;
197
198         return snd_soc_write(codec, AD1836_ADC_CTRL2, adc_ctrl2);
199 }
200 #else
201 #define ad1836_soc_suspend NULL
202 #define ad1836_soc_resume  NULL
203 #endif
204
205 static int __devinit ad1836_spi_probe(struct spi_device *spi)
206 {
207         struct snd_soc_codec *codec;
208         struct ad1836_priv *ad1836;
209
210         ad1836 = kzalloc(sizeof(struct ad1836_priv), GFP_KERNEL);
211         if (ad1836 == NULL)
212                 return -ENOMEM;
213
214         codec = &ad1836->codec;
215         codec->control_data = spi;
216         codec->dev = &spi->dev;
217
218         dev_set_drvdata(&spi->dev, ad1836);
219
220         return ad1836_register(ad1836);
221 }
222
223 static int __devexit ad1836_spi_remove(struct spi_device *spi)
224 {
225         struct ad1836_priv *ad1836 = dev_get_drvdata(&spi->dev);
226
227         ad1836_unregister(ad1836);
228         return 0;
229 }
230
231 static struct spi_driver ad1836_spi_driver = {
232         .driver = {
233                 .name   = "ad1836",
234                 .owner  = THIS_MODULE,
235         },
236         .probe          = ad1836_spi_probe,
237         .remove         = __devexit_p(ad1836_spi_remove),
238 };
239
240 static struct snd_soc_dai_ops ad1836_dai_ops = {
241         .hw_params = ad1836_hw_params,
242         .set_fmt = ad1836_set_dai_fmt,
243 };
244
245 /* codec DAI instance */
246 struct snd_soc_dai ad1836_dai = {
247         .name = "AD1836",
248         .playback = {
249                 .stream_name = "Playback",
250                 .channels_min = 2,
251                 .channels_max = 6,
252                 .rates = SNDRV_PCM_RATE_48000,
253                 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
254                         SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
255         },
256         .capture = {
257                 .stream_name = "Capture",
258                 .channels_min = 2,
259                 .channels_max = 4,
260                 .rates = SNDRV_PCM_RATE_48000,
261                 .formats = SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S16_LE |
262                         SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE,
263         },
264         .ops = &ad1836_dai_ops,
265 };
266 EXPORT_SYMBOL_GPL(ad1836_dai);
267
268 static int ad1836_register(struct ad1836_priv *ad1836)
269 {
270         int ret;
271         struct snd_soc_codec *codec = &ad1836->codec;
272
273         if (ad1836_codec) {
274                 dev_err(codec->dev, "Another ad1836 is registered\n");
275                 return -EINVAL;
276         }
277
278         mutex_init(&codec->mutex);
279         INIT_LIST_HEAD(&codec->dapm_widgets);
280         INIT_LIST_HEAD(&codec->dapm_paths);
281         snd_soc_codec_set_drvdata(codec, ad1836);
282         codec->reg_cache = ad1836->reg_cache;
283         codec->reg_cache_size = AD1836_NUM_REGS;
284         codec->name = "AD1836";
285         codec->owner = THIS_MODULE;
286         codec->dai = &ad1836_dai;
287         codec->num_dai = 1;
288         INIT_LIST_HEAD(&codec->dapm_widgets);
289         INIT_LIST_HEAD(&codec->dapm_paths);
290
291         ad1836_dai.dev = codec->dev;
292         ad1836_codec = codec;
293
294         ret = snd_soc_codec_set_cache_io(codec, 4, 12, SND_SOC_SPI);
295         if (ret < 0) {
296                 dev_err(codec->dev, "failed to set cache I/O: %d\n",
297                                 ret);
298                 kfree(ad1836);
299                 return ret;
300         }
301
302         /* default setting for ad1836 */
303         /* de-emphasis: 48kHz, power-on dac */
304         snd_soc_write(codec, AD1836_DAC_CTRL1, 0x300);
305         /* unmute dac channels */
306         snd_soc_write(codec, AD1836_DAC_CTRL2, 0x0);
307         /* high-pass filter enable, power-on adc */
308         snd_soc_write(codec, AD1836_ADC_CTRL1, 0x100);
309         /* unmute adc channles, adc aux mode */
310         snd_soc_write(codec, AD1836_ADC_CTRL2, 0x180);
311         /* left/right diff:PGA/MUX */
312         snd_soc_write(codec, AD1836_ADC_CTRL3, 0x3A);
313         /* volume */
314         snd_soc_write(codec, AD1836_DAC_L1_VOL, 0x3FF);
315         snd_soc_write(codec, AD1836_DAC_R1_VOL, 0x3FF);
316         snd_soc_write(codec, AD1836_DAC_L2_VOL, 0x3FF);
317         snd_soc_write(codec, AD1836_DAC_R2_VOL, 0x3FF);
318         snd_soc_write(codec, AD1836_DAC_L3_VOL, 0x3FF);
319         snd_soc_write(codec, AD1836_DAC_R3_VOL, 0x3FF);
320
321         ret = snd_soc_register_codec(codec);
322         if (ret != 0) {
323                 dev_err(codec->dev, "Failed to register codec: %d\n", ret);
324                 kfree(ad1836);
325                 return ret;
326         }
327
328         ret = snd_soc_register_dai(&ad1836_dai);
329         if (ret != 0) {
330                 dev_err(codec->dev, "Failed to register DAI: %d\n", ret);
331                 snd_soc_unregister_codec(codec);
332                 kfree(ad1836);
333                 return ret;
334         }
335
336         return 0;
337 }
338
339 static void ad1836_unregister(struct ad1836_priv *ad1836)
340 {
341         snd_soc_unregister_dai(&ad1836_dai);
342         snd_soc_unregister_codec(&ad1836->codec);
343         kfree(ad1836);
344         ad1836_codec = NULL;
345 }
346
347 static int ad1836_probe(struct platform_device *pdev)
348 {
349         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
350         struct snd_soc_codec *codec;
351         int ret = 0;
352
353         if (ad1836_codec == NULL) {
354                 dev_err(&pdev->dev, "Codec device not registered\n");
355                 return -ENODEV;
356         }
357
358         socdev->card->codec = ad1836_codec;
359         codec = ad1836_codec;
360
361         /* register pcms */
362         ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
363         if (ret < 0) {
364                 dev_err(codec->dev, "failed to create pcms: %d\n", ret);
365                 goto pcm_err;
366         }
367
368         snd_soc_add_controls(codec, ad1836_snd_controls,
369                              ARRAY_SIZE(ad1836_snd_controls));
370         snd_soc_dapm_new_controls(codec, ad1836_dapm_widgets,
371                                   ARRAY_SIZE(ad1836_dapm_widgets));
372         snd_soc_dapm_add_routes(codec, audio_paths, ARRAY_SIZE(audio_paths));
373
374 pcm_err:
375         return ret;
376 }
377
378 /* power down chip */
379 static int ad1836_remove(struct platform_device *pdev)
380 {
381         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
382
383         snd_soc_free_pcms(socdev);
384         snd_soc_dapm_free(socdev);
385
386         return 0;
387 }
388
389 struct snd_soc_codec_device soc_codec_dev_ad1836 = {
390         .probe =        ad1836_probe,
391         .remove =       ad1836_remove,
392         .suspend =      ad1836_soc_suspend,
393         .resume =       ad1836_soc_resume,
394 };
395 EXPORT_SYMBOL_GPL(soc_codec_dev_ad1836);
396
397 static int __init ad1836_init(void)
398 {
399         int ret;
400
401         ret = spi_register_driver(&ad1836_spi_driver);
402         if (ret != 0) {
403                 printk(KERN_ERR "Failed to register ad1836 SPI driver: %d\n",
404                                 ret);
405         }
406
407         return ret;
408 }
409 module_init(ad1836_init);
410
411 static void __exit ad1836_exit(void)
412 {
413         spi_unregister_driver(&ad1836_spi_driver);
414 }
415 module_exit(ad1836_exit);
416
417 MODULE_DESCRIPTION("ASoC ad1836 driver");
418 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
419 MODULE_LICENSE("GPL");