[ALSA] ASoC AC97 device reg bugfix
[linux-2.6] / sound / soc / soc-core.c
1 /*
2  * soc-core.c  --  ALSA SoC Audio Layer
3  *
4  * Copyright 2005 Wolfson Microelectronics PLC.
5  * Copyright 2005 Openedhand Ltd.
6  *
7  * Author: Liam Girdwood
8  *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
9  *         with code, comments and ideas from :-
10  *         Richard Purdie <richard@openedhand.com>
11  *
12  *  This program is free software; you can redistribute  it and/or modify it
13  *  under  the terms of  the GNU General  Public License as published by the
14  *  Free Software Foundation;  either version 2 of the  License, or (at your
15  *  option) any later version.
16  *
17  *  Revision history
18  *    12th Aug 2005   Initial version.
19  *    25th Oct 2005   Working Codec, Interface and Platform registration.
20  *
21  *  TODO:
22  *   o Add hw rules to enforce rates, etc.
23  *   o More testing with other codecs/machines.
24  *   o Add more codecs and platforms to ensure good API coverage.
25  *   o Support TDM on PCM and I2S
26  */
27
28 #include <linux/module.h>
29 #include <linux/moduleparam.h>
30 #include <linux/init.h>
31 #include <linux/delay.h>
32 #include <linux/pm.h>
33 #include <linux/bitops.h>
34 #include <linux/platform_device.h>
35 #include <sound/driver.h>
36 #include <sound/core.h>
37 #include <sound/pcm.h>
38 #include <sound/pcm_params.h>
39 #include <sound/soc.h>
40 #include <sound/soc-dapm.h>
41 #include <sound/initval.h>
42
43 /* debug */
44 #define SOC_DEBUG 0
45 #if SOC_DEBUG
46 #define dbg(format, arg...) printk(format, ## arg)
47 #else
48 #define dbg(format, arg...)
49 #endif
50
51 static DEFINE_MUTEX(pcm_mutex);
52 static DEFINE_MUTEX(io_mutex);
53 static DECLARE_WAIT_QUEUE_HEAD(soc_pm_waitq);
54
55 /*
56  * This is a timeout to do a DAPM powerdown after a stream is closed().
57  * It can be used to eliminate pops between different playback streams, e.g.
58  * between two audio tracks.
59  */
60 static int pmdown_time = 5000;
61 module_param(pmdown_time, int, 0);
62 MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)");
63
64 /*
65  * This function forces any delayed work to be queued and run.
66  */
67 static int run_delayed_work(struct delayed_work *dwork)
68 {
69         int ret;
70
71         /* cancel any work waiting to be queued. */
72         ret = cancel_delayed_work(dwork);
73
74         /* if there was any work waiting then we run it now and
75          * wait for it's completion */
76         if (ret) {
77                 schedule_delayed_work(dwork, 0);
78                 flush_scheduled_work();
79         }
80         return ret;
81 }
82
83 #ifdef CONFIG_SND_SOC_AC97_BUS
84 /* unregister ac97 codec */
85 static int soc_ac97_dev_unregister(struct snd_soc_codec *codec)
86 {
87         if (codec->ac97->dev.bus)
88                 device_unregister(&codec->ac97->dev);
89         return 0;
90 }
91
92 /* stop no dev release warning */
93 static void soc_ac97_device_release(struct device *dev){}
94
95 /* register ac97 codec to bus */
96 static int soc_ac97_dev_register(struct snd_soc_codec *codec)
97 {
98         int err;
99
100         codec->ac97->dev.bus = &ac97_bus_type;
101         codec->ac97->dev.parent = NULL;
102         codec->ac97->dev.release = soc_ac97_device_release;
103
104         snprintf(codec->ac97->dev.bus_id, BUS_ID_SIZE, "%d-%d:%s",
105                  codec->card->number, 0, codec->name);
106         err = device_register(&codec->ac97->dev);
107         if (err < 0) {
108                 snd_printk(KERN_ERR "Can't register ac97 bus\n");
109                 codec->ac97->dev.bus = NULL;
110                 return err;
111         }
112         return 0;
113 }
114 #endif
115
116 static inline const char* get_dai_name(int type)
117 {
118         switch(type) {
119         case SND_SOC_DAI_AC97_BUS:
120         case SND_SOC_DAI_AC97:
121                 return "AC97";
122         case SND_SOC_DAI_I2S:
123                 return "I2S";
124         case SND_SOC_DAI_PCM:
125                 return "PCM";
126         }
127         return NULL;
128 }
129
130 /*
131  * Called by ALSA when a PCM substream is opened, the runtime->hw record is
132  * then initialized and any private data can be allocated. This also calls
133  * startup for the cpu DAI, platform, machine and codec DAI.
134  */
135 static int soc_pcm_open(struct snd_pcm_substream *substream)
136 {
137         struct snd_soc_pcm_runtime *rtd = substream->private_data;
138         struct snd_soc_device *socdev = rtd->socdev;
139         struct snd_pcm_runtime *runtime = substream->runtime;
140         struct snd_soc_dai_link *machine = rtd->dai;
141         struct snd_soc_platform *platform = socdev->platform;
142         struct snd_soc_cpu_dai *cpu_dai = machine->cpu_dai;
143         struct snd_soc_codec_dai *codec_dai = machine->codec_dai;
144         int ret = 0;
145
146         mutex_lock(&pcm_mutex);
147
148         /* startup the audio subsystem */
149         if (cpu_dai->ops.startup) {
150                 ret = cpu_dai->ops.startup(substream);
151                 if (ret < 0) {
152                         printk(KERN_ERR "asoc: can't open interface %s\n",
153                                 cpu_dai->name);
154                         goto out;
155                 }
156         }
157
158         if (platform->pcm_ops->open) {
159                 ret = platform->pcm_ops->open(substream);
160                 if (ret < 0) {
161                         printk(KERN_ERR "asoc: can't open platform %s\n", platform->name);
162                         goto platform_err;
163                 }
164         }
165
166         if (codec_dai->ops.startup) {
167                 ret = codec_dai->ops.startup(substream);
168                 if (ret < 0) {
169                         printk(KERN_ERR "asoc: can't open codec %s\n",
170                                 codec_dai->name);
171                         goto codec_dai_err;
172                 }
173         }
174
175         if (machine->ops && machine->ops->startup) {
176                 ret = machine->ops->startup(substream);
177                 if (ret < 0) {
178                         printk(KERN_ERR "asoc: %s startup failed\n", machine->name);
179                         goto machine_err;
180                 }
181         }
182
183         /* Check that the codec and cpu DAI's are compatible */
184         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
185                 runtime->hw.rate_min =
186                         max(codec_dai->playback.rate_min, cpu_dai->playback.rate_min);
187                 runtime->hw.rate_max =
188                         min(codec_dai->playback.rate_max, cpu_dai->playback.rate_max);
189                 runtime->hw.channels_min =
190                         max(codec_dai->playback.channels_min,
191                                 cpu_dai->playback.channels_min);
192                 runtime->hw.channels_max =
193                         min(codec_dai->playback.channels_max,
194                                 cpu_dai->playback.channels_max);
195                 runtime->hw.formats =
196                         codec_dai->playback.formats & cpu_dai->playback.formats;
197                 runtime->hw.rates =
198                         codec_dai->playback.rates & cpu_dai->playback.rates;
199         } else {
200                 runtime->hw.rate_min =
201                         max(codec_dai->capture.rate_min, cpu_dai->capture.rate_min);
202                 runtime->hw.rate_max =
203                         min(codec_dai->capture.rate_max, cpu_dai->capture.rate_max);
204                 runtime->hw.channels_min =
205                         max(codec_dai->capture.channels_min,
206                                 cpu_dai->capture.channels_min);
207                 runtime->hw.channels_max =
208                         min(codec_dai->capture.channels_max,
209                                 cpu_dai->capture.channels_max);
210                 runtime->hw.formats =
211                         codec_dai->capture.formats & cpu_dai->capture.formats;
212                 runtime->hw.rates =
213                         codec_dai->capture.rates & cpu_dai->capture.rates;
214         }
215
216         snd_pcm_limit_hw_rates(runtime);
217         if (!runtime->hw.rates) {
218                 printk(KERN_ERR "asoc: %s <-> %s No matching rates\n",
219                         codec_dai->name, cpu_dai->name);
220                 goto machine_err;
221         }
222         if (!runtime->hw.formats) {
223                 printk(KERN_ERR "asoc: %s <-> %s No matching formats\n",
224                         codec_dai->name, cpu_dai->name);
225                 goto machine_err;
226         }
227         if (!runtime->hw.channels_min || !runtime->hw.channels_max) {
228                 printk(KERN_ERR "asoc: %s <-> %s No matching channels\n",
229                         codec_dai->name, cpu_dai->name);
230                 goto machine_err;
231         }
232
233         dbg("asoc: %s <-> %s info:\n",codec_dai->name, cpu_dai->name);
234         dbg("asoc: rate mask 0x%x\n", runtime->hw.rates);
235         dbg("asoc: min ch %d max ch %d\n", runtime->hw.channels_min,
236                 runtime->hw.channels_max);
237         dbg("asoc: min rate %d max rate %d\n", runtime->hw.rate_min,
238                 runtime->hw.rate_max);
239
240         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
241                 cpu_dai->playback.active = codec_dai->playback.active = 1;
242         else
243                 cpu_dai->capture.active = codec_dai->capture.active = 1;
244         cpu_dai->active = codec_dai->active = 1;
245         cpu_dai->runtime = runtime;
246         socdev->codec->active++;
247         mutex_unlock(&pcm_mutex);
248         return 0;
249
250 machine_err:
251         if (machine->ops && machine->ops->shutdown)
252                 machine->ops->shutdown(substream);
253
254 codec_dai_err:
255         if (platform->pcm_ops->close)
256                 platform->pcm_ops->close(substream);
257
258 platform_err:
259         if (cpu_dai->ops.shutdown)
260                 cpu_dai->ops.shutdown(substream);
261 out:
262         mutex_unlock(&pcm_mutex);
263         return ret;
264 }
265
266 /*
267  * Power down the audio subsytem pmdown_time msecs after close is called.
268  * This is to ensure there are no pops or clicks in between any music tracks
269  * due to DAPM power cycling.
270  */
271 static void close_delayed_work(struct work_struct *work)
272 {
273         struct snd_soc_device *socdev =
274                 container_of(work, struct snd_soc_device, delayed_work.work);
275         struct snd_soc_codec *codec = socdev->codec;
276         struct snd_soc_codec_dai *codec_dai;
277         int i;
278
279         mutex_lock(&pcm_mutex);
280         for(i = 0; i < codec->num_dai; i++) {
281                 codec_dai = &codec->dai[i];
282
283                 dbg("pop wq checking: %s status: %s waiting: %s\n",
284                         codec_dai->playback.stream_name,
285                         codec_dai->playback.active ? "active" : "inactive",
286                         codec_dai->pop_wait ? "yes" : "no");
287
288                 /* are we waiting on this codec DAI stream */
289                 if (codec_dai->pop_wait == 1) {
290
291                         codec_dai->pop_wait = 0;
292                         snd_soc_dapm_stream_event(codec, codec_dai->playback.stream_name,
293                                 SND_SOC_DAPM_STREAM_STOP);
294
295                         /* power down the codec power domain if no longer active */
296                         if (codec->active == 0) {
297                                 dbg("pop wq D3 %s %s\n", codec->name,
298                                         codec_dai->playback.stream_name);
299                                 if (codec->dapm_event)
300                                         codec->dapm_event(codec, SNDRV_CTL_POWER_D3hot);
301                         }
302                 }
303         }
304         mutex_unlock(&pcm_mutex);
305 }
306
307 /*
308  * Called by ALSA when a PCM substream is closed. Private data can be
309  * freed here. The cpu DAI, codec DAI, machine and platform are also
310  * shutdown.
311  */
312 static int soc_codec_close(struct snd_pcm_substream *substream)
313 {
314         struct snd_soc_pcm_runtime *rtd = substream->private_data;
315         struct snd_soc_device *socdev = rtd->socdev;
316         struct snd_soc_dai_link *machine = rtd->dai;
317         struct snd_soc_platform *platform = socdev->platform;
318         struct snd_soc_cpu_dai *cpu_dai = machine->cpu_dai;
319         struct snd_soc_codec_dai *codec_dai = machine->codec_dai;
320         struct snd_soc_codec *codec = socdev->codec;
321
322         mutex_lock(&pcm_mutex);
323
324         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
325                 cpu_dai->playback.active = codec_dai->playback.active = 0;
326         else
327                 cpu_dai->capture.active = codec_dai->capture.active = 0;
328
329         if (codec_dai->playback.active == 0 &&
330                 codec_dai->capture.active == 0) {
331                 cpu_dai->active = codec_dai->active = 0;
332         }
333         codec->active--;
334
335         if (cpu_dai->ops.shutdown)
336                 cpu_dai->ops.shutdown(substream);
337
338         if (codec_dai->ops.shutdown)
339                 codec_dai->ops.shutdown(substream);
340
341         if (machine->ops && machine->ops->shutdown)
342                 machine->ops->shutdown(substream);
343
344         if (platform->pcm_ops->close)
345                 platform->pcm_ops->close(substream);
346         cpu_dai->runtime = NULL;
347
348         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
349                 /* start delayed pop wq here for playback streams */
350                 codec_dai->pop_wait = 1;
351                 schedule_delayed_work(&socdev->delayed_work,
352                         msecs_to_jiffies(pmdown_time));
353         } else {
354                 /* capture streams can be powered down now */
355                 snd_soc_dapm_stream_event(codec,
356                         codec_dai->capture.stream_name, SND_SOC_DAPM_STREAM_STOP);
357
358                 if (codec->active == 0 && codec_dai->pop_wait == 0){
359                         if (codec->dapm_event)
360                                 codec->dapm_event(codec, SNDRV_CTL_POWER_D3hot);
361                 }
362         }
363
364         mutex_unlock(&pcm_mutex);
365         return 0;
366 }
367
368 /*
369  * Called by ALSA when the PCM substream is prepared, can set format, sample
370  * rate, etc.  This function is non atomic and can be called multiple times,
371  * it can refer to the runtime info.
372  */
373 static int soc_pcm_prepare(struct snd_pcm_substream *substream)
374 {
375         struct snd_soc_pcm_runtime *rtd = substream->private_data;
376         struct snd_soc_device *socdev = rtd->socdev;
377         struct snd_soc_dai_link *machine = rtd->dai;
378         struct snd_soc_platform *platform = socdev->platform;
379         struct snd_soc_cpu_dai *cpu_dai = machine->cpu_dai;
380         struct snd_soc_codec_dai *codec_dai = machine->codec_dai;
381         struct snd_soc_codec *codec = socdev->codec;
382         int ret = 0;
383
384         mutex_lock(&pcm_mutex);
385
386         if (machine->ops && machine->ops->prepare) {
387                 ret = machine->ops->prepare(substream);
388                 if (ret < 0) {
389                         printk(KERN_ERR "asoc: machine prepare error\n");
390                         goto out;
391                 }
392         }
393
394         if (platform->pcm_ops->prepare) {
395                 ret = platform->pcm_ops->prepare(substream);
396                 if (ret < 0) {
397                         printk(KERN_ERR "asoc: platform prepare error\n");
398                         goto out;
399                 }
400         }
401
402         if (codec_dai->ops.prepare) {
403                 ret = codec_dai->ops.prepare(substream);
404                 if (ret < 0) {
405                         printk(KERN_ERR "asoc: codec DAI prepare error\n");
406                         goto out;
407                 }
408         }
409
410         if (cpu_dai->ops.prepare) {
411                 ret = cpu_dai->ops.prepare(substream);
412                 if (ret < 0) {
413                         printk(KERN_ERR "asoc: cpu DAI prepare error\n");
414                         goto out;
415                 }
416         }
417
418         /* we only want to start a DAPM playback stream if we are not waiting
419          * on an existing one stopping */
420         if (codec_dai->pop_wait) {
421                 /* we are waiting for the delayed work to start */
422                 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
423                                 snd_soc_dapm_stream_event(socdev->codec,
424                                         codec_dai->capture.stream_name,
425                                         SND_SOC_DAPM_STREAM_START);
426                 else {
427                         codec_dai->pop_wait = 0;
428                         cancel_delayed_work(&socdev->delayed_work);
429                         if (codec_dai->dai_ops.digital_mute)
430                                 codec_dai->dai_ops.digital_mute(codec_dai, 0);
431                 }
432         } else {
433                 /* no delayed work - do we need to power up codec */
434                 if (codec->dapm_state != SNDRV_CTL_POWER_D0) {
435
436                         if (codec->dapm_event)
437                                 codec->dapm_event(codec, SNDRV_CTL_POWER_D1);
438
439                         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
440                                 snd_soc_dapm_stream_event(codec,
441                                         codec_dai->playback.stream_name,
442                                         SND_SOC_DAPM_STREAM_START);
443                         else
444                                 snd_soc_dapm_stream_event(codec,
445                                         codec_dai->capture.stream_name,
446                                         SND_SOC_DAPM_STREAM_START);
447
448                         if (codec->dapm_event)
449                                 codec->dapm_event(codec, SNDRV_CTL_POWER_D0);
450                         if (codec_dai->dai_ops.digital_mute)
451                                 codec_dai->dai_ops.digital_mute(codec_dai, 0);
452
453                 } else {
454                         /* codec already powered - power on widgets */
455                         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
456                                 snd_soc_dapm_stream_event(codec,
457                                         codec_dai->playback.stream_name,
458                                         SND_SOC_DAPM_STREAM_START);
459                         else
460                                 snd_soc_dapm_stream_event(codec,
461                                         codec_dai->capture.stream_name,
462                                         SND_SOC_DAPM_STREAM_START);
463                         if (codec_dai->dai_ops.digital_mute)
464                                 codec_dai->dai_ops.digital_mute(codec_dai, 0);
465                 }
466         }
467
468 out:
469         mutex_unlock(&pcm_mutex);
470         return ret;
471 }
472
473 /*
474  * Called by ALSA when the hardware params are set by application. This
475  * function can also be called multiple times and can allocate buffers
476  * (using snd_pcm_lib_* ). It's non-atomic.
477  */
478 static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
479                                 struct snd_pcm_hw_params *params)
480 {
481         struct snd_soc_pcm_runtime *rtd = substream->private_data;
482         struct snd_soc_device *socdev = rtd->socdev;
483         struct snd_soc_dai_link *machine = rtd->dai;
484         struct snd_soc_platform *platform = socdev->platform;
485         struct snd_soc_cpu_dai *cpu_dai = machine->cpu_dai;
486         struct snd_soc_codec_dai *codec_dai = machine->codec_dai;
487         int ret = 0;
488
489         mutex_lock(&pcm_mutex);
490
491         if (machine->ops && machine->ops->hw_params) {
492                 ret = machine->ops->hw_params(substream, params);
493                 if (ret < 0) {
494                         printk(KERN_ERR "asoc: machine hw_params failed\n");
495                         goto out;
496                 }
497         }
498
499         if (codec_dai->ops.hw_params) {
500                 ret = codec_dai->ops.hw_params(substream, params);
501                 if (ret < 0) {
502                         printk(KERN_ERR "asoc: can't set codec %s hw params\n",
503                                 codec_dai->name);
504                         goto codec_err;
505                 }
506         }
507
508         if (cpu_dai->ops.hw_params) {
509                 ret = cpu_dai->ops.hw_params(substream, params);
510                 if (ret < 0) {
511                         printk(KERN_ERR "asoc: can't set interface %s hw params\n",
512                                 cpu_dai->name);
513                         goto interface_err;
514                 }
515         }
516
517         if (platform->pcm_ops->hw_params) {
518                 ret = platform->pcm_ops->hw_params(substream, params);
519                 if (ret < 0) {
520                         printk(KERN_ERR "asoc: can't set platform %s hw params\n",
521                                 platform->name);
522                         goto platform_err;
523                 }
524         }
525
526 out:
527         mutex_unlock(&pcm_mutex);
528         return ret;
529
530 platform_err:
531         if (cpu_dai->ops.hw_free)
532                 cpu_dai->ops.hw_free(substream);
533
534 interface_err:
535         if (codec_dai->ops.hw_free)
536                 codec_dai->ops.hw_free(substream);
537
538 codec_err:
539         if(machine->ops && machine->ops->hw_free)
540                 machine->ops->hw_free(substream);
541
542         mutex_unlock(&pcm_mutex);
543         return ret;
544 }
545
546 /*
547  * Free's resources allocated by hw_params, can be called multiple times
548  */
549 static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
550 {
551         struct snd_soc_pcm_runtime *rtd = substream->private_data;
552         struct snd_soc_device *socdev = rtd->socdev;
553         struct snd_soc_dai_link *machine = rtd->dai;
554         struct snd_soc_platform *platform = socdev->platform;
555         struct snd_soc_cpu_dai *cpu_dai = machine->cpu_dai;
556         struct snd_soc_codec_dai *codec_dai = machine->codec_dai;
557         struct snd_soc_codec *codec = socdev->codec;
558
559         mutex_lock(&pcm_mutex);
560
561         /* apply codec digital mute */
562         if (!codec->active && codec_dai->dai_ops.digital_mute)
563                 codec_dai->dai_ops.digital_mute(codec_dai, 1);
564
565         /* free any machine hw params */
566         if (machine->ops && machine->ops->hw_free)
567                 machine->ops->hw_free(substream);
568
569         /* free any DMA resources */
570         if (platform->pcm_ops->hw_free)
571                 platform->pcm_ops->hw_free(substream);
572
573         /* now free hw params for the DAI's  */
574         if (codec_dai->ops.hw_free)
575                 codec_dai->ops.hw_free(substream);
576
577         if (cpu_dai->ops.hw_free)
578                 cpu_dai->ops.hw_free(substream);
579
580         mutex_unlock(&pcm_mutex);
581         return 0;
582 }
583
584 static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
585 {
586         struct snd_soc_pcm_runtime *rtd = substream->private_data;
587         struct snd_soc_device *socdev = rtd->socdev;
588         struct snd_soc_dai_link *machine = rtd->dai;
589         struct snd_soc_platform *platform = socdev->platform;
590         struct snd_soc_cpu_dai *cpu_dai = machine->cpu_dai;
591         struct snd_soc_codec_dai *codec_dai = machine->codec_dai;
592         int ret;
593
594         if (codec_dai->ops.trigger) {
595                 ret = codec_dai->ops.trigger(substream, cmd);
596                 if (ret < 0)
597                         return ret;
598         }
599
600         if (platform->pcm_ops->trigger) {
601                 ret = platform->pcm_ops->trigger(substream, cmd);
602                 if (ret < 0)
603                         return ret;
604         }
605
606         if (cpu_dai->ops.trigger) {
607                 ret = cpu_dai->ops.trigger(substream, cmd);
608                 if (ret < 0)
609                         return ret;
610         }
611         return 0;
612 }
613
614 /* ASoC PCM operations */
615 static struct snd_pcm_ops soc_pcm_ops = {
616         .open           = soc_pcm_open,
617         .close          = soc_codec_close,
618         .hw_params      = soc_pcm_hw_params,
619         .hw_free        = soc_pcm_hw_free,
620         .prepare        = soc_pcm_prepare,
621         .trigger        = soc_pcm_trigger,
622 };
623
624 #ifdef CONFIG_PM
625 /* powers down audio subsystem for suspend */
626 static int soc_suspend(struct platform_device *pdev, pm_message_t state)
627 {
628         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
629         struct snd_soc_machine *machine = socdev->machine;
630         struct snd_soc_platform *platform = socdev->platform;
631         struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
632         struct snd_soc_codec *codec = socdev->codec;
633         int i;
634
635         /* mute any active DAC's */
636         for(i = 0; i < machine->num_links; i++) {
637                 struct snd_soc_codec_dai *dai = machine->dai_link[i].codec_dai;
638                 if (dai->dai_ops.digital_mute && dai->playback.active)
639                         dai->dai_ops.digital_mute(dai, 1);
640         }
641
642         if (machine->suspend_pre)
643                 machine->suspend_pre(pdev, state);
644
645         for(i = 0; i < machine->num_links; i++) {
646                 struct snd_soc_cpu_dai  *cpu_dai = machine->dai_link[i].cpu_dai;
647                 if (cpu_dai->suspend && cpu_dai->type != SND_SOC_DAI_AC97)
648                         cpu_dai->suspend(pdev, cpu_dai);
649                 if (platform->suspend)
650                         platform->suspend(pdev, cpu_dai);
651         }
652
653         /* close any waiting streams and save state */
654         run_delayed_work(&socdev->delayed_work);
655         codec->suspend_dapm_state = codec->dapm_state;
656
657         for(i = 0; i < codec->num_dai; i++) {
658                 char *stream = codec->dai[i].playback.stream_name;
659                 if (stream != NULL)
660                         snd_soc_dapm_stream_event(codec, stream,
661                                 SND_SOC_DAPM_STREAM_SUSPEND);
662                 stream = codec->dai[i].capture.stream_name;
663                 if (stream != NULL)
664                         snd_soc_dapm_stream_event(codec, stream,
665                                 SND_SOC_DAPM_STREAM_SUSPEND);
666         }
667
668         if (codec_dev->suspend)
669                 codec_dev->suspend(pdev, state);
670
671         for(i = 0; i < machine->num_links; i++) {
672                 struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
673                 if (cpu_dai->suspend && cpu_dai->type == SND_SOC_DAI_AC97)
674                         cpu_dai->suspend(pdev, cpu_dai);
675         }
676
677         if (machine->suspend_post)
678                 machine->suspend_post(pdev, state);
679
680         return 0;
681 }
682
683 /* powers up audio subsystem after a suspend */
684 static int soc_resume(struct platform_device *pdev)
685 {
686         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
687         struct snd_soc_machine *machine = socdev->machine;
688         struct snd_soc_platform *platform = socdev->platform;
689         struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
690         struct snd_soc_codec *codec = socdev->codec;
691         int i;
692
693         if (machine->resume_pre)
694                 machine->resume_pre(pdev);
695
696         for(i = 0; i < machine->num_links; i++) {
697                 struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
698                 if (cpu_dai->resume && cpu_dai->type == SND_SOC_DAI_AC97)
699                         cpu_dai->resume(pdev, cpu_dai);
700         }
701
702         if (codec_dev->resume)
703                 codec_dev->resume(pdev);
704
705         for(i = 0; i < codec->num_dai; i++) {
706                 char* stream = codec->dai[i].playback.stream_name;
707                 if (stream != NULL)
708                         snd_soc_dapm_stream_event(codec, stream,
709                                 SND_SOC_DAPM_STREAM_RESUME);
710                 stream = codec->dai[i].capture.stream_name;
711                 if (stream != NULL)
712                         snd_soc_dapm_stream_event(codec, stream,
713                                 SND_SOC_DAPM_STREAM_RESUME);
714         }
715
716         /* unmute any active DAC's */
717         for(i = 0; i < machine->num_links; i++) {
718                 struct snd_soc_codec_dai *dai = machine->dai_link[i].codec_dai;
719                 if (dai->dai_ops.digital_mute && dai->playback.active)
720                         dai->dai_ops.digital_mute(dai, 0);
721         }
722
723         for(i = 0; i < machine->num_links; i++) {
724                 struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
725                 if (cpu_dai->resume && cpu_dai->type != SND_SOC_DAI_AC97)
726                         cpu_dai->resume(pdev, cpu_dai);
727                 if (platform->resume)
728                         platform->resume(pdev, cpu_dai);
729         }
730
731         if (machine->resume_post)
732                 machine->resume_post(pdev);
733
734         return 0;
735 }
736
737 #else
738 #define soc_suspend     NULL
739 #define soc_resume      NULL
740 #endif
741
742 /* probes a new socdev */
743 static int soc_probe(struct platform_device *pdev)
744 {
745         int ret = 0, i;
746         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
747         struct snd_soc_machine *machine = socdev->machine;
748         struct snd_soc_platform *platform = socdev->platform;
749         struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
750
751         if (machine->probe) {
752                 ret = machine->probe(pdev);
753                 if(ret < 0)
754                         return ret;
755         }
756
757         for (i = 0; i < machine->num_links; i++) {
758                 struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
759                 if (cpu_dai->probe) {
760                         ret = cpu_dai->probe(pdev);
761                         if(ret < 0)
762                                 goto cpu_dai_err;
763                 }
764         }
765
766         if (codec_dev->probe) {
767                 ret = codec_dev->probe(pdev);
768                 if(ret < 0)
769                         goto cpu_dai_err;
770         }
771
772         if (platform->probe) {
773                 ret = platform->probe(pdev);
774                 if(ret < 0)
775                         goto platform_err;
776         }
777
778         /* DAPM stream work */
779         INIT_DELAYED_WORK(&socdev->delayed_work, close_delayed_work);
780         return 0;
781
782 platform_err:
783         if (codec_dev->remove)
784                 codec_dev->remove(pdev);
785
786 cpu_dai_err:
787         for (i--; i >= 0; i--) {
788                 struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
789                 if (cpu_dai->remove)
790                         cpu_dai->remove(pdev);
791         }
792
793         if (machine->remove)
794                 machine->remove(pdev);
795
796         return ret;
797 }
798
799 /* removes a socdev */
800 static int soc_remove(struct platform_device *pdev)
801 {
802         int i;
803         struct snd_soc_device *socdev = platform_get_drvdata(pdev);
804         struct snd_soc_machine *machine = socdev->machine;
805         struct snd_soc_platform *platform = socdev->platform;
806         struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
807
808         run_delayed_work(&socdev->delayed_work);
809
810         if (platform->remove)
811                 platform->remove(pdev);
812
813         if (codec_dev->remove)
814                 codec_dev->remove(pdev);
815
816         for (i = 0; i < machine->num_links; i++) {
817                 struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
818                 if (cpu_dai->remove)
819                         cpu_dai->remove(pdev);
820         }
821
822         if (machine->remove)
823                 machine->remove(pdev);
824
825         return 0;
826 }
827
828 /* ASoC platform driver */
829 static struct platform_driver soc_driver = {
830         .driver         = {
831                 .name           = "soc-audio",
832         },
833         .probe          = soc_probe,
834         .remove         = soc_remove,
835         .suspend        = soc_suspend,
836         .resume         = soc_resume,
837 };
838
839 /* create a new pcm */
840 static int soc_new_pcm(struct snd_soc_device *socdev,
841         struct snd_soc_dai_link *dai_link, int num)
842 {
843         struct snd_soc_codec *codec = socdev->codec;
844         struct snd_soc_codec_dai *codec_dai = dai_link->codec_dai;
845         struct snd_soc_cpu_dai *cpu_dai = dai_link->cpu_dai;
846         struct snd_soc_pcm_runtime *rtd;
847         struct snd_pcm *pcm;
848         char new_name[64];
849         int ret = 0, playback = 0, capture = 0;
850
851         rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL);
852         if (rtd == NULL)
853                 return -ENOMEM;
854
855         rtd->dai = dai_link;
856         rtd->socdev = socdev;
857         codec_dai->codec = socdev->codec;
858
859         /* check client and interface hw capabilities */
860         sprintf(new_name, "%s %s-%s-%d",dai_link->stream_name, codec_dai->name,
861                 get_dai_name(cpu_dai->type), num);
862
863         if (codec_dai->playback.channels_min)
864                 playback = 1;
865         if (codec_dai->capture.channels_min)
866                 capture = 1;
867
868         ret = snd_pcm_new(codec->card, new_name, codec->pcm_devs++, playback,
869                 capture, &pcm);
870         if (ret < 0) {
871                 printk(KERN_ERR "asoc: can't create pcm for codec %s\n", codec->name);
872                 kfree(rtd);
873                 return ret;
874         }
875
876         pcm->private_data = rtd;
877         soc_pcm_ops.mmap = socdev->platform->pcm_ops->mmap;
878         soc_pcm_ops.pointer = socdev->platform->pcm_ops->pointer;
879         soc_pcm_ops.ioctl = socdev->platform->pcm_ops->ioctl;
880         soc_pcm_ops.copy = socdev->platform->pcm_ops->copy;
881         soc_pcm_ops.silence = socdev->platform->pcm_ops->silence;
882         soc_pcm_ops.ack = socdev->platform->pcm_ops->ack;
883         soc_pcm_ops.page = socdev->platform->pcm_ops->page;
884
885         if (playback)
886                 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops);
887
888         if (capture)
889                 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops);
890
891         ret = socdev->platform->pcm_new(codec->card, codec_dai, pcm);
892         if (ret < 0) {
893                 printk(KERN_ERR "asoc: platform pcm constructor failed\n");
894                 kfree(rtd);
895                 return ret;
896         }
897
898         pcm->private_free = socdev->platform->pcm_free;
899         printk(KERN_INFO "asoc: %s <-> %s mapping ok\n", codec_dai->name,
900                 cpu_dai->name);
901         return ret;
902 }
903
904 /* codec register dump */
905 static ssize_t codec_reg_show(struct device *dev,
906         struct device_attribute *attr, char *buf)
907 {
908         struct snd_soc_device *devdata = dev_get_drvdata(dev);
909         struct snd_soc_codec *codec = devdata->codec;
910         int i, step = 1, count = 0;
911
912         if (!codec->reg_cache_size)
913                 return 0;
914
915         if (codec->reg_cache_step)
916                 step = codec->reg_cache_step;
917
918         count += sprintf(buf, "%s registers\n", codec->name);
919         for(i = 0; i < codec->reg_cache_size; i += step)
920                 count += sprintf(buf + count, "%2x: %4x\n", i, codec->read(codec, i));
921
922         return count;
923 }
924 static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL);
925
926 /**
927  * snd_soc_new_ac97_codec - initailise AC97 device
928  * @codec: audio codec
929  * @ops: AC97 bus operations
930  * @num: AC97 codec number
931  *
932  * Initialises AC97 codec resources for use by ad-hoc devices only.
933  */
934 int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
935         struct snd_ac97_bus_ops *ops, int num)
936 {
937         mutex_lock(&codec->mutex);
938
939         codec->ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL);
940         if (codec->ac97 == NULL) {
941                 mutex_unlock(&codec->mutex);
942                 return -ENOMEM;
943         }
944
945         codec->ac97->bus = kzalloc(sizeof(struct snd_ac97_bus), GFP_KERNEL);
946         if (codec->ac97->bus == NULL) {
947                 kfree(codec->ac97);
948                 codec->ac97 = NULL;
949                 mutex_unlock(&codec->mutex);
950                 return -ENOMEM;
951         }
952
953         codec->ac97->bus->ops = ops;
954         codec->ac97->num = num;
955         mutex_unlock(&codec->mutex);
956         return 0;
957 }
958 EXPORT_SYMBOL_GPL(snd_soc_new_ac97_codec);
959
960 /**
961  * snd_soc_free_ac97_codec - free AC97 codec device
962  * @codec: audio codec
963  *
964  * Frees AC97 codec device resources.
965  */
966 void snd_soc_free_ac97_codec(struct snd_soc_codec *codec)
967 {
968         mutex_lock(&codec->mutex);
969         kfree(codec->ac97->bus);
970         kfree(codec->ac97);
971         codec->ac97 = NULL;
972         mutex_unlock(&codec->mutex);
973 }
974 EXPORT_SYMBOL_GPL(snd_soc_free_ac97_codec);
975
976 /**
977  * snd_soc_update_bits - update codec register bits
978  * @codec: audio codec
979  * @reg: codec register
980  * @mask: register mask
981  * @value: new value
982  *
983  * Writes new register value.
984  *
985  * Returns 1 for change else 0.
986  */
987 int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
988                                 unsigned short mask, unsigned short value)
989 {
990         int change;
991         unsigned short old, new;
992
993         mutex_lock(&io_mutex);
994         old = snd_soc_read(codec, reg);
995         new = (old & ~mask) | value;
996         change = old != new;
997         if (change)
998                 snd_soc_write(codec, reg, new);
999
1000         mutex_unlock(&io_mutex);
1001         return change;
1002 }
1003 EXPORT_SYMBOL_GPL(snd_soc_update_bits);
1004
1005 /**
1006  * snd_soc_test_bits - test register for change
1007  * @codec: audio codec
1008  * @reg: codec register
1009  * @mask: register mask
1010  * @value: new value
1011  *
1012  * Tests a register with a new value and checks if the new value is
1013  * different from the old value.
1014  *
1015  * Returns 1 for change else 0.
1016  */
1017 int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
1018                                 unsigned short mask, unsigned short value)
1019 {
1020         int change;
1021         unsigned short old, new;
1022
1023         mutex_lock(&io_mutex);
1024         old = snd_soc_read(codec, reg);
1025         new = (old & ~mask) | value;
1026         change = old != new;
1027         mutex_unlock(&io_mutex);
1028
1029         return change;
1030 }
1031 EXPORT_SYMBOL_GPL(snd_soc_test_bits);
1032
1033 /**
1034  * snd_soc_new_pcms - create new sound card and pcms
1035  * @socdev: the SoC audio device
1036  *
1037  * Create a new sound card based upon the codec and interface pcms.
1038  *
1039  * Returns 0 for success, else error.
1040  */
1041 int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid)
1042 {
1043         struct snd_soc_codec *codec = socdev->codec;
1044         struct snd_soc_machine *machine = socdev->machine;
1045         int ret = 0, i;
1046
1047         mutex_lock(&codec->mutex);
1048
1049         /* register a sound card */
1050         codec->card = snd_card_new(idx, xid, codec->owner, 0);
1051         if (!codec->card) {
1052                 printk(KERN_ERR "asoc: can't create sound card for codec %s\n",
1053                         codec->name);
1054                 mutex_unlock(&codec->mutex);
1055                 return -ENODEV;
1056         }
1057
1058         codec->card->dev = socdev->dev;
1059         codec->card->private_data = codec;
1060         strncpy(codec->card->driver, codec->name, sizeof(codec->card->driver));
1061
1062         /* create the pcms */
1063         for(i = 0; i < machine->num_links; i++) {
1064                 ret = soc_new_pcm(socdev, &machine->dai_link[i], i);
1065                 if (ret < 0) {
1066                         printk(KERN_ERR "asoc: can't create pcm %s\n",
1067                                 machine->dai_link[i].stream_name);
1068                         mutex_unlock(&codec->mutex);
1069                         return ret;
1070                 }
1071         }
1072
1073         mutex_unlock(&codec->mutex);
1074         return ret;
1075 }
1076 EXPORT_SYMBOL_GPL(snd_soc_new_pcms);
1077
1078 /**
1079  * snd_soc_register_card - register sound card
1080  * @socdev: the SoC audio device
1081  *
1082  * Register a SoC sound card. Also registers an AC97 device if the
1083  * codec is AC97 for ad hoc devices.
1084  *
1085  * Returns 0 for success, else error.
1086  */
1087 int snd_soc_register_card(struct snd_soc_device *socdev)
1088 {
1089         struct snd_soc_codec *codec = socdev->codec;
1090         struct snd_soc_machine *machine = socdev->machine;
1091         int ret = 0, i, ac97 = 0, err = 0;
1092
1093         mutex_lock(&codec->mutex);
1094         for(i = 0; i < machine->num_links; i++) {
1095                 if (socdev->machine->dai_link[i].init) {
1096                         err = socdev->machine->dai_link[i].init(codec);
1097                         if (err < 0) {
1098                                 printk(KERN_ERR "asoc: failed to init %s\n",
1099                                         socdev->machine->dai_link[i].stream_name);
1100                                 continue;
1101                         }
1102                 }
1103                 if (socdev->machine->dai_link[i].codec_dai->type == 
1104                         SND_SOC_DAI_AC97_BUS)
1105                         ac97 = 1;
1106         }
1107         snprintf(codec->card->shortname, sizeof(codec->card->shortname),
1108                  "%s", machine->name);
1109         snprintf(codec->card->longname, sizeof(codec->card->longname),
1110                  "%s (%s)", machine->name, codec->name);
1111
1112         ret = snd_card_register(codec->card);
1113         if (ret < 0) {
1114                 printk(KERN_ERR "asoc: failed to register soundcard for codec %s\n",
1115                                 codec->name);
1116                 goto out;
1117         }
1118
1119 #ifdef CONFIG_SND_SOC_AC97_BUS
1120         if (ac97) {
1121                 ret = soc_ac97_dev_register(codec);
1122                 if (ret < 0) {
1123                         printk(KERN_ERR "asoc: AC97 device register failed\n");
1124                         snd_card_free(codec->card);
1125                         goto out;
1126                 }
1127         }
1128 #endif
1129
1130         err = snd_soc_dapm_sys_add(socdev->dev);
1131         if (err < 0)
1132                 printk(KERN_WARNING "asoc: failed to add dapm sysfs entries\n");
1133
1134         err = device_create_file(socdev->dev, &dev_attr_codec_reg);
1135         if (err < 0)
1136                 printk(KERN_WARNING "asoc: failed to add codec sysfs entries\n");
1137 out:
1138         mutex_unlock(&codec->mutex);
1139         return ret;
1140 }
1141 EXPORT_SYMBOL_GPL(snd_soc_register_card);
1142
1143 /**
1144  * snd_soc_free_pcms - free sound card and pcms
1145  * @socdev: the SoC audio device
1146  *
1147  * Frees sound card and pcms associated with the socdev.
1148  * Also unregister the codec if it is an AC97 device.
1149  */
1150 void snd_soc_free_pcms(struct snd_soc_device *socdev)
1151 {
1152         struct snd_soc_codec *codec = socdev->codec;
1153 #ifdef CONFIG_SND_SOC_AC97_BUS
1154         struct snd_soc_codec_dai *codec_dai;
1155         int i;
1156 #endif
1157
1158         mutex_lock(&codec->mutex);
1159 #ifdef CONFIG_SND_SOC_AC97_BUS
1160         for(i = 0; i < codec->num_dai; i++) {
1161                 codec_dai = &codec->dai[i];
1162                 if (codec_dai->type == SND_SOC_DAI_AC97_BUS && codec->ac97) {
1163                         soc_ac97_dev_unregister(codec);
1164                         goto free_card;
1165                 }
1166         }
1167 free_card:
1168 #endif
1169
1170         if (codec->card)
1171                 snd_card_free(codec->card);
1172         device_remove_file(socdev->dev, &dev_attr_codec_reg);
1173         mutex_unlock(&codec->mutex);
1174 }
1175 EXPORT_SYMBOL_GPL(snd_soc_free_pcms);
1176
1177 /**
1178  * snd_soc_set_runtime_hwparams - set the runtime hardware parameters
1179  * @substream: the pcm substream
1180  * @hw: the hardware parameters
1181  *
1182  * Sets the substream runtime hardware parameters.
1183  */
1184 int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
1185         const struct snd_pcm_hardware *hw)
1186 {
1187         struct snd_pcm_runtime *runtime = substream->runtime;
1188         runtime->hw.info = hw->info;
1189         runtime->hw.formats = hw->formats;
1190         runtime->hw.period_bytes_min = hw->period_bytes_min;
1191         runtime->hw.period_bytes_max = hw->period_bytes_max;
1192         runtime->hw.periods_min = hw->periods_min;
1193         runtime->hw.periods_max = hw->periods_max;
1194         runtime->hw.buffer_bytes_max = hw->buffer_bytes_max;
1195         runtime->hw.fifo_size = hw->fifo_size;
1196         return 0;
1197 }
1198 EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams);
1199
1200 /**
1201  * snd_soc_cnew - create new control
1202  * @_template: control template
1203  * @data: control private data
1204  * @lnng_name: control long name
1205  *
1206  * Create a new mixer control from a template control.
1207  *
1208  * Returns 0 for success, else error.
1209  */
1210 struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
1211         void *data, char *long_name)
1212 {
1213         struct snd_kcontrol_new template;
1214
1215         memcpy(&template, _template, sizeof(template));
1216         if (long_name)
1217                 template.name = long_name;
1218         template.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
1219         template.index = 0;
1220
1221         return snd_ctl_new1(&template, data);
1222 }
1223 EXPORT_SYMBOL_GPL(snd_soc_cnew);
1224
1225 /**
1226  * snd_soc_info_enum_double - enumerated double mixer info callback
1227  * @kcontrol: mixer control
1228  * @uinfo: control element information
1229  *
1230  * Callback to provide information about a double enumerated
1231  * mixer control.
1232  *
1233  * Returns 0 for success.
1234  */
1235 int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
1236         struct snd_ctl_elem_info *uinfo)
1237 {
1238         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1239
1240         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1241         uinfo->count = e->shift_l == e->shift_r ? 1 : 2;
1242         uinfo->value.enumerated.items = e->mask;
1243
1244         if (uinfo->value.enumerated.item > e->mask - 1)
1245                 uinfo->value.enumerated.item = e->mask - 1;
1246         strcpy(uinfo->value.enumerated.name,
1247                 e->texts[uinfo->value.enumerated.item]);
1248         return 0;
1249 }
1250 EXPORT_SYMBOL_GPL(snd_soc_info_enum_double);
1251
1252 /**
1253  * snd_soc_get_enum_double - enumerated double mixer get callback
1254  * @kcontrol: mixer control
1255  * @uinfo: control element information
1256  *
1257  * Callback to get the value of a double enumerated mixer.
1258  *
1259  * Returns 0 for success.
1260  */
1261 int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
1262         struct snd_ctl_elem_value *ucontrol)
1263 {
1264         struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1265         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1266         unsigned short val, bitmask;
1267
1268         for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
1269                 ;
1270         val = snd_soc_read(codec, e->reg);
1271         ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1);
1272         if (e->shift_l != e->shift_r)
1273                 ucontrol->value.enumerated.item[1] =
1274                         (val >> e->shift_r) & (bitmask - 1);
1275
1276         return 0;
1277 }
1278 EXPORT_SYMBOL_GPL(snd_soc_get_enum_double);
1279
1280 /**
1281  * snd_soc_put_enum_double - enumerated double mixer put callback
1282  * @kcontrol: mixer control
1283  * @uinfo: control element information
1284  *
1285  * Callback to set the value of a double enumerated mixer.
1286  *
1287  * Returns 0 for success.
1288  */
1289 int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
1290         struct snd_ctl_elem_value *ucontrol)
1291 {
1292         struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1293         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1294         unsigned short val;
1295         unsigned short mask, bitmask;
1296
1297         for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
1298                 ;
1299         if (ucontrol->value.enumerated.item[0] > e->mask - 1)
1300                 return -EINVAL;
1301         val = ucontrol->value.enumerated.item[0] << e->shift_l;
1302         mask = (bitmask - 1) << e->shift_l;
1303         if (e->shift_l != e->shift_r) {
1304                 if (ucontrol->value.enumerated.item[1] > e->mask - 1)
1305                         return -EINVAL;
1306                 val |= ucontrol->value.enumerated.item[1] << e->shift_r;
1307                 mask |= (bitmask - 1) << e->shift_r;
1308         }
1309
1310         return snd_soc_update_bits(codec, e->reg, mask, val);
1311 }
1312 EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
1313
1314 /**
1315  * snd_soc_info_enum_ext - external enumerated single mixer info callback
1316  * @kcontrol: mixer control
1317  * @uinfo: control element information
1318  *
1319  * Callback to provide information about an external enumerated
1320  * single mixer.
1321  *
1322  * Returns 0 for success.
1323  */
1324 int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol,
1325         struct snd_ctl_elem_info *uinfo)
1326 {
1327         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1328
1329         uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1330         uinfo->count = 1;
1331         uinfo->value.enumerated.items = e->mask;
1332
1333         if (uinfo->value.enumerated.item > e->mask - 1)
1334                 uinfo->value.enumerated.item = e->mask - 1;
1335         strcpy(uinfo->value.enumerated.name,
1336                 e->texts[uinfo->value.enumerated.item]);
1337         return 0;
1338 }
1339 EXPORT_SYMBOL_GPL(snd_soc_info_enum_ext);
1340
1341 /**
1342  * snd_soc_info_volsw_ext - external single mixer info callback
1343  * @kcontrol: mixer control
1344  * @uinfo: control element information
1345  *
1346  * Callback to provide information about a single external mixer control.
1347  *
1348  * Returns 0 for success.
1349  */
1350 int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
1351         struct snd_ctl_elem_info *uinfo)
1352 {
1353         int mask = kcontrol->private_value;
1354
1355         uinfo->type =
1356                 mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1357         uinfo->count = 1;
1358         uinfo->value.integer.min = 0;
1359         uinfo->value.integer.max = mask;
1360         return 0;
1361 }
1362 EXPORT_SYMBOL_GPL(snd_soc_info_volsw_ext);
1363
1364 /**
1365  * snd_soc_info_bool_ext - external single boolean mixer info callback
1366  * @kcontrol: mixer control
1367  * @uinfo: control element information
1368  *
1369  * Callback to provide information about a single boolean external mixer control.
1370  *
1371  * Returns 0 for success.
1372  */
1373 int snd_soc_info_bool_ext(struct snd_kcontrol *kcontrol,
1374         struct snd_ctl_elem_info *uinfo)
1375 {
1376         uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1377         uinfo->count = 1;
1378         uinfo->value.integer.min = 0;
1379         uinfo->value.integer.max = 1;
1380         return 0;
1381 }
1382 EXPORT_SYMBOL_GPL(snd_soc_info_bool_ext);
1383
1384 /**
1385  * snd_soc_info_volsw - single mixer info callback
1386  * @kcontrol: mixer control
1387  * @uinfo: control element information
1388  *
1389  * Callback to provide information about a single mixer control.
1390  *
1391  * Returns 0 for success.
1392  */
1393 int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
1394         struct snd_ctl_elem_info *uinfo)
1395 {
1396         int mask = (kcontrol->private_value >> 16) & 0xff;
1397         int shift = (kcontrol->private_value >> 8) & 0x0f;
1398         int rshift = (kcontrol->private_value >> 12) & 0x0f;
1399
1400         uinfo->type =
1401                 mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1402         uinfo->count = shift == rshift ? 1 : 2;
1403         uinfo->value.integer.min = 0;
1404         uinfo->value.integer.max = mask;
1405         return 0;
1406 }
1407 EXPORT_SYMBOL_GPL(snd_soc_info_volsw);
1408
1409 /**
1410  * snd_soc_get_volsw - single mixer get callback
1411  * @kcontrol: mixer control
1412  * @uinfo: control element information
1413  *
1414  * Callback to get the value of a single mixer control.
1415  *
1416  * Returns 0 for success.
1417  */
1418 int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
1419         struct snd_ctl_elem_value *ucontrol)
1420 {
1421         struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1422         int reg = kcontrol->private_value & 0xff;
1423         int shift = (kcontrol->private_value >> 8) & 0x0f;
1424         int rshift = (kcontrol->private_value >> 12) & 0x0f;
1425         int mask = (kcontrol->private_value >> 16) & 0xff;
1426         int invert = (kcontrol->private_value >> 24) & 0x01;
1427
1428         ucontrol->value.integer.value[0] =
1429                 (snd_soc_read(codec, reg) >> shift) & mask;
1430         if (shift != rshift)
1431                 ucontrol->value.integer.value[1] =
1432                         (snd_soc_read(codec, reg) >> rshift) & mask;
1433         if (invert) {
1434                 ucontrol->value.integer.value[0] =
1435                         mask - ucontrol->value.integer.value[0];
1436                 if (shift != rshift)
1437                         ucontrol->value.integer.value[1] =
1438                                 mask - ucontrol->value.integer.value[1];
1439         }
1440
1441         return 0;
1442 }
1443 EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
1444
1445 /**
1446  * snd_soc_put_volsw - single mixer put callback
1447  * @kcontrol: mixer control
1448  * @uinfo: control element information
1449  *
1450  * Callback to set the value of a single mixer control.
1451  *
1452  * Returns 0 for success.
1453  */
1454 int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
1455         struct snd_ctl_elem_value *ucontrol)
1456 {
1457         struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1458         int reg = kcontrol->private_value & 0xff;
1459         int shift = (kcontrol->private_value >> 8) & 0x0f;
1460         int rshift = (kcontrol->private_value >> 12) & 0x0f;
1461         int mask = (kcontrol->private_value >> 16) & 0xff;
1462         int invert = (kcontrol->private_value >> 24) & 0x01;
1463         int err;
1464         unsigned short val, val2, val_mask;
1465
1466         val = (ucontrol->value.integer.value[0] & mask);
1467         if (invert)
1468                 val = mask - val;
1469         val_mask = mask << shift;
1470         val = val << shift;
1471         if (shift != rshift) {
1472                 val2 = (ucontrol->value.integer.value[1] & mask);
1473                 if (invert)
1474                         val2 = mask - val2;
1475                 val_mask |= mask << rshift;
1476                 val |= val2 << rshift;
1477         }
1478         err = snd_soc_update_bits(codec, reg, val_mask, val);
1479         return err;
1480 }
1481 EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
1482
1483 /**
1484  * snd_soc_info_volsw_2r - double mixer info callback
1485  * @kcontrol: mixer control
1486  * @uinfo: control element information
1487  *
1488  * Callback to provide information about a double mixer control that
1489  * spans 2 codec registers.
1490  *
1491  * Returns 0 for success.
1492  */
1493 int snd_soc_info_volsw_2r(struct snd_kcontrol *kcontrol,
1494         struct snd_ctl_elem_info *uinfo)
1495 {
1496         int mask = (kcontrol->private_value >> 12) & 0xff;
1497
1498         uinfo->type =
1499                 mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
1500         uinfo->count = 2;
1501         uinfo->value.integer.min = 0;
1502         uinfo->value.integer.max = mask;
1503         return 0;
1504 }
1505 EXPORT_SYMBOL_GPL(snd_soc_info_volsw_2r);
1506
1507 /**
1508  * snd_soc_get_volsw_2r - double mixer get callback
1509  * @kcontrol: mixer control
1510  * @uinfo: control element information
1511  *
1512  * Callback to get the value of a double mixer control that spans 2 registers.
1513  *
1514  * Returns 0 for success.
1515  */
1516 int snd_soc_get_volsw_2r(struct snd_kcontrol *kcontrol,
1517         struct snd_ctl_elem_value *ucontrol)
1518 {
1519         struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1520         int reg = kcontrol->private_value & 0xff;
1521         int reg2 = (kcontrol->private_value >> 24) & 0xff;
1522         int shift = (kcontrol->private_value >> 8) & 0x0f;
1523         int mask = (kcontrol->private_value >> 12) & 0xff;
1524         int invert = (kcontrol->private_value >> 20) & 0x01;
1525
1526         ucontrol->value.integer.value[0] =
1527                 (snd_soc_read(codec, reg) >> shift) & mask;
1528         ucontrol->value.integer.value[1] =
1529                 (snd_soc_read(codec, reg2) >> shift) & mask;
1530         if (invert) {
1531                 ucontrol->value.integer.value[0] =
1532                         mask - ucontrol->value.integer.value[0];
1533                 ucontrol->value.integer.value[1] =
1534                         mask - ucontrol->value.integer.value[1];
1535         }
1536
1537         return 0;
1538 }
1539 EXPORT_SYMBOL_GPL(snd_soc_get_volsw_2r);
1540
1541 /**
1542  * snd_soc_put_volsw_2r - double mixer set callback
1543  * @kcontrol: mixer control
1544  * @uinfo: control element information
1545  *
1546  * Callback to set the value of a double mixer control that spans 2 registers.
1547  *
1548  * Returns 0 for success.
1549  */
1550 int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
1551         struct snd_ctl_elem_value *ucontrol)
1552 {
1553         struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1554         int reg = kcontrol->private_value & 0xff;
1555         int reg2 = (kcontrol->private_value >> 24) & 0xff;
1556         int shift = (kcontrol->private_value >> 8) & 0x0f;
1557         int mask = (kcontrol->private_value >> 12) & 0xff;
1558         int invert = (kcontrol->private_value >> 20) & 0x01;
1559         int err;
1560         unsigned short val, val2, val_mask;
1561
1562         val_mask = mask << shift;
1563         val = (ucontrol->value.integer.value[0] & mask);
1564         val2 = (ucontrol->value.integer.value[1] & mask);
1565
1566         if (invert) {
1567                 val = mask - val;
1568                 val2 = mask - val2;
1569         }
1570
1571         val = val << shift;
1572         val2 = val2 << shift;
1573
1574         if ((err = snd_soc_update_bits(codec, reg, val_mask, val)) < 0)
1575                 return err;
1576
1577         err = snd_soc_update_bits(codec, reg2, val_mask, val2);
1578         return err;
1579 }
1580 EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r);
1581
1582 static int __devinit snd_soc_init(void)
1583 {
1584         printk(KERN_INFO "ASoC version %s\n", SND_SOC_VERSION);
1585         return platform_driver_register(&soc_driver);
1586 }
1587
1588 static void snd_soc_exit(void)
1589 {
1590         platform_driver_unregister(&soc_driver);
1591 }
1592
1593 module_init(snd_soc_init);
1594 module_exit(snd_soc_exit);
1595
1596 /* Module information */
1597 MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
1598 MODULE_DESCRIPTION("ALSA SoC Core");
1599 MODULE_LICENSE("GPL");