xref: /openbmc/linux/sound/soc/soc-core.c (revision 64c70b1c)
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");
1600