ASoC: CS4270: export de-emphasis filter as ALSA control
[deliverable/linux.git] / sound / soc / soc-core.c
CommitLineData
db2a4165
FM
1/*
2 * soc-core.c -- ALSA SoC Audio Layer
3 *
4 * Copyright 2005 Wolfson Microelectronics PLC.
0664d888
LG
5 * Copyright 2005 Openedhand Ltd.
6 *
d331124d 7 * Author: Liam Girdwood <lrg@slimlogic.co.uk>
0664d888
LG
8 * with code, comments and ideas from :-
9 * Richard Purdie <richard@openedhand.com>
db2a4165
FM
10 *
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the
13 * Free Software Foundation; either version 2 of the License, or (at your
14 * option) any later version.
15 *
db2a4165
FM
16 * TODO:
17 * o Add hw rules to enforce rates, etc.
18 * o More testing with other codecs/machines.
19 * o Add more codecs and platforms to ensure good API coverage.
20 * o Support TDM on PCM and I2S
21 */
22
23#include <linux/module.h>
24#include <linux/moduleparam.h>
25#include <linux/init.h>
26#include <linux/delay.h>
27#include <linux/pm.h>
28#include <linux/bitops.h>
12ef193d 29#include <linux/debugfs.h>
db2a4165 30#include <linux/platform_device.h>
474828a4 31#include <sound/ac97_codec.h>
db2a4165
FM
32#include <sound/core.h>
33#include <sound/pcm.h>
34#include <sound/pcm_params.h>
35#include <sound/soc.h>
36#include <sound/soc-dapm.h>
37#include <sound/initval.h>
38
db2a4165
FM
39static DEFINE_MUTEX(pcm_mutex);
40static DEFINE_MUTEX(io_mutex);
db2a4165
FM
41static DECLARE_WAIT_QUEUE_HEAD(soc_pm_waitq);
42
384c89e2
MB
43#ifdef CONFIG_DEBUG_FS
44static struct dentry *debugfs_root;
45#endif
46
c5af3a2e
MB
47static DEFINE_MUTEX(client_mutex);
48static LIST_HEAD(card_list);
9115171a 49static LIST_HEAD(dai_list);
12a48a8c 50static LIST_HEAD(platform_list);
0d0cf00a 51static LIST_HEAD(codec_list);
c5af3a2e
MB
52
53static int snd_soc_register_card(struct snd_soc_card *card);
54static int snd_soc_unregister_card(struct snd_soc_card *card);
55
db2a4165
FM
56/*
57 * This is a timeout to do a DAPM powerdown after a stream is closed().
58 * It can be used to eliminate pops between different playback streams, e.g.
59 * between two audio tracks.
60 */
61static int pmdown_time = 5000;
62module_param(pmdown_time, int, 0);
63MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)");
64
965ac42c
LG
65/*
66 * This function forces any delayed work to be queued and run.
67 */
68static int run_delayed_work(struct delayed_work *dwork)
69{
70 int ret;
71
72 /* cancel any work waiting to be queued. */
73 ret = cancel_delayed_work(dwork);
74
75 /* if there was any work waiting then we run it now and
76 * wait for it's completion */
77 if (ret) {
78 schedule_delayed_work(dwork, 0);
79 flush_scheduled_work();
80 }
81 return ret;
82}
83
db2a4165
FM
84#ifdef CONFIG_SND_SOC_AC97_BUS
85/* unregister ac97 codec */
86static int soc_ac97_dev_unregister(struct snd_soc_codec *codec)
87{
88 if (codec->ac97->dev.bus)
89 device_unregister(&codec->ac97->dev);
90 return 0;
91}
92
93/* stop no dev release warning */
94static void soc_ac97_device_release(struct device *dev){}
95
96/* register ac97 codec to bus */
97static int soc_ac97_dev_register(struct snd_soc_codec *codec)
98{
99 int err;
100
101 codec->ac97->dev.bus = &ac97_bus_type;
4ac5c61f 102 codec->ac97->dev.parent = codec->card->dev;
db2a4165
FM
103 codec->ac97->dev.release = soc_ac97_device_release;
104
bb072bf0
KS
105 dev_set_name(&codec->ac97->dev, "%d-%d:%s",
106 codec->card->number, 0, codec->name);
db2a4165
FM
107 err = device_register(&codec->ac97->dev);
108 if (err < 0) {
109 snd_printk(KERN_ERR "Can't register ac97 bus\n");
110 codec->ac97->dev.bus = NULL;
111 return err;
112 }
113 return 0;
114}
115#endif
116
06f409d7
MB
117static int soc_pcm_apply_symmetry(struct snd_pcm_substream *substream)
118{
119 struct snd_soc_pcm_runtime *rtd = substream->private_data;
120 struct snd_soc_device *socdev = rtd->socdev;
121 struct snd_soc_card *card = socdev->card;
122 struct snd_soc_dai_link *machine = rtd->dai;
123 struct snd_soc_dai *cpu_dai = machine->cpu_dai;
124 struct snd_soc_dai *codec_dai = machine->codec_dai;
125 int ret;
126
127 if (codec_dai->symmetric_rates || cpu_dai->symmetric_rates ||
128 machine->symmetric_rates) {
129 dev_dbg(card->dev, "Symmetry forces %dHz rate\n",
130 machine->rate);
131
132 ret = snd_pcm_hw_constraint_minmax(substream->runtime,
133 SNDRV_PCM_HW_PARAM_RATE,
134 machine->rate,
135 machine->rate);
136 if (ret < 0) {
137 dev_err(card->dev,
138 "Unable to apply rate symmetry constraint: %d\n", ret);
139 return ret;
140 }
141 }
142
143 return 0;
144}
145
db2a4165
FM
146/*
147 * Called by ALSA when a PCM substream is opened, the runtime->hw record is
148 * then initialized and any private data can be allocated. This also calls
149 * startup for the cpu DAI, platform, machine and codec DAI.
150 */
151static int soc_pcm_open(struct snd_pcm_substream *substream)
152{
153 struct snd_soc_pcm_runtime *rtd = substream->private_data;
154 struct snd_soc_device *socdev = rtd->socdev;
87689d56 155 struct snd_soc_card *card = socdev->card;
db2a4165 156 struct snd_pcm_runtime *runtime = substream->runtime;
cb666e5b 157 struct snd_soc_dai_link *machine = rtd->dai;
87689d56 158 struct snd_soc_platform *platform = card->platform;
3c4b266f
LG
159 struct snd_soc_dai *cpu_dai = machine->cpu_dai;
160 struct snd_soc_dai *codec_dai = machine->codec_dai;
db2a4165
FM
161 int ret = 0;
162
163 mutex_lock(&pcm_mutex);
164
165 /* startup the audio subsystem */
6335d055
EM
166 if (cpu_dai->ops->startup) {
167 ret = cpu_dai->ops->startup(substream, cpu_dai);
db2a4165
FM
168 if (ret < 0) {
169 printk(KERN_ERR "asoc: can't open interface %s\n",
cb666e5b 170 cpu_dai->name);
db2a4165
FM
171 goto out;
172 }
173 }
174
175 if (platform->pcm_ops->open) {
176 ret = platform->pcm_ops->open(substream);
177 if (ret < 0) {
178 printk(KERN_ERR "asoc: can't open platform %s\n", platform->name);
179 goto platform_err;
180 }
181 }
182
6335d055
EM
183 if (codec_dai->ops->startup) {
184 ret = codec_dai->ops->startup(substream, codec_dai);
db2a4165 185 if (ret < 0) {
cb666e5b
LG
186 printk(KERN_ERR "asoc: can't open codec %s\n",
187 codec_dai->name);
188 goto codec_dai_err;
db2a4165
FM
189 }
190 }
191
cb666e5b
LG
192 if (machine->ops && machine->ops->startup) {
193 ret = machine->ops->startup(substream);
db2a4165 194 if (ret < 0) {
cb666e5b
LG
195 printk(KERN_ERR "asoc: %s startup failed\n", machine->name);
196 goto machine_err;
db2a4165
FM
197 }
198 }
199
db2a4165
FM
200 /* Check that the codec and cpu DAI's are compatible */
201 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
202 runtime->hw.rate_min =
3ff3f64b
MB
203 max(codec_dai->playback.rate_min,
204 cpu_dai->playback.rate_min);
db2a4165 205 runtime->hw.rate_max =
3ff3f64b
MB
206 min(codec_dai->playback.rate_max,
207 cpu_dai->playback.rate_max);
db2a4165 208 runtime->hw.channels_min =
cb666e5b
LG
209 max(codec_dai->playback.channels_min,
210 cpu_dai->playback.channels_min);
db2a4165 211 runtime->hw.channels_max =
cb666e5b
LG
212 min(codec_dai->playback.channels_max,
213 cpu_dai->playback.channels_max);
214 runtime->hw.formats =
215 codec_dai->playback.formats & cpu_dai->playback.formats;
216 runtime->hw.rates =
217 codec_dai->playback.rates & cpu_dai->playback.rates;
db2a4165
FM
218 } else {
219 runtime->hw.rate_min =
3ff3f64b
MB
220 max(codec_dai->capture.rate_min,
221 cpu_dai->capture.rate_min);
db2a4165 222 runtime->hw.rate_max =
3ff3f64b
MB
223 min(codec_dai->capture.rate_max,
224 cpu_dai->capture.rate_max);
db2a4165 225 runtime->hw.channels_min =
cb666e5b
LG
226 max(codec_dai->capture.channels_min,
227 cpu_dai->capture.channels_min);
db2a4165 228 runtime->hw.channels_max =
cb666e5b
LG
229 min(codec_dai->capture.channels_max,
230 cpu_dai->capture.channels_max);
231 runtime->hw.formats =
232 codec_dai->capture.formats & cpu_dai->capture.formats;
233 runtime->hw.rates =
234 codec_dai->capture.rates & cpu_dai->capture.rates;
db2a4165
FM
235 }
236
237 snd_pcm_limit_hw_rates(runtime);
238 if (!runtime->hw.rates) {
239 printk(KERN_ERR "asoc: %s <-> %s No matching rates\n",
cb666e5b
LG
240 codec_dai->name, cpu_dai->name);
241 goto machine_err;
db2a4165
FM
242 }
243 if (!runtime->hw.formats) {
244 printk(KERN_ERR "asoc: %s <-> %s No matching formats\n",
cb666e5b
LG
245 codec_dai->name, cpu_dai->name);
246 goto machine_err;
db2a4165
FM
247 }
248 if (!runtime->hw.channels_min || !runtime->hw.channels_max) {
249 printk(KERN_ERR "asoc: %s <-> %s No matching channels\n",
cb666e5b
LG
250 codec_dai->name, cpu_dai->name);
251 goto machine_err;
db2a4165
FM
252 }
253
06f409d7
MB
254 /* Symmetry only applies if we've already got an active stream. */
255 if (cpu_dai->active || codec_dai->active) {
256 ret = soc_pcm_apply_symmetry(substream);
257 if (ret != 0)
258 goto machine_err;
259 }
260
f24368c2
MB
261 pr_debug("asoc: %s <-> %s info:\n", codec_dai->name, cpu_dai->name);
262 pr_debug("asoc: rate mask 0x%x\n", runtime->hw.rates);
263 pr_debug("asoc: min ch %d max ch %d\n", runtime->hw.channels_min,
264 runtime->hw.channels_max);
265 pr_debug("asoc: min rate %d max rate %d\n", runtime->hw.rate_min,
266 runtime->hw.rate_max);
db2a4165 267
db2a4165 268 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
cb666e5b 269 cpu_dai->playback.active = codec_dai->playback.active = 1;
db2a4165 270 else
cb666e5b
LG
271 cpu_dai->capture.active = codec_dai->capture.active = 1;
272 cpu_dai->active = codec_dai->active = 1;
273 cpu_dai->runtime = runtime;
6627a653 274 card->codec->active++;
db2a4165
FM
275 mutex_unlock(&pcm_mutex);
276 return 0;
277
cb666e5b 278machine_err:
db2a4165
FM
279 if (machine->ops && machine->ops->shutdown)
280 machine->ops->shutdown(substream);
281
cb666e5b 282codec_dai_err:
db2a4165
FM
283 if (platform->pcm_ops->close)
284 platform->pcm_ops->close(substream);
285
286platform_err:
6335d055
EM
287 if (cpu_dai->ops->shutdown)
288 cpu_dai->ops->shutdown(substream, cpu_dai);
db2a4165
FM
289out:
290 mutex_unlock(&pcm_mutex);
291 return ret;
292}
293
294/*
3a4fa0a2 295 * Power down the audio subsystem pmdown_time msecs after close is called.
db2a4165
FM
296 * This is to ensure there are no pops or clicks in between any music tracks
297 * due to DAPM power cycling.
298 */
4484bb2e 299static void close_delayed_work(struct work_struct *work)
db2a4165 300{
6308419a
MB
301 struct snd_soc_card *card = container_of(work, struct snd_soc_card,
302 delayed_work.work);
6627a653 303 struct snd_soc_codec *codec = card->codec;
3c4b266f 304 struct snd_soc_dai *codec_dai;
db2a4165
FM
305 int i;
306
307 mutex_lock(&pcm_mutex);
3ff3f64b 308 for (i = 0; i < codec->num_dai; i++) {
db2a4165
FM
309 codec_dai = &codec->dai[i];
310
f24368c2
MB
311 pr_debug("pop wq checking: %s status: %s waiting: %s\n",
312 codec_dai->playback.stream_name,
313 codec_dai->playback.active ? "active" : "inactive",
314 codec_dai->pop_wait ? "yes" : "no");
db2a4165
FM
315
316 /* are we waiting on this codec DAI stream */
317 if (codec_dai->pop_wait == 1) {
db2a4165 318 codec_dai->pop_wait = 0;
0b4d221b
LG
319 snd_soc_dapm_stream_event(codec,
320 codec_dai->playback.stream_name,
db2a4165 321 SND_SOC_DAPM_STREAM_STOP);
db2a4165
FM
322 }
323 }
324 mutex_unlock(&pcm_mutex);
325}
326
327/*
328 * Called by ALSA when a PCM substream is closed. Private data can be
329 * freed here. The cpu DAI, codec DAI, machine and platform are also
330 * shutdown.
331 */
332static int soc_codec_close(struct snd_pcm_substream *substream)
333{
334 struct snd_soc_pcm_runtime *rtd = substream->private_data;
335 struct snd_soc_device *socdev = rtd->socdev;
6308419a 336 struct snd_soc_card *card = socdev->card;
cb666e5b 337 struct snd_soc_dai_link *machine = rtd->dai;
87689d56 338 struct snd_soc_platform *platform = card->platform;
3c4b266f
LG
339 struct snd_soc_dai *cpu_dai = machine->cpu_dai;
340 struct snd_soc_dai *codec_dai = machine->codec_dai;
6627a653 341 struct snd_soc_codec *codec = card->codec;
db2a4165
FM
342
343 mutex_lock(&pcm_mutex);
344
345 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
cb666e5b 346 cpu_dai->playback.active = codec_dai->playback.active = 0;
db2a4165 347 else
cb666e5b 348 cpu_dai->capture.active = codec_dai->capture.active = 0;
db2a4165 349
cb666e5b
LG
350 if (codec_dai->playback.active == 0 &&
351 codec_dai->capture.active == 0) {
352 cpu_dai->active = codec_dai->active = 0;
db2a4165
FM
353 }
354 codec->active--;
355
6010b2da
MB
356 /* Muting the DAC suppresses artifacts caused during digital
357 * shutdown, for example from stopping clocks.
358 */
359 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
360 snd_soc_dai_digital_mute(codec_dai, 1);
361
6335d055
EM
362 if (cpu_dai->ops->shutdown)
363 cpu_dai->ops->shutdown(substream, cpu_dai);
db2a4165 364
6335d055
EM
365 if (codec_dai->ops->shutdown)
366 codec_dai->ops->shutdown(substream, codec_dai);
db2a4165
FM
367
368 if (machine->ops && machine->ops->shutdown)
369 machine->ops->shutdown(substream);
370
371 if (platform->pcm_ops->close)
372 platform->pcm_ops->close(substream);
cb666e5b 373 cpu_dai->runtime = NULL;
db2a4165
FM
374
375 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
376 /* start delayed pop wq here for playback streams */
cb666e5b 377 codec_dai->pop_wait = 1;
6308419a 378 schedule_delayed_work(&card->delayed_work,
db2a4165
FM
379 msecs_to_jiffies(pmdown_time));
380 } else {
381 /* capture streams can be powered down now */
cb666e5b 382 snd_soc_dapm_stream_event(codec,
0b4d221b
LG
383 codec_dai->capture.stream_name,
384 SND_SOC_DAPM_STREAM_STOP);
db2a4165
FM
385 }
386
387 mutex_unlock(&pcm_mutex);
388 return 0;
389}
390
391/*
392 * Called by ALSA when the PCM substream is prepared, can set format, sample
393 * rate, etc. This function is non atomic and can be called multiple times,
394 * it can refer to the runtime info.
395 */
396static int soc_pcm_prepare(struct snd_pcm_substream *substream)
397{
398 struct snd_soc_pcm_runtime *rtd = substream->private_data;
399 struct snd_soc_device *socdev = rtd->socdev;
6308419a 400 struct snd_soc_card *card = socdev->card;
cb666e5b 401 struct snd_soc_dai_link *machine = rtd->dai;
87689d56 402 struct snd_soc_platform *platform = card->platform;
3c4b266f
LG
403 struct snd_soc_dai *cpu_dai = machine->cpu_dai;
404 struct snd_soc_dai *codec_dai = machine->codec_dai;
6627a653 405 struct snd_soc_codec *codec = card->codec;
db2a4165
FM
406 int ret = 0;
407
408 mutex_lock(&pcm_mutex);
cb666e5b
LG
409
410 if (machine->ops && machine->ops->prepare) {
411 ret = machine->ops->prepare(substream);
412 if (ret < 0) {
413 printk(KERN_ERR "asoc: machine prepare error\n");
414 goto out;
415 }
416 }
417
db2a4165
FM
418 if (platform->pcm_ops->prepare) {
419 ret = platform->pcm_ops->prepare(substream);
a71a468a
LG
420 if (ret < 0) {
421 printk(KERN_ERR "asoc: platform prepare error\n");
db2a4165 422 goto out;
a71a468a 423 }
db2a4165
FM
424 }
425
6335d055
EM
426 if (codec_dai->ops->prepare) {
427 ret = codec_dai->ops->prepare(substream, codec_dai);
a71a468a
LG
428 if (ret < 0) {
429 printk(KERN_ERR "asoc: codec DAI prepare error\n");
db2a4165 430 goto out;
a71a468a 431 }
db2a4165
FM
432 }
433
6335d055
EM
434 if (cpu_dai->ops->prepare) {
435 ret = cpu_dai->ops->prepare(substream, cpu_dai);
cb666e5b
LG
436 if (ret < 0) {
437 printk(KERN_ERR "asoc: cpu DAI prepare error\n");
438 goto out;
439 }
440 }
db2a4165 441
d45f6219
MB
442 /* cancel any delayed stream shutdown that is pending */
443 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
444 codec_dai->pop_wait) {
445 codec_dai->pop_wait = 0;
6308419a 446 cancel_delayed_work(&card->delayed_work);
d45f6219 447 }
db2a4165 448
452c5eaa
MB
449 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
450 snd_soc_dapm_stream_event(codec,
451 codec_dai->playback.stream_name,
452 SND_SOC_DAPM_STREAM_START);
453 else
454 snd_soc_dapm_stream_event(codec,
455 codec_dai->capture.stream_name,
456 SND_SOC_DAPM_STREAM_START);
8c6529db 457
452c5eaa 458 snd_soc_dai_digital_mute(codec_dai, 0);
db2a4165
FM
459
460out:
461 mutex_unlock(&pcm_mutex);
462 return ret;
463}
464
465/*
466 * Called by ALSA when the hardware params are set by application. This
467 * function can also be called multiple times and can allocate buffers
468 * (using snd_pcm_lib_* ). It's non-atomic.
469 */
470static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
471 struct snd_pcm_hw_params *params)
472{
473 struct snd_soc_pcm_runtime *rtd = substream->private_data;
474 struct snd_soc_device *socdev = rtd->socdev;
cb666e5b 475 struct snd_soc_dai_link *machine = rtd->dai;
87689d56
MB
476 struct snd_soc_card *card = socdev->card;
477 struct snd_soc_platform *platform = card->platform;
3c4b266f
LG
478 struct snd_soc_dai *cpu_dai = machine->cpu_dai;
479 struct snd_soc_dai *codec_dai = machine->codec_dai;
db2a4165
FM
480 int ret = 0;
481
482 mutex_lock(&pcm_mutex);
483
cb666e5b
LG
484 if (machine->ops && machine->ops->hw_params) {
485 ret = machine->ops->hw_params(substream, params);
486 if (ret < 0) {
487 printk(KERN_ERR "asoc: machine hw_params failed\n");
db2a4165 488 goto out;
cb666e5b 489 }
db2a4165
FM
490 }
491
6335d055
EM
492 if (codec_dai->ops->hw_params) {
493 ret = codec_dai->ops->hw_params(substream, params, codec_dai);
db2a4165
FM
494 if (ret < 0) {
495 printk(KERN_ERR "asoc: can't set codec %s hw params\n",
cb666e5b
LG
496 codec_dai->name);
497 goto codec_err;
db2a4165
FM
498 }
499 }
500
6335d055
EM
501 if (cpu_dai->ops->hw_params) {
502 ret = cpu_dai->ops->hw_params(substream, params, cpu_dai);
db2a4165 503 if (ret < 0) {
3ff3f64b 504 printk(KERN_ERR "asoc: interface %s hw params failed\n",
cb666e5b 505 cpu_dai->name);
db2a4165
FM
506 goto interface_err;
507 }
508 }
509
510 if (platform->pcm_ops->hw_params) {
511 ret = platform->pcm_ops->hw_params(substream, params);
512 if (ret < 0) {
3ff3f64b 513 printk(KERN_ERR "asoc: platform %s hw params failed\n",
db2a4165
FM
514 platform->name);
515 goto platform_err;
516 }
517 }
518
06f409d7
MB
519 machine->rate = params_rate(params);
520
db2a4165
FM
521out:
522 mutex_unlock(&pcm_mutex);
523 return ret;
524
db2a4165 525platform_err:
6335d055
EM
526 if (cpu_dai->ops->hw_free)
527 cpu_dai->ops->hw_free(substream, cpu_dai);
db2a4165
FM
528
529interface_err:
6335d055
EM
530 if (codec_dai->ops->hw_free)
531 codec_dai->ops->hw_free(substream, codec_dai);
cb666e5b
LG
532
533codec_err:
3ff3f64b 534 if (machine->ops && machine->ops->hw_free)
cb666e5b 535 machine->ops->hw_free(substream);
db2a4165
FM
536
537 mutex_unlock(&pcm_mutex);
538 return ret;
539}
540
541/*
542 * Free's resources allocated by hw_params, can be called multiple times
543 */
544static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
545{
546 struct snd_soc_pcm_runtime *rtd = substream->private_data;
547 struct snd_soc_device *socdev = rtd->socdev;
cb666e5b 548 struct snd_soc_dai_link *machine = rtd->dai;
87689d56
MB
549 struct snd_soc_card *card = socdev->card;
550 struct snd_soc_platform *platform = card->platform;
3c4b266f
LG
551 struct snd_soc_dai *cpu_dai = machine->cpu_dai;
552 struct snd_soc_dai *codec_dai = machine->codec_dai;
6627a653 553 struct snd_soc_codec *codec = card->codec;
db2a4165
FM
554
555 mutex_lock(&pcm_mutex);
556
557 /* apply codec digital mute */
8c6529db
LG
558 if (!codec->active)
559 snd_soc_dai_digital_mute(codec_dai, 1);
db2a4165
FM
560
561 /* free any machine hw params */
562 if (machine->ops && machine->ops->hw_free)
563 machine->ops->hw_free(substream);
564
565 /* free any DMA resources */
566 if (platform->pcm_ops->hw_free)
567 platform->pcm_ops->hw_free(substream);
568
569 /* now free hw params for the DAI's */
6335d055
EM
570 if (codec_dai->ops->hw_free)
571 codec_dai->ops->hw_free(substream, codec_dai);
db2a4165 572
6335d055
EM
573 if (cpu_dai->ops->hw_free)
574 cpu_dai->ops->hw_free(substream, cpu_dai);
db2a4165
FM
575
576 mutex_unlock(&pcm_mutex);
577 return 0;
578}
579
580static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
581{
582 struct snd_soc_pcm_runtime *rtd = substream->private_data;
583 struct snd_soc_device *socdev = rtd->socdev;
87689d56 584 struct snd_soc_card *card= socdev->card;
cb666e5b 585 struct snd_soc_dai_link *machine = rtd->dai;
87689d56 586 struct snd_soc_platform *platform = card->platform;
3c4b266f
LG
587 struct snd_soc_dai *cpu_dai = machine->cpu_dai;
588 struct snd_soc_dai *codec_dai = machine->codec_dai;
db2a4165
FM
589 int ret;
590
6335d055
EM
591 if (codec_dai->ops->trigger) {
592 ret = codec_dai->ops->trigger(substream, cmd, codec_dai);
db2a4165
FM
593 if (ret < 0)
594 return ret;
595 }
596
597 if (platform->pcm_ops->trigger) {
598 ret = platform->pcm_ops->trigger(substream, cmd);
599 if (ret < 0)
600 return ret;
601 }
602
6335d055
EM
603 if (cpu_dai->ops->trigger) {
604 ret = cpu_dai->ops->trigger(substream, cmd, cpu_dai);
db2a4165
FM
605 if (ret < 0)
606 return ret;
607 }
608 return 0;
609}
610
611/* ASoC PCM operations */
612static struct snd_pcm_ops soc_pcm_ops = {
613 .open = soc_pcm_open,
614 .close = soc_codec_close,
615 .hw_params = soc_pcm_hw_params,
616 .hw_free = soc_pcm_hw_free,
617 .prepare = soc_pcm_prepare,
618 .trigger = soc_pcm_trigger,
619};
620
621#ifdef CONFIG_PM
622/* powers down audio subsystem for suspend */
416356fc 623static int soc_suspend(struct device *dev)
db2a4165 624{
416356fc 625 struct platform_device *pdev = to_platform_device(dev);
3ff3f64b 626 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
87506549 627 struct snd_soc_card *card = socdev->card;
87689d56 628 struct snd_soc_platform *platform = card->platform;
3ff3f64b 629 struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
6627a653 630 struct snd_soc_codec *codec = card->codec;
db2a4165
FM
631 int i;
632
e3509ff0
DM
633 /* If the initialization of this soc device failed, there is no codec
634 * associated with it. Just bail out in this case.
635 */
636 if (!codec)
637 return 0;
638
6ed25978
AG
639 /* Due to the resume being scheduled into a workqueue we could
640 * suspend before that's finished - wait for it to complete.
641 */
642 snd_power_lock(codec->card);
643 snd_power_wait(codec->card, SNDRV_CTL_POWER_D0);
644 snd_power_unlock(codec->card);
645
646 /* we're going to block userspace touching us until resume completes */
647 snd_power_change_state(codec->card, SNDRV_CTL_POWER_D3hot);
648
db2a4165 649 /* mute any active DAC's */
dee89c4d
MB
650 for (i = 0; i < card->num_links; i++) {
651 struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
6335d055
EM
652 if (dai->ops->digital_mute && dai->playback.active)
653 dai->ops->digital_mute(dai, 1);
db2a4165
FM
654 }
655
4ccab3e7 656 /* suspend all pcms */
87506549
MB
657 for (i = 0; i < card->num_links; i++)
658 snd_pcm_suspend_all(card->dai_link[i].pcm);
4ccab3e7 659
87506549 660 if (card->suspend_pre)
416356fc 661 card->suspend_pre(pdev, PMSG_SUSPEND);
db2a4165 662
87506549
MB
663 for (i = 0; i < card->num_links; i++) {
664 struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
3ba9e10a 665 if (cpu_dai->suspend && !cpu_dai->ac97_control)
dc7d7b83 666 cpu_dai->suspend(cpu_dai);
db2a4165 667 if (platform->suspend)
07c84d04 668 platform->suspend(cpu_dai);
db2a4165
FM
669 }
670
671 /* close any waiting streams and save state */
6308419a 672 run_delayed_work(&card->delayed_work);
0be9898a 673 codec->suspend_bias_level = codec->bias_level;
db2a4165 674
3ff3f64b 675 for (i = 0; i < codec->num_dai; i++) {
db2a4165
FM
676 char *stream = codec->dai[i].playback.stream_name;
677 if (stream != NULL)
678 snd_soc_dapm_stream_event(codec, stream,
679 SND_SOC_DAPM_STREAM_SUSPEND);
680 stream = codec->dai[i].capture.stream_name;
681 if (stream != NULL)
682 snd_soc_dapm_stream_event(codec, stream,
683 SND_SOC_DAPM_STREAM_SUSPEND);
684 }
685
686 if (codec_dev->suspend)
416356fc 687 codec_dev->suspend(pdev, PMSG_SUSPEND);
db2a4165 688
87506549
MB
689 for (i = 0; i < card->num_links; i++) {
690 struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
3ba9e10a 691 if (cpu_dai->suspend && cpu_dai->ac97_control)
dc7d7b83 692 cpu_dai->suspend(cpu_dai);
db2a4165
FM
693 }
694
87506549 695 if (card->suspend_post)
416356fc 696 card->suspend_post(pdev, PMSG_SUSPEND);
db2a4165
FM
697
698 return 0;
699}
700
6ed25978
AG
701/* deferred resume work, so resume can complete before we finished
702 * setting our codec back up, which can be very slow on I2C
703 */
704static void soc_resume_deferred(struct work_struct *work)
db2a4165 705{
6308419a
MB
706 struct snd_soc_card *card = container_of(work,
707 struct snd_soc_card,
708 deferred_resume_work);
709 struct snd_soc_device *socdev = card->socdev;
87689d56 710 struct snd_soc_platform *platform = card->platform;
3ff3f64b 711 struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
6627a653 712 struct snd_soc_codec *codec = card->codec;
6ed25978 713 struct platform_device *pdev = to_platform_device(socdev->dev);
db2a4165
FM
714 int i;
715
6ed25978
AG
716 /* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
717 * so userspace apps are blocked from touching us
718 */
719
fde22f27 720 dev_dbg(socdev->dev, "starting resume work\n");
6ed25978 721
87506549
MB
722 if (card->resume_pre)
723 card->resume_pre(pdev);
db2a4165 724
87506549
MB
725 for (i = 0; i < card->num_links; i++) {
726 struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
3ba9e10a 727 if (cpu_dai->resume && cpu_dai->ac97_control)
dc7d7b83 728 cpu_dai->resume(cpu_dai);
db2a4165
FM
729 }
730
731 if (codec_dev->resume)
732 codec_dev->resume(pdev);
733
3ff3f64b
MB
734 for (i = 0; i < codec->num_dai; i++) {
735 char *stream = codec->dai[i].playback.stream_name;
db2a4165
FM
736 if (stream != NULL)
737 snd_soc_dapm_stream_event(codec, stream,
738 SND_SOC_DAPM_STREAM_RESUME);
739 stream = codec->dai[i].capture.stream_name;
740 if (stream != NULL)
741 snd_soc_dapm_stream_event(codec, stream,
742 SND_SOC_DAPM_STREAM_RESUME);
743 }
744
3ff3f64b 745 /* unmute any active DACs */
dee89c4d
MB
746 for (i = 0; i < card->num_links; i++) {
747 struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
6335d055
EM
748 if (dai->ops->digital_mute && dai->playback.active)
749 dai->ops->digital_mute(dai, 0);
db2a4165
FM
750 }
751
87506549
MB
752 for (i = 0; i < card->num_links; i++) {
753 struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
3ba9e10a 754 if (cpu_dai->resume && !cpu_dai->ac97_control)
dc7d7b83 755 cpu_dai->resume(cpu_dai);
db2a4165 756 if (platform->resume)
07c84d04 757 platform->resume(cpu_dai);
db2a4165
FM
758 }
759
87506549
MB
760 if (card->resume_post)
761 card->resume_post(pdev);
db2a4165 762
fde22f27 763 dev_dbg(socdev->dev, "resume work completed\n");
6ed25978
AG
764
765 /* userspace can access us now we are back as we were before */
766 snd_power_change_state(codec->card, SNDRV_CTL_POWER_D0);
767}
768
769/* powers up audio subsystem after a suspend */
416356fc 770static int soc_resume(struct device *dev)
6ed25978 771{
416356fc 772 struct platform_device *pdev = to_platform_device(dev);
6ed25978 773 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
6308419a 774 struct snd_soc_card *card = socdev->card;
64ab9baa 775 struct snd_soc_dai *cpu_dai = card->dai_link[0].cpu_dai;
6ed25978 776
64ab9baa
MB
777 /* AC97 devices might have other drivers hanging off them so
778 * need to resume immediately. Other drivers don't have that
779 * problem and may take a substantial amount of time to resume
780 * due to I/O costs and anti-pop so handle them out of line.
781 */
782 if (cpu_dai->ac97_control) {
783 dev_dbg(socdev->dev, "Resuming AC97 immediately\n");
784 soc_resume_deferred(&card->deferred_resume_work);
785 } else {
786 dev_dbg(socdev->dev, "Scheduling resume work\n");
787 if (!schedule_work(&card->deferred_resume_work))
788 dev_err(socdev->dev, "resume work item may be lost\n");
789 }
6ed25978 790
db2a4165
FM
791 return 0;
792}
db2a4165
FM
793#else
794#define soc_suspend NULL
795#define soc_resume NULL
796#endif
797
02a06d30
BS
798static struct snd_soc_dai_ops null_dai_ops = {
799};
800
435c5e25 801static void snd_soc_instantiate_card(struct snd_soc_card *card)
db2a4165 802{
435c5e25
MB
803 struct platform_device *pdev = container_of(card->dev,
804 struct platform_device,
805 dev);
806 struct snd_soc_codec_device *codec_dev = card->socdev->codec_dev;
807 struct snd_soc_platform *platform;
808 struct snd_soc_dai *dai;
6b05eda6 809 int i, found, ret, ac97;
435c5e25
MB
810
811 if (card->instantiated)
812 return;
813
814 found = 0;
815 list_for_each_entry(platform, &platform_list, list)
816 if (card->platform == platform) {
817 found = 1;
818 break;
819 }
820 if (!found) {
821 dev_dbg(card->dev, "Platform %s not registered\n",
822 card->platform->name);
823 return;
824 }
6308419a 825
6b05eda6 826 ac97 = 0;
435c5e25
MB
827 for (i = 0; i < card->num_links; i++) {
828 found = 0;
829 list_for_each_entry(dai, &dai_list, list)
830 if (card->dai_link[i].cpu_dai == dai) {
831 found = 1;
832 break;
833 }
834 if (!found) {
835 dev_dbg(card->dev, "DAI %s not registered\n",
836 card->dai_link[i].cpu_dai->name);
837 return;
838 }
6b05eda6
MB
839
840 if (card->dai_link[i].cpu_dai->ac97_control)
841 ac97 = 1;
c5af3a2e
MB
842 }
843
02a06d30
BS
844 for (i = 0; i < card->num_links; i++) {
845 if (!card->dai_link[i].codec_dai->ops)
846 card->dai_link[i].codec_dai->ops = &null_dai_ops;
847 }
848
6b05eda6
MB
849 /* If we have AC97 in the system then don't wait for the
850 * codec. This will need revisiting if we have to handle
851 * systems with mixed AC97 and non-AC97 parts. Only check for
852 * DAIs currently; we can't do this per link since some AC97
853 * codecs have non-AC97 DAIs.
854 */
855 if (!ac97)
856 for (i = 0; i < card->num_links; i++) {
857 found = 0;
858 list_for_each_entry(dai, &dai_list, list)
859 if (card->dai_link[i].codec_dai == dai) {
860 found = 1;
861 break;
862 }
863 if (!found) {
864 dev_dbg(card->dev, "DAI %s not registered\n",
865 card->dai_link[i].codec_dai->name);
866 return;
867 }
868 }
869
435c5e25
MB
870 /* Note that we do not current check for codec components */
871
872 dev_dbg(card->dev, "All components present, instantiating\n");
873
874 /* Found everything, bring it up */
87506549
MB
875 if (card->probe) {
876 ret = card->probe(pdev);
3ff3f64b 877 if (ret < 0)
435c5e25 878 return;
db2a4165
FM
879 }
880
87506549
MB
881 for (i = 0; i < card->num_links; i++) {
882 struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
db2a4165 883 if (cpu_dai->probe) {
bdb92876 884 ret = cpu_dai->probe(pdev, cpu_dai);
3ff3f64b 885 if (ret < 0)
db2a4165
FM
886 goto cpu_dai_err;
887 }
888 }
889
890 if (codec_dev->probe) {
891 ret = codec_dev->probe(pdev);
3ff3f64b 892 if (ret < 0)
db2a4165
FM
893 goto cpu_dai_err;
894 }
895
896 if (platform->probe) {
897 ret = platform->probe(pdev);
3ff3f64b 898 if (ret < 0)
db2a4165
FM
899 goto platform_err;
900 }
901
902 /* DAPM stream work */
6308419a 903 INIT_DELAYED_WORK(&card->delayed_work, close_delayed_work);
1301a964 904#ifdef CONFIG_PM
6ed25978 905 /* deferred resume work */
6308419a 906 INIT_WORK(&card->deferred_resume_work, soc_resume_deferred);
1301a964 907#endif
6ed25978 908
435c5e25
MB
909 card->instantiated = 1;
910
911 return;
db2a4165 912
db2a4165
FM
913platform_err:
914 if (codec_dev->remove)
915 codec_dev->remove(pdev);
916
917cpu_dai_err:
18b9b3d9 918 for (i--; i >= 0; i--) {
87506549 919 struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
db2a4165 920 if (cpu_dai->remove)
bdb92876 921 cpu_dai->remove(pdev, cpu_dai);
db2a4165
FM
922 }
923
87506549
MB
924 if (card->remove)
925 card->remove(pdev);
435c5e25 926}
db2a4165 927
435c5e25
MB
928/*
929 * Attempt to initialise any uninitalised cards. Must be called with
930 * client_mutex.
931 */
932static void snd_soc_instantiate_cards(void)
933{
934 struct snd_soc_card *card;
935 list_for_each_entry(card, &card_list, list)
936 snd_soc_instantiate_card(card);
937}
938
939/* probes a new socdev */
940static int soc_probe(struct platform_device *pdev)
941{
942 int ret = 0;
943 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
944 struct snd_soc_card *card = socdev->card;
945
946 /* Bodge while we push things out of socdev */
947 card->socdev = socdev;
948
949 /* Bodge while we unpick instantiation */
950 card->dev = &pdev->dev;
951 ret = snd_soc_register_card(card);
952 if (ret != 0) {
953 dev_err(&pdev->dev, "Failed to register card\n");
954 return ret;
955 }
956
957 return 0;
db2a4165
FM
958}
959
960/* removes a socdev */
961static int soc_remove(struct platform_device *pdev)
962{
963 int i;
964 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
87506549 965 struct snd_soc_card *card = socdev->card;
87689d56 966 struct snd_soc_platform *platform = card->platform;
db2a4165
FM
967 struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
968
914dc182
MR
969 if (!card->instantiated)
970 return 0;
971
6308419a 972 run_delayed_work(&card->delayed_work);
965ac42c 973
db2a4165
FM
974 if (platform->remove)
975 platform->remove(pdev);
976
977 if (codec_dev->remove)
978 codec_dev->remove(pdev);
979
87506549
MB
980 for (i = 0; i < card->num_links; i++) {
981 struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
db2a4165 982 if (cpu_dai->remove)
bdb92876 983 cpu_dai->remove(pdev, cpu_dai);
db2a4165
FM
984 }
985
87506549
MB
986 if (card->remove)
987 card->remove(pdev);
db2a4165 988
c5af3a2e
MB
989 snd_soc_unregister_card(card);
990
db2a4165
FM
991 return 0;
992}
993
416356fc 994static int soc_poweroff(struct device *dev)
51737470 995{
416356fc 996 struct platform_device *pdev = to_platform_device(dev);
51737470
MB
997 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
998 struct snd_soc_card *card = socdev->card;
999
1000 if (!card->instantiated)
416356fc 1001 return 0;
51737470
MB
1002
1003 /* Flush out pmdown_time work - we actually do want to run it
1004 * now, we're shutting down so no imminent restart. */
1005 run_delayed_work(&card->delayed_work);
1006
1007 snd_soc_dapm_shutdown(socdev);
416356fc
MB
1008
1009 return 0;
51737470
MB
1010}
1011
416356fc
MB
1012static struct dev_pm_ops soc_pm_ops = {
1013 .suspend = soc_suspend,
1014 .resume = soc_resume,
1015 .poweroff = soc_poweroff,
1016};
1017
db2a4165
FM
1018/* ASoC platform driver */
1019static struct platform_driver soc_driver = {
1020 .driver = {
1021 .name = "soc-audio",
8b45a209 1022 .owner = THIS_MODULE,
416356fc 1023 .pm = &soc_pm_ops,
db2a4165
FM
1024 },
1025 .probe = soc_probe,
1026 .remove = soc_remove,
db2a4165
FM
1027};
1028
1029/* create a new pcm */
1030static int soc_new_pcm(struct snd_soc_device *socdev,
1031 struct snd_soc_dai_link *dai_link, int num)
1032{
87689d56 1033 struct snd_soc_card *card = socdev->card;
6627a653 1034 struct snd_soc_codec *codec = card->codec;
87689d56 1035 struct snd_soc_platform *platform = card->platform;
3c4b266f
LG
1036 struct snd_soc_dai *codec_dai = dai_link->codec_dai;
1037 struct snd_soc_dai *cpu_dai = dai_link->cpu_dai;
db2a4165
FM
1038 struct snd_soc_pcm_runtime *rtd;
1039 struct snd_pcm *pcm;
1040 char new_name[64];
1041 int ret = 0, playback = 0, capture = 0;
1042
1043 rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL);
1044 if (rtd == NULL)
1045 return -ENOMEM;
cb666e5b
LG
1046
1047 rtd->dai = dai_link;
db2a4165 1048 rtd->socdev = socdev;
6627a653 1049 codec_dai->codec = card->codec;
db2a4165
FM
1050
1051 /* check client and interface hw capabilities */
3ba9e10a
MB
1052 sprintf(new_name, "%s %s-%d", dai_link->stream_name, codec_dai->name,
1053 num);
db2a4165
FM
1054
1055 if (codec_dai->playback.channels_min)
1056 playback = 1;
1057 if (codec_dai->capture.channels_min)
1058 capture = 1;
1059
1060 ret = snd_pcm_new(codec->card, new_name, codec->pcm_devs++, playback,
1061 capture, &pcm);
1062 if (ret < 0) {
3ff3f64b
MB
1063 printk(KERN_ERR "asoc: can't create pcm for codec %s\n",
1064 codec->name);
db2a4165
FM
1065 kfree(rtd);
1066 return ret;
1067 }
1068
4ccab3e7 1069 dai_link->pcm = pcm;
db2a4165 1070 pcm->private_data = rtd;
87689d56
MB
1071 soc_pcm_ops.mmap = platform->pcm_ops->mmap;
1072 soc_pcm_ops.pointer = platform->pcm_ops->pointer;
1073 soc_pcm_ops.ioctl = platform->pcm_ops->ioctl;
1074 soc_pcm_ops.copy = platform->pcm_ops->copy;
1075 soc_pcm_ops.silence = platform->pcm_ops->silence;
1076 soc_pcm_ops.ack = platform->pcm_ops->ack;
1077 soc_pcm_ops.page = platform->pcm_ops->page;
db2a4165
FM
1078
1079 if (playback)
1080 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops);
1081
1082 if (capture)
1083 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops);
1084
87689d56 1085 ret = platform->pcm_new(codec->card, codec_dai, pcm);
db2a4165
FM
1086 if (ret < 0) {
1087 printk(KERN_ERR "asoc: platform pcm constructor failed\n");
1088 kfree(rtd);
1089 return ret;
1090 }
1091
87689d56 1092 pcm->private_free = platform->pcm_free;
db2a4165
FM
1093 printk(KERN_INFO "asoc: %s <-> %s mapping ok\n", codec_dai->name,
1094 cpu_dai->name);
1095 return ret;
1096}
1097
096e49d5
MB
1098/**
1099 * snd_soc_codec_volatile_register: Report if a register is volatile.
1100 *
1101 * @codec: CODEC to query.
1102 * @reg: Register to query.
1103 *
1104 * Boolean function indiciating if a CODEC register is volatile.
1105 */
1106int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg)
1107{
1108 if (codec->volatile_register)
1109 return codec->volatile_register(reg);
1110 else
1111 return 0;
1112}
1113EXPORT_SYMBOL_GPL(snd_soc_codec_volatile_register);
1114
db2a4165 1115/* codec register dump */
6627a653 1116static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf)
db2a4165 1117{
db2a4165
FM
1118 int i, step = 1, count = 0;
1119
1120 if (!codec->reg_cache_size)
1121 return 0;
1122
1123 if (codec->reg_cache_step)
1124 step = codec->reg_cache_step;
1125
1126 count += sprintf(buf, "%s registers\n", codec->name);
58cd33c0 1127 for (i = 0; i < codec->reg_cache_size; i += step) {
77ee09c6
MB
1128 if (codec->readable_register && !codec->readable_register(i))
1129 continue;
1130
58cd33c0
MB
1131 count += sprintf(buf + count, "%2x: ", i);
1132 if (count >= PAGE_SIZE - 1)
1133 break;
1134
1135 if (codec->display_register)
1136 count += codec->display_register(codec, buf + count,
1137 PAGE_SIZE - count, i);
1138 else
1139 count += snprintf(buf + count, PAGE_SIZE - count,
1140 "%4x", codec->read(codec, i));
1141
1142 if (count >= PAGE_SIZE - 1)
1143 break;
1144
1145 count += snprintf(buf + count, PAGE_SIZE - count, "\n");
1146 if (count >= PAGE_SIZE - 1)
1147 break;
1148 }
1149
1150 /* Truncate count; min() would cause a warning */
1151 if (count >= PAGE_SIZE)
1152 count = PAGE_SIZE - 1;
db2a4165
FM
1153
1154 return count;
1155}
12ef193d
TK
1156static ssize_t codec_reg_show(struct device *dev,
1157 struct device_attribute *attr, char *buf)
1158{
1159 struct snd_soc_device *devdata = dev_get_drvdata(dev);
6627a653 1160 return soc_codec_reg_show(devdata->card->codec, buf);
12ef193d
TK
1161}
1162
db2a4165
FM
1163static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL);
1164
12ef193d
TK
1165#ifdef CONFIG_DEBUG_FS
1166static int codec_reg_open_file(struct inode *inode, struct file *file)
1167{
1168 file->private_data = inode->i_private;
1169 return 0;
1170}
1171
1172static ssize_t codec_reg_read_file(struct file *file, char __user *user_buf,
1173 size_t count, loff_t *ppos)
1174{
1175 ssize_t ret;
384c89e2 1176 struct snd_soc_codec *codec = file->private_data;
12ef193d
TK
1177 char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
1178 if (!buf)
1179 return -ENOMEM;
6627a653 1180 ret = soc_codec_reg_show(codec, buf);
12ef193d
TK
1181 if (ret >= 0)
1182 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
1183 kfree(buf);
1184 return ret;
1185}
1186
1187static ssize_t codec_reg_write_file(struct file *file,
1188 const char __user *user_buf, size_t count, loff_t *ppos)
1189{
1190 char buf[32];
1191 int buf_size;
1192 char *start = buf;
1193 unsigned long reg, value;
1194 int step = 1;
384c89e2 1195 struct snd_soc_codec *codec = file->private_data;
12ef193d
TK
1196
1197 buf_size = min(count, (sizeof(buf)-1));
1198 if (copy_from_user(buf, user_buf, buf_size))
1199 return -EFAULT;
1200 buf[buf_size] = 0;
1201
1202 if (codec->reg_cache_step)
1203 step = codec->reg_cache_step;
1204
1205 while (*start == ' ')
1206 start++;
1207 reg = simple_strtoul(start, &start, 16);
1208 if ((reg >= codec->reg_cache_size) || (reg % step))
1209 return -EINVAL;
1210 while (*start == ' ')
1211 start++;
1212 if (strict_strtoul(start, 16, &value))
1213 return -EINVAL;
1214 codec->write(codec, reg, value);
1215 return buf_size;
1216}
1217
1218static const struct file_operations codec_reg_fops = {
1219 .open = codec_reg_open_file,
1220 .read = codec_reg_read_file,
1221 .write = codec_reg_write_file,
1222};
1223
384c89e2 1224static void soc_init_codec_debugfs(struct snd_soc_codec *codec)
12ef193d 1225{
88439ac7
PU
1226 char codec_root[128];
1227
ce3e3737
PU
1228 if (codec->dev)
1229 snprintf(codec_root, sizeof(codec_root),
1230 "%s.%s", codec->name, dev_name(codec->dev));
1231 else
1232 snprintf(codec_root, sizeof(codec_root),
1233 "%s", codec->name);
88439ac7
PU
1234
1235 codec->debugfs_codec_root = debugfs_create_dir(codec_root,
1236 debugfs_root);
1237 if (!codec->debugfs_codec_root) {
1238 printk(KERN_WARNING
1239 "ASoC: Failed to create codec debugfs directory\n");
1240 return;
1241 }
1242
384c89e2 1243 codec->debugfs_reg = debugfs_create_file("codec_reg", 0644,
88439ac7
PU
1244 codec->debugfs_codec_root,
1245 codec, &codec_reg_fops);
384c89e2
MB
1246 if (!codec->debugfs_reg)
1247 printk(KERN_WARNING
1248 "ASoC: Failed to create codec register debugfs file\n");
1249
1250 codec->debugfs_pop_time = debugfs_create_u32("dapm_pop_time", 0744,
88439ac7 1251 codec->debugfs_codec_root,
384c89e2
MB
1252 &codec->pop_time);
1253 if (!codec->debugfs_pop_time)
1254 printk(KERN_WARNING
1255 "Failed to create pop time debugfs file\n");
79fb9387 1256
88439ac7
PU
1257 codec->debugfs_dapm = debugfs_create_dir("dapm",
1258 codec->debugfs_codec_root);
79fb9387
MB
1259 if (!codec->debugfs_dapm)
1260 printk(KERN_WARNING
1261 "Failed to create DAPM debugfs directory\n");
1262
1263 snd_soc_dapm_debugfs_init(codec);
12ef193d
TK
1264}
1265
384c89e2 1266static void soc_cleanup_codec_debugfs(struct snd_soc_codec *codec)
12ef193d 1267{
88439ac7 1268 debugfs_remove_recursive(codec->debugfs_codec_root);
12ef193d
TK
1269}
1270
1271#else
1272
384c89e2 1273static inline void soc_init_codec_debugfs(struct snd_soc_codec *codec)
12ef193d
TK
1274{
1275}
1276
384c89e2 1277static inline void soc_cleanup_codec_debugfs(struct snd_soc_codec *codec)
12ef193d
TK
1278{
1279}
1280#endif
1281
db2a4165
FM
1282/**
1283 * snd_soc_new_ac97_codec - initailise AC97 device
1284 * @codec: audio codec
1285 * @ops: AC97 bus operations
1286 * @num: AC97 codec number
1287 *
1288 * Initialises AC97 codec resources for use by ad-hoc devices only.
1289 */
1290int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
1291 struct snd_ac97_bus_ops *ops, int num)
1292{
1293 mutex_lock(&codec->mutex);
1294
1295 codec->ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL);
1296 if (codec->ac97 == NULL) {
1297 mutex_unlock(&codec->mutex);
1298 return -ENOMEM;
1299 }
1300
1301 codec->ac97->bus = kzalloc(sizeof(struct snd_ac97_bus), GFP_KERNEL);
1302 if (codec->ac97->bus == NULL) {
1303 kfree(codec->ac97);
1304 codec->ac97 = NULL;
1305 mutex_unlock(&codec->mutex);
1306 return -ENOMEM;
1307 }
1308
1309 codec->ac97->bus->ops = ops;
1310 codec->ac97->num = num;
1311 mutex_unlock(&codec->mutex);
1312 return 0;
1313}
1314EXPORT_SYMBOL_GPL(snd_soc_new_ac97_codec);
1315
1316/**
1317 * snd_soc_free_ac97_codec - free AC97 codec device
1318 * @codec: audio codec
1319 *
1320 * Frees AC97 codec device resources.
1321 */
1322void snd_soc_free_ac97_codec(struct snd_soc_codec *codec)
1323{
1324 mutex_lock(&codec->mutex);
1325 kfree(codec->ac97->bus);
1326 kfree(codec->ac97);
1327 codec->ac97 = NULL;
1328 mutex_unlock(&codec->mutex);
1329}
1330EXPORT_SYMBOL_GPL(snd_soc_free_ac97_codec);
1331
1332/**
1333 * snd_soc_update_bits - update codec register bits
1334 * @codec: audio codec
1335 * @reg: codec register
1336 * @mask: register mask
1337 * @value: new value
1338 *
1339 * Writes new register value.
1340 *
1341 * Returns 1 for change else 0.
1342 */
1343int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
46f5822f 1344 unsigned int mask, unsigned int value)
db2a4165
FM
1345{
1346 int change;
46f5822f 1347 unsigned int old, new;
db2a4165
FM
1348
1349 mutex_lock(&io_mutex);
1350 old = snd_soc_read(codec, reg);
1351 new = (old & ~mask) | value;
1352 change = old != new;
1353 if (change)
1354 snd_soc_write(codec, reg, new);
1355
1356 mutex_unlock(&io_mutex);
1357 return change;
1358}
1359EXPORT_SYMBOL_GPL(snd_soc_update_bits);
1360
1361/**
1362 * snd_soc_test_bits - test register for change
1363 * @codec: audio codec
1364 * @reg: codec register
1365 * @mask: register mask
1366 * @value: new value
1367 *
1368 * Tests a register with a new value and checks if the new value is
1369 * different from the old value.
1370 *
1371 * Returns 1 for change else 0.
1372 */
1373int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
46f5822f 1374 unsigned int mask, unsigned int value)
db2a4165
FM
1375{
1376 int change;
46f5822f 1377 unsigned int old, new;
db2a4165
FM
1378
1379 mutex_lock(&io_mutex);
1380 old = snd_soc_read(codec, reg);
1381 new = (old & ~mask) | value;
1382 change = old != new;
1383 mutex_unlock(&io_mutex);
1384
1385 return change;
1386}
1387EXPORT_SYMBOL_GPL(snd_soc_test_bits);
1388
db2a4165
FM
1389/**
1390 * snd_soc_new_pcms - create new sound card and pcms
1391 * @socdev: the SoC audio device
ac11a2b3
MB
1392 * @idx: ALSA card index
1393 * @xid: card identification
db2a4165
FM
1394 *
1395 * Create a new sound card based upon the codec and interface pcms.
1396 *
1397 * Returns 0 for success, else error.
1398 */
bc7320c5 1399int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid)
db2a4165 1400{
87506549 1401 struct snd_soc_card *card = socdev->card;
6627a653 1402 struct snd_soc_codec *codec = card->codec;
bd7dd77c 1403 int ret, i;
db2a4165
FM
1404
1405 mutex_lock(&codec->mutex);
1406
1407 /* register a sound card */
bd7dd77c
TI
1408 ret = snd_card_create(idx, xid, codec->owner, 0, &codec->card);
1409 if (ret < 0) {
db2a4165
FM
1410 printk(KERN_ERR "asoc: can't create sound card for codec %s\n",
1411 codec->name);
1412 mutex_unlock(&codec->mutex);
bd7dd77c 1413 return ret;
db2a4165
FM
1414 }
1415
452c5eaa 1416 codec->socdev = socdev;
db2a4165
FM
1417 codec->card->dev = socdev->dev;
1418 codec->card->private_data = codec;
1419 strncpy(codec->card->driver, codec->name, sizeof(codec->card->driver));
1420
1421 /* create the pcms */
87506549
MB
1422 for (i = 0; i < card->num_links; i++) {
1423 ret = soc_new_pcm(socdev, &card->dai_link[i], i);
db2a4165
FM
1424 if (ret < 0) {
1425 printk(KERN_ERR "asoc: can't create pcm %s\n",
87506549 1426 card->dai_link[i].stream_name);
db2a4165
FM
1427 mutex_unlock(&codec->mutex);
1428 return ret;
1429 }
1430 }
1431
1432 mutex_unlock(&codec->mutex);
1433 return ret;
1434}
1435EXPORT_SYMBOL_GPL(snd_soc_new_pcms);
1436
1437/**
968a6025 1438 * snd_soc_init_card - register sound card
db2a4165
FM
1439 * @socdev: the SoC audio device
1440 *
1441 * Register a SoC sound card. Also registers an AC97 device if the
1442 * codec is AC97 for ad hoc devices.
1443 *
1444 * Returns 0 for success, else error.
1445 */
968a6025 1446int snd_soc_init_card(struct snd_soc_device *socdev)
db2a4165 1447{
87506549 1448 struct snd_soc_card *card = socdev->card;
6627a653 1449 struct snd_soc_codec *codec = card->codec;
12e74f7d 1450 int ret = 0, i, ac97 = 0, err = 0;
db2a4165 1451
87506549
MB
1452 for (i = 0; i < card->num_links; i++) {
1453 if (card->dai_link[i].init) {
1454 err = card->dai_link[i].init(codec);
12e74f7d
LG
1455 if (err < 0) {
1456 printk(KERN_ERR "asoc: failed to init %s\n",
87506549 1457 card->dai_link[i].stream_name);
12e74f7d
LG
1458 continue;
1459 }
1460 }
474828a4 1461 if (card->dai_link[i].codec_dai->ac97_control) {
db2a4165 1462 ac97 = 1;
474828a4
MV
1463 snd_ac97_dev_add_pdata(codec->ac97,
1464 card->dai_link[i].cpu_dai->ac97_pdata);
1465 }
db2a4165
FM
1466 }
1467 snprintf(codec->card->shortname, sizeof(codec->card->shortname),
87506549 1468 "%s", card->name);
db2a4165 1469 snprintf(codec->card->longname, sizeof(codec->card->longname),
87506549 1470 "%s (%s)", card->name, codec->name);
db2a4165 1471
6d5701b2
MB
1472 /* Make sure all DAPM widgets are instantiated */
1473 snd_soc_dapm_new_widgets(codec);
1474
db2a4165
FM
1475 ret = snd_card_register(codec->card);
1476 if (ret < 0) {
3ff3f64b 1477 printk(KERN_ERR "asoc: failed to register soundcard for %s\n",
db2a4165 1478 codec->name);
12e74f7d 1479 goto out;
db2a4165
FM
1480 }
1481
08c8efe6 1482 mutex_lock(&codec->mutex);
db2a4165 1483#ifdef CONFIG_SND_SOC_AC97_BUS
14fa43f5
MB
1484 /* Only instantiate AC97 if not already done by the adaptor
1485 * for the generic AC97 subsystem.
1486 */
1487 if (ac97 && strcmp(codec->name, "AC97") != 0) {
12e74f7d
LG
1488 ret = soc_ac97_dev_register(codec);
1489 if (ret < 0) {
1490 printk(KERN_ERR "asoc: AC97 device register failed\n");
1491 snd_card_free(codec->card);
08c8efe6 1492 mutex_unlock(&codec->mutex);
12e74f7d
LG
1493 goto out;
1494 }
1495 }
db2a4165
FM
1496#endif
1497
12e74f7d
LG
1498 err = snd_soc_dapm_sys_add(socdev->dev);
1499 if (err < 0)
1500 printk(KERN_WARNING "asoc: failed to add dapm sysfs entries\n");
1501
1502 err = device_create_file(socdev->dev, &dev_attr_codec_reg);
1503 if (err < 0)
3ff3f64b 1504 printk(KERN_WARNING "asoc: failed to add codec sysfs files\n");
08c8efe6 1505
6627a653 1506 soc_init_codec_debugfs(codec);
db2a4165 1507 mutex_unlock(&codec->mutex);
08c8efe6
MB
1508
1509out:
db2a4165
FM
1510 return ret;
1511}
968a6025 1512EXPORT_SYMBOL_GPL(snd_soc_init_card);
db2a4165
FM
1513
1514/**
1515 * snd_soc_free_pcms - free sound card and pcms
1516 * @socdev: the SoC audio device
1517 *
1518 * Frees sound card and pcms associated with the socdev.
1519 * Also unregister the codec if it is an AC97 device.
1520 */
1521void snd_soc_free_pcms(struct snd_soc_device *socdev)
1522{
6627a653 1523 struct snd_soc_codec *codec = socdev->card->codec;
a68660e0 1524#ifdef CONFIG_SND_SOC_AC97_BUS
3c4b266f 1525 struct snd_soc_dai *codec_dai;
a68660e0
LG
1526 int i;
1527#endif
db2a4165
FM
1528
1529 mutex_lock(&codec->mutex);
6627a653 1530 soc_cleanup_codec_debugfs(codec);
db2a4165 1531#ifdef CONFIG_SND_SOC_AC97_BUS
3ff3f64b 1532 for (i = 0; i < codec->num_dai; i++) {
a68660e0 1533 codec_dai = &codec->dai[i];
d2314e0e
AN
1534 if (codec_dai->ac97_control && codec->ac97 &&
1535 strcmp(codec->name, "AC97") != 0) {
a68660e0
LG
1536 soc_ac97_dev_unregister(codec);
1537 goto free_card;
1538 }
1539 }
1540free_card:
db2a4165
FM
1541#endif
1542
1543 if (codec->card)
1544 snd_card_free(codec->card);
1545 device_remove_file(socdev->dev, &dev_attr_codec_reg);
1546 mutex_unlock(&codec->mutex);
1547}
1548EXPORT_SYMBOL_GPL(snd_soc_free_pcms);
1549
1550/**
1551 * snd_soc_set_runtime_hwparams - set the runtime hardware parameters
1552 * @substream: the pcm substream
1553 * @hw: the hardware parameters
1554 *
1555 * Sets the substream runtime hardware parameters.
1556 */
1557int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
1558 const struct snd_pcm_hardware *hw)
1559{
1560 struct snd_pcm_runtime *runtime = substream->runtime;
1561 runtime->hw.info = hw->info;
1562 runtime->hw.formats = hw->formats;
1563 runtime->hw.period_bytes_min = hw->period_bytes_min;
1564 runtime->hw.period_bytes_max = hw->period_bytes_max;
1565 runtime->hw.periods_min = hw->periods_min;
1566 runtime->hw.periods_max = hw->periods_max;
1567 runtime->hw.buffer_bytes_max = hw->buffer_bytes_max;
1568 runtime->hw.fifo_size = hw->fifo_size;
1569 return 0;
1570}
1571EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams);
1572
1573/**
1574 * snd_soc_cnew - create new control
1575 * @_template: control template
1576 * @data: control private data
ac11a2b3 1577 * @long_name: control long name
db2a4165
FM
1578 *
1579 * Create a new mixer control from a template control.
1580 *
1581 * Returns 0 for success, else error.
1582 */
1583struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
1584 void *data, char *long_name)
1585{
1586 struct snd_kcontrol_new template;
1587
1588 memcpy(&template, _template, sizeof(template));
1589 if (long_name)
1590 template.name = long_name;
db2a4165
FM
1591 template.index = 0;
1592
1593 return snd_ctl_new1(&template, data);
1594}
1595EXPORT_SYMBOL_GPL(snd_soc_cnew);
1596
3e8e1952
IM
1597/**
1598 * snd_soc_add_controls - add an array of controls to a codec.
1599 * Convienience function to add a list of controls. Many codecs were
1600 * duplicating this code.
1601 *
1602 * @codec: codec to add controls to
1603 * @controls: array of controls to add
1604 * @num_controls: number of elements in the array
1605 *
1606 * Return 0 for success, else error.
1607 */
1608int snd_soc_add_controls(struct snd_soc_codec *codec,
1609 const struct snd_kcontrol_new *controls, int num_controls)
1610{
1611 struct snd_card *card = codec->card;
1612 int err, i;
1613
1614 for (i = 0; i < num_controls; i++) {
1615 const struct snd_kcontrol_new *control = &controls[i];
1616 err = snd_ctl_add(card, snd_soc_cnew(control, codec, NULL));
1617 if (err < 0) {
1618 dev_err(codec->dev, "%s: Failed to add %s\n",
1619 codec->name, control->name);
1620 return err;
1621 }
1622 }
1623
1624 return 0;
1625}
1626EXPORT_SYMBOL_GPL(snd_soc_add_controls);
1627
db2a4165
FM
1628/**
1629 * snd_soc_info_enum_double - enumerated double mixer info callback
1630 * @kcontrol: mixer control
1631 * @uinfo: control element information
1632 *
1633 * Callback to provide information about a double enumerated
1634 * mixer control.
1635 *
1636 * Returns 0 for success.
1637 */
1638int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
1639 struct snd_ctl_elem_info *uinfo)
1640{
1641 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1642
1643 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1644 uinfo->count = e->shift_l == e->shift_r ? 1 : 2;
f8ba0b7b 1645 uinfo->value.enumerated.items = e->max;
db2a4165 1646
f8ba0b7b
JS
1647 if (uinfo->value.enumerated.item > e->max - 1)
1648 uinfo->value.enumerated.item = e->max - 1;
db2a4165
FM
1649 strcpy(uinfo->value.enumerated.name,
1650 e->texts[uinfo->value.enumerated.item]);
1651 return 0;
1652}
1653EXPORT_SYMBOL_GPL(snd_soc_info_enum_double);
1654
1655/**
1656 * snd_soc_get_enum_double - enumerated double mixer get callback
1657 * @kcontrol: mixer control
ac11a2b3 1658 * @ucontrol: control element information
db2a4165
FM
1659 *
1660 * Callback to get the value of a double enumerated mixer.
1661 *
1662 * Returns 0 for success.
1663 */
1664int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
1665 struct snd_ctl_elem_value *ucontrol)
1666{
1667 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1668 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
46f5822f 1669 unsigned int val, bitmask;
db2a4165 1670
f8ba0b7b 1671 for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
db2a4165
FM
1672 ;
1673 val = snd_soc_read(codec, e->reg);
3ff3f64b
MB
1674 ucontrol->value.enumerated.item[0]
1675 = (val >> e->shift_l) & (bitmask - 1);
db2a4165
FM
1676 if (e->shift_l != e->shift_r)
1677 ucontrol->value.enumerated.item[1] =
1678 (val >> e->shift_r) & (bitmask - 1);
1679
1680 return 0;
1681}
1682EXPORT_SYMBOL_GPL(snd_soc_get_enum_double);
1683
1684/**
1685 * snd_soc_put_enum_double - enumerated double mixer put callback
1686 * @kcontrol: mixer control
ac11a2b3 1687 * @ucontrol: control element information
db2a4165
FM
1688 *
1689 * Callback to set the value of a double enumerated mixer.
1690 *
1691 * Returns 0 for success.
1692 */
1693int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
1694 struct snd_ctl_elem_value *ucontrol)
1695{
1696 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1697 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
46f5822f
DR
1698 unsigned int val;
1699 unsigned int mask, bitmask;
db2a4165 1700
f8ba0b7b 1701 for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
db2a4165 1702 ;
f8ba0b7b 1703 if (ucontrol->value.enumerated.item[0] > e->max - 1)
db2a4165
FM
1704 return -EINVAL;
1705 val = ucontrol->value.enumerated.item[0] << e->shift_l;
1706 mask = (bitmask - 1) << e->shift_l;
1707 if (e->shift_l != e->shift_r) {
f8ba0b7b 1708 if (ucontrol->value.enumerated.item[1] > e->max - 1)
db2a4165
FM
1709 return -EINVAL;
1710 val |= ucontrol->value.enumerated.item[1] << e->shift_r;
1711 mask |= (bitmask - 1) << e->shift_r;
1712 }
1713
1714 return snd_soc_update_bits(codec, e->reg, mask, val);
1715}
1716EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
1717
2e72f8e3
PU
1718/**
1719 * snd_soc_get_value_enum_double - semi enumerated double mixer get callback
1720 * @kcontrol: mixer control
1721 * @ucontrol: control element information
1722 *
1723 * Callback to get the value of a double semi enumerated mixer.
1724 *
1725 * Semi enumerated mixer: the enumerated items are referred as values. Can be
1726 * used for handling bitfield coded enumeration for example.
1727 *
1728 * Returns 0 for success.
1729 */
1730int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol,
1731 struct snd_ctl_elem_value *ucontrol)
1732{
1733 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
74155556 1734 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
46f5822f 1735 unsigned int reg_val, val, mux;
2e72f8e3
PU
1736
1737 reg_val = snd_soc_read(codec, e->reg);
1738 val = (reg_val >> e->shift_l) & e->mask;
1739 for (mux = 0; mux < e->max; mux++) {
1740 if (val == e->values[mux])
1741 break;
1742 }
1743 ucontrol->value.enumerated.item[0] = mux;
1744 if (e->shift_l != e->shift_r) {
1745 val = (reg_val >> e->shift_r) & e->mask;
1746 for (mux = 0; mux < e->max; mux++) {
1747 if (val == e->values[mux])
1748 break;
1749 }
1750 ucontrol->value.enumerated.item[1] = mux;
1751 }
1752
1753 return 0;
1754}
1755EXPORT_SYMBOL_GPL(snd_soc_get_value_enum_double);
1756
1757/**
1758 * snd_soc_put_value_enum_double - semi enumerated double mixer put callback
1759 * @kcontrol: mixer control
1760 * @ucontrol: control element information
1761 *
1762 * Callback to set the value of a double semi enumerated mixer.
1763 *
1764 * Semi enumerated mixer: the enumerated items are referred as values. Can be
1765 * used for handling bitfield coded enumeration for example.
1766 *
1767 * Returns 0 for success.
1768 */
1769int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol,
1770 struct snd_ctl_elem_value *ucontrol)
1771{
1772 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
74155556 1773 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
46f5822f
DR
1774 unsigned int val;
1775 unsigned int mask;
2e72f8e3
PU
1776
1777 if (ucontrol->value.enumerated.item[0] > e->max - 1)
1778 return -EINVAL;
1779 val = e->values[ucontrol->value.enumerated.item[0]] << e->shift_l;
1780 mask = e->mask << e->shift_l;
1781 if (e->shift_l != e->shift_r) {
1782 if (ucontrol->value.enumerated.item[1] > e->max - 1)
1783 return -EINVAL;
1784 val |= e->values[ucontrol->value.enumerated.item[1]] << e->shift_r;
1785 mask |= e->mask << e->shift_r;
1786 }
1787
1788 return snd_soc_update_bits(codec, e->reg, mask, val);
1789}
1790EXPORT_SYMBOL_GPL(snd_soc_put_value_enum_double);
1791
db2a4165
FM
1792/**
1793 * snd_soc_info_enum_ext - external enumerated single mixer info callback
1794 * @kcontrol: mixer control
1795 * @uinfo: control element information
1796 *
1797 * Callback to provide information about an external enumerated
1798 * single mixer.
1799 *
1800 * Returns 0 for success.
1801 */
1802int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol,
1803 struct snd_ctl_elem_info *uinfo)
1804{
1805 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1806
1807 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
1808 uinfo->count = 1;
f8ba0b7b 1809 uinfo->value.enumerated.items = e->max;
db2a4165 1810
f8ba0b7b
JS
1811 if (uinfo->value.enumerated.item > e->max - 1)
1812 uinfo->value.enumerated.item = e->max - 1;
db2a4165
FM
1813 strcpy(uinfo->value.enumerated.name,
1814 e->texts[uinfo->value.enumerated.item]);
1815 return 0;
1816}
1817EXPORT_SYMBOL_GPL(snd_soc_info_enum_ext);
1818
1819/**
1820 * snd_soc_info_volsw_ext - external single mixer info callback
1821 * @kcontrol: mixer control
1822 * @uinfo: control element information
1823 *
1824 * Callback to provide information about a single external mixer control.
1825 *
1826 * Returns 0 for success.
1827 */
1828int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
1829 struct snd_ctl_elem_info *uinfo)
1830{
a7a4ac86
PZ
1831 int max = kcontrol->private_value;
1832
fd5dfad9 1833 if (max == 1 && !strstr(kcontrol->id.name, " Volume"))
a7a4ac86
PZ
1834 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1835 else
1836 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
db2a4165 1837
db2a4165
FM
1838 uinfo->count = 1;
1839 uinfo->value.integer.min = 0;
a7a4ac86 1840 uinfo->value.integer.max = max;
db2a4165
FM
1841 return 0;
1842}
1843EXPORT_SYMBOL_GPL(snd_soc_info_volsw_ext);
1844
db2a4165
FM
1845/**
1846 * snd_soc_info_volsw - single mixer info callback
1847 * @kcontrol: mixer control
1848 * @uinfo: control element information
1849 *
1850 * Callback to provide information about a single mixer control.
1851 *
1852 * Returns 0 for success.
1853 */
1854int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
1855 struct snd_ctl_elem_info *uinfo)
1856{
4eaa9819
JS
1857 struct soc_mixer_control *mc =
1858 (struct soc_mixer_control *)kcontrol->private_value;
1859 int max = mc->max;
762b8df7 1860 unsigned int shift = mc->shift;
815ecf8d 1861 unsigned int rshift = mc->rshift;
db2a4165 1862
fd5dfad9 1863 if (max == 1 && !strstr(kcontrol->id.name, " Volume"))
a7a4ac86
PZ
1864 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1865 else
1866 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1867
db2a4165
FM
1868 uinfo->count = shift == rshift ? 1 : 2;
1869 uinfo->value.integer.min = 0;
a7a4ac86 1870 uinfo->value.integer.max = max;
db2a4165
FM
1871 return 0;
1872}
1873EXPORT_SYMBOL_GPL(snd_soc_info_volsw);
1874
1875/**
1876 * snd_soc_get_volsw - single mixer get callback
1877 * @kcontrol: mixer control
ac11a2b3 1878 * @ucontrol: control element information
db2a4165
FM
1879 *
1880 * Callback to get the value of a single mixer control.
1881 *
1882 * Returns 0 for success.
1883 */
1884int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
1885 struct snd_ctl_elem_value *ucontrol)
1886{
4eaa9819
JS
1887 struct soc_mixer_control *mc =
1888 (struct soc_mixer_control *)kcontrol->private_value;
db2a4165 1889 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
815ecf8d
JS
1890 unsigned int reg = mc->reg;
1891 unsigned int shift = mc->shift;
1892 unsigned int rshift = mc->rshift;
4eaa9819 1893 int max = mc->max;
815ecf8d
JS
1894 unsigned int mask = (1 << fls(max)) - 1;
1895 unsigned int invert = mc->invert;
db2a4165
FM
1896
1897 ucontrol->value.integer.value[0] =
1898 (snd_soc_read(codec, reg) >> shift) & mask;
1899 if (shift != rshift)
1900 ucontrol->value.integer.value[1] =
1901 (snd_soc_read(codec, reg) >> rshift) & mask;
1902 if (invert) {
1903 ucontrol->value.integer.value[0] =
a7a4ac86 1904 max - ucontrol->value.integer.value[0];
db2a4165
FM
1905 if (shift != rshift)
1906 ucontrol->value.integer.value[1] =
a7a4ac86 1907 max - ucontrol->value.integer.value[1];
db2a4165
FM
1908 }
1909
1910 return 0;
1911}
1912EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
1913
1914/**
1915 * snd_soc_put_volsw - single mixer put callback
1916 * @kcontrol: mixer control
ac11a2b3 1917 * @ucontrol: control element information
db2a4165
FM
1918 *
1919 * Callback to set the value of a single mixer control.
1920 *
1921 * Returns 0 for success.
1922 */
1923int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
1924 struct snd_ctl_elem_value *ucontrol)
1925{
4eaa9819
JS
1926 struct soc_mixer_control *mc =
1927 (struct soc_mixer_control *)kcontrol->private_value;
db2a4165 1928 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
815ecf8d
JS
1929 unsigned int reg = mc->reg;
1930 unsigned int shift = mc->shift;
1931 unsigned int rshift = mc->rshift;
4eaa9819 1932 int max = mc->max;
815ecf8d
JS
1933 unsigned int mask = (1 << fls(max)) - 1;
1934 unsigned int invert = mc->invert;
46f5822f 1935 unsigned int val, val2, val_mask;
db2a4165
FM
1936
1937 val = (ucontrol->value.integer.value[0] & mask);
1938 if (invert)
a7a4ac86 1939 val = max - val;
db2a4165
FM
1940 val_mask = mask << shift;
1941 val = val << shift;
1942 if (shift != rshift) {
1943 val2 = (ucontrol->value.integer.value[1] & mask);
1944 if (invert)
a7a4ac86 1945 val2 = max - val2;
db2a4165
FM
1946 val_mask |= mask << rshift;
1947 val |= val2 << rshift;
1948 }
a7a4ac86 1949 return snd_soc_update_bits(codec, reg, val_mask, val);
db2a4165
FM
1950}
1951EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
1952
1953/**
1954 * snd_soc_info_volsw_2r - double mixer info callback
1955 * @kcontrol: mixer control
1956 * @uinfo: control element information
1957 *
1958 * Callback to provide information about a double mixer control that
1959 * spans 2 codec registers.
1960 *
1961 * Returns 0 for success.
1962 */
1963int snd_soc_info_volsw_2r(struct snd_kcontrol *kcontrol,
1964 struct snd_ctl_elem_info *uinfo)
1965{
4eaa9819
JS
1966 struct soc_mixer_control *mc =
1967 (struct soc_mixer_control *)kcontrol->private_value;
1968 int max = mc->max;
a7a4ac86 1969
fd5dfad9 1970 if (max == 1 && !strstr(kcontrol->id.name, " Volume"))
a7a4ac86
PZ
1971 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1972 else
1973 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
db2a4165 1974
db2a4165
FM
1975 uinfo->count = 2;
1976 uinfo->value.integer.min = 0;
a7a4ac86 1977 uinfo->value.integer.max = max;
db2a4165
FM
1978 return 0;
1979}
1980EXPORT_SYMBOL_GPL(snd_soc_info_volsw_2r);
1981
1982/**
1983 * snd_soc_get_volsw_2r - double mixer get callback
1984 * @kcontrol: mixer control
ac11a2b3 1985 * @ucontrol: control element information
db2a4165
FM
1986 *
1987 * Callback to get the value of a double mixer control that spans 2 registers.
1988 *
1989 * Returns 0 for success.
1990 */
1991int snd_soc_get_volsw_2r(struct snd_kcontrol *kcontrol,
1992 struct snd_ctl_elem_value *ucontrol)
1993{
4eaa9819
JS
1994 struct soc_mixer_control *mc =
1995 (struct soc_mixer_control *)kcontrol->private_value;
db2a4165 1996 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
815ecf8d
JS
1997 unsigned int reg = mc->reg;
1998 unsigned int reg2 = mc->rreg;
1999 unsigned int shift = mc->shift;
4eaa9819 2000 int max = mc->max;
46f5822f 2001 unsigned int mask = (1 << fls(max)) - 1;
815ecf8d 2002 unsigned int invert = mc->invert;
db2a4165
FM
2003
2004 ucontrol->value.integer.value[0] =
2005 (snd_soc_read(codec, reg) >> shift) & mask;
2006 ucontrol->value.integer.value[1] =
2007 (snd_soc_read(codec, reg2) >> shift) & mask;
2008 if (invert) {
2009 ucontrol->value.integer.value[0] =
a7a4ac86 2010 max - ucontrol->value.integer.value[0];
db2a4165 2011 ucontrol->value.integer.value[1] =
a7a4ac86 2012 max - ucontrol->value.integer.value[1];
db2a4165
FM
2013 }
2014
2015 return 0;
2016}
2017EXPORT_SYMBOL_GPL(snd_soc_get_volsw_2r);
2018
2019/**
2020 * snd_soc_put_volsw_2r - double mixer set callback
2021 * @kcontrol: mixer control
ac11a2b3 2022 * @ucontrol: control element information
db2a4165
FM
2023 *
2024 * Callback to set the value of a double mixer control that spans 2 registers.
2025 *
2026 * Returns 0 for success.
2027 */
2028int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
2029 struct snd_ctl_elem_value *ucontrol)
2030{
4eaa9819
JS
2031 struct soc_mixer_control *mc =
2032 (struct soc_mixer_control *)kcontrol->private_value;
db2a4165 2033 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
815ecf8d
JS
2034 unsigned int reg = mc->reg;
2035 unsigned int reg2 = mc->rreg;
2036 unsigned int shift = mc->shift;
4eaa9819 2037 int max = mc->max;
815ecf8d
JS
2038 unsigned int mask = (1 << fls(max)) - 1;
2039 unsigned int invert = mc->invert;
db2a4165 2040 int err;
46f5822f 2041 unsigned int val, val2, val_mask;
db2a4165
FM
2042
2043 val_mask = mask << shift;
2044 val = (ucontrol->value.integer.value[0] & mask);
2045 val2 = (ucontrol->value.integer.value[1] & mask);
2046
2047 if (invert) {
a7a4ac86
PZ
2048 val = max - val;
2049 val2 = max - val2;
db2a4165
FM
2050 }
2051
2052 val = val << shift;
2053 val2 = val2 << shift;
2054
3ff3f64b
MB
2055 err = snd_soc_update_bits(codec, reg, val_mask, val);
2056 if (err < 0)
db2a4165
FM
2057 return err;
2058
2059 err = snd_soc_update_bits(codec, reg2, val_mask, val2);
2060 return err;
2061}
2062EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r);
2063
e13ac2e9
MB
2064/**
2065 * snd_soc_info_volsw_s8 - signed mixer info callback
2066 * @kcontrol: mixer control
2067 * @uinfo: control element information
2068 *
2069 * Callback to provide information about a signed mixer control.
2070 *
2071 * Returns 0 for success.
2072 */
2073int snd_soc_info_volsw_s8(struct snd_kcontrol *kcontrol,
2074 struct snd_ctl_elem_info *uinfo)
2075{
4eaa9819
JS
2076 struct soc_mixer_control *mc =
2077 (struct soc_mixer_control *)kcontrol->private_value;
2078 int max = mc->max;
2079 int min = mc->min;
e13ac2e9
MB
2080
2081 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2082 uinfo->count = 2;
2083 uinfo->value.integer.min = 0;
2084 uinfo->value.integer.max = max-min;
2085 return 0;
2086}
2087EXPORT_SYMBOL_GPL(snd_soc_info_volsw_s8);
2088
2089/**
2090 * snd_soc_get_volsw_s8 - signed mixer get callback
2091 * @kcontrol: mixer control
ac11a2b3 2092 * @ucontrol: control element information
e13ac2e9
MB
2093 *
2094 * Callback to get the value of a signed mixer control.
2095 *
2096 * Returns 0 for success.
2097 */
2098int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol,
2099 struct snd_ctl_elem_value *ucontrol)
2100{
4eaa9819
JS
2101 struct soc_mixer_control *mc =
2102 (struct soc_mixer_control *)kcontrol->private_value;
e13ac2e9 2103 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
815ecf8d 2104 unsigned int reg = mc->reg;
4eaa9819 2105 int min = mc->min;
e13ac2e9
MB
2106 int val = snd_soc_read(codec, reg);
2107
2108 ucontrol->value.integer.value[0] =
2109 ((signed char)(val & 0xff))-min;
2110 ucontrol->value.integer.value[1] =
2111 ((signed char)((val >> 8) & 0xff))-min;
2112 return 0;
2113}
2114EXPORT_SYMBOL_GPL(snd_soc_get_volsw_s8);
2115
2116/**
2117 * snd_soc_put_volsw_sgn - signed mixer put callback
2118 * @kcontrol: mixer control
ac11a2b3 2119 * @ucontrol: control element information
e13ac2e9
MB
2120 *
2121 * Callback to set the value of a signed mixer control.
2122 *
2123 * Returns 0 for success.
2124 */
2125int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,
2126 struct snd_ctl_elem_value *ucontrol)
2127{
4eaa9819
JS
2128 struct soc_mixer_control *mc =
2129 (struct soc_mixer_control *)kcontrol->private_value;
e13ac2e9 2130 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
815ecf8d 2131 unsigned int reg = mc->reg;
4eaa9819 2132 int min = mc->min;
46f5822f 2133 unsigned int val;
e13ac2e9
MB
2134
2135 val = (ucontrol->value.integer.value[0]+min) & 0xff;
2136 val |= ((ucontrol->value.integer.value[1]+min) & 0xff) << 8;
2137
2138 return snd_soc_update_bits(codec, reg, 0xffff, val);
2139}
2140EXPORT_SYMBOL_GPL(snd_soc_put_volsw_s8);
2141
8c6529db
LG
2142/**
2143 * snd_soc_dai_set_sysclk - configure DAI system or master clock.
2144 * @dai: DAI
2145 * @clk_id: DAI specific clock ID
2146 * @freq: new clock frequency in Hz
2147 * @dir: new clock direction - input/output.
2148 *
2149 * Configures the DAI master (MCLK) or system (SYSCLK) clocking.
2150 */
2151int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
2152 unsigned int freq, int dir)
2153{
3f1a4d82 2154 if (dai->ops && dai->ops->set_sysclk)
6335d055 2155 return dai->ops->set_sysclk(dai, clk_id, freq, dir);
8c6529db
LG
2156 else
2157 return -EINVAL;
2158}
2159EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
2160
2161/**
2162 * snd_soc_dai_set_clkdiv - configure DAI clock dividers.
2163 * @dai: DAI
ac11a2b3 2164 * @div_id: DAI specific clock divider ID
8c6529db
LG
2165 * @div: new clock divisor.
2166 *
2167 * Configures the clock dividers. This is used to derive the best DAI bit and
2168 * frame clocks from the system or master clock. It's best to set the DAI bit
2169 * and frame clocks as low as possible to save system power.
2170 */
2171int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
2172 int div_id, int div)
2173{
3f1a4d82 2174 if (dai->ops && dai->ops->set_clkdiv)
6335d055 2175 return dai->ops->set_clkdiv(dai, div_id, div);
8c6529db
LG
2176 else
2177 return -EINVAL;
2178}
2179EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv);
2180
2181/**
2182 * snd_soc_dai_set_pll - configure DAI PLL.
2183 * @dai: DAI
2184 * @pll_id: DAI specific PLL ID
85488037 2185 * @source: DAI specific source for the PLL
8c6529db
LG
2186 * @freq_in: PLL input clock frequency in Hz
2187 * @freq_out: requested PLL output clock frequency in Hz
2188 *
2189 * Configures and enables PLL to generate output clock based on input clock.
2190 */
85488037
MB
2191int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source,
2192 unsigned int freq_in, unsigned int freq_out)
8c6529db 2193{
3f1a4d82 2194 if (dai->ops && dai->ops->set_pll)
85488037
MB
2195 return dai->ops->set_pll(dai, pll_id, source,
2196 freq_in, freq_out);
8c6529db
LG
2197 else
2198 return -EINVAL;
2199}
2200EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll);
2201
2202/**
2203 * snd_soc_dai_set_fmt - configure DAI hardware audio format.
2204 * @dai: DAI
8c6529db
LG
2205 * @fmt: SND_SOC_DAIFMT_ format value.
2206 *
2207 * Configures the DAI hardware format and clocking.
2208 */
2209int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2210{
3f1a4d82 2211 if (dai->ops && dai->ops->set_fmt)
6335d055 2212 return dai->ops->set_fmt(dai, fmt);
8c6529db
LG
2213 else
2214 return -EINVAL;
2215}
2216EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
2217
2218/**
2219 * snd_soc_dai_set_tdm_slot - configure DAI TDM.
2220 * @dai: DAI
a5479e38
DR
2221 * @tx_mask: bitmask representing active TX slots.
2222 * @rx_mask: bitmask representing active RX slots.
8c6529db 2223 * @slots: Number of slots in use.
a5479e38 2224 * @slot_width: Width in bits for each slot.
8c6529db
LG
2225 *
2226 * Configures a DAI for TDM operation. Both mask and slots are codec and DAI
2227 * specific.
2228 */
2229int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
a5479e38 2230 unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
8c6529db 2231{
3f1a4d82 2232 if (dai->ops && dai->ops->set_tdm_slot)
a5479e38
DR
2233 return dai->ops->set_tdm_slot(dai, tx_mask, rx_mask,
2234 slots, slot_width);
8c6529db
LG
2235 else
2236 return -EINVAL;
2237}
2238EXPORT_SYMBOL_GPL(snd_soc_dai_set_tdm_slot);
2239
472df3cb
BS
2240/**
2241 * snd_soc_dai_set_channel_map - configure DAI audio channel map
2242 * @dai: DAI
2243 * @tx_num: how many TX channels
2244 * @tx_slot: pointer to an array which imply the TX slot number channel
2245 * 0~num-1 uses
2246 * @rx_num: how many RX channels
2247 * @rx_slot: pointer to an array which imply the RX slot number channel
2248 * 0~num-1 uses
2249 *
2250 * configure the relationship between channel number and TDM slot number.
2251 */
2252int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
2253 unsigned int tx_num, unsigned int *tx_slot,
2254 unsigned int rx_num, unsigned int *rx_slot)
2255{
2256 if (dai->ops && dai->ops->set_channel_map)
2257 return dai->ops->set_channel_map(dai, tx_num, tx_slot,
2258 rx_num, rx_slot);
2259 else
2260 return -EINVAL;
2261}
2262EXPORT_SYMBOL_GPL(snd_soc_dai_set_channel_map);
2263
8c6529db
LG
2264/**
2265 * snd_soc_dai_set_tristate - configure DAI system or master clock.
2266 * @dai: DAI
2267 * @tristate: tristate enable
2268 *
2269 * Tristates the DAI so that others can use it.
2270 */
2271int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate)
2272{
3f1a4d82 2273 if (dai->ops && dai->ops->set_tristate)
6335d055 2274 return dai->ops->set_tristate(dai, tristate);
8c6529db
LG
2275 else
2276 return -EINVAL;
2277}
2278EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate);
2279
2280/**
2281 * snd_soc_dai_digital_mute - configure DAI system or master clock.
2282 * @dai: DAI
2283 * @mute: mute enable
2284 *
2285 * Mutes the DAI DAC.
2286 */
2287int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute)
2288{
3f1a4d82 2289 if (dai->ops && dai->ops->digital_mute)
6335d055 2290 return dai->ops->digital_mute(dai, mute);
8c6529db
LG
2291 else
2292 return -EINVAL;
2293}
2294EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute);
2295
c5af3a2e
MB
2296/**
2297 * snd_soc_register_card - Register a card with the ASoC core
2298 *
ac11a2b3 2299 * @card: Card to register
c5af3a2e
MB
2300 *
2301 * Note that currently this is an internal only function: it will be
2302 * exposed to machine drivers after further backporting of ASoC v2
2303 * registration APIs.
2304 */
2305static int snd_soc_register_card(struct snd_soc_card *card)
2306{
2307 if (!card->name || !card->dev)
2308 return -EINVAL;
2309
2310 INIT_LIST_HEAD(&card->list);
2311 card->instantiated = 0;
2312
2313 mutex_lock(&client_mutex);
2314 list_add(&card->list, &card_list);
435c5e25 2315 snd_soc_instantiate_cards();
c5af3a2e
MB
2316 mutex_unlock(&client_mutex);
2317
2318 dev_dbg(card->dev, "Registered card '%s'\n", card->name);
2319
2320 return 0;
2321}
2322
2323/**
2324 * snd_soc_unregister_card - Unregister a card with the ASoC core
2325 *
ac11a2b3 2326 * @card: Card to unregister
c5af3a2e
MB
2327 *
2328 * Note that currently this is an internal only function: it will be
2329 * exposed to machine drivers after further backporting of ASoC v2
2330 * registration APIs.
2331 */
2332static int snd_soc_unregister_card(struct snd_soc_card *card)
2333{
2334 mutex_lock(&client_mutex);
2335 list_del(&card->list);
2336 mutex_unlock(&client_mutex);
2337
2338 dev_dbg(card->dev, "Unregistered card '%s'\n", card->name);
2339
2340 return 0;
2341}
2342
9115171a
MB
2343/**
2344 * snd_soc_register_dai - Register a DAI with the ASoC core
2345 *
ac11a2b3 2346 * @dai: DAI to register
9115171a
MB
2347 */
2348int snd_soc_register_dai(struct snd_soc_dai *dai)
2349{
2350 if (!dai->name)
2351 return -EINVAL;
2352
2353 /* The device should become mandatory over time */
2354 if (!dai->dev)
2355 printk(KERN_WARNING "No device for DAI %s\n", dai->name);
2356
6335d055
EM
2357 if (!dai->ops)
2358 dai->ops = &null_dai_ops;
2359
9115171a
MB
2360 INIT_LIST_HEAD(&dai->list);
2361
2362 mutex_lock(&client_mutex);
2363 list_add(&dai->list, &dai_list);
435c5e25 2364 snd_soc_instantiate_cards();
9115171a
MB
2365 mutex_unlock(&client_mutex);
2366
2367 pr_debug("Registered DAI '%s'\n", dai->name);
2368
2369 return 0;
2370}
2371EXPORT_SYMBOL_GPL(snd_soc_register_dai);
2372
2373/**
2374 * snd_soc_unregister_dai - Unregister a DAI from the ASoC core
2375 *
ac11a2b3 2376 * @dai: DAI to unregister
9115171a
MB
2377 */
2378void snd_soc_unregister_dai(struct snd_soc_dai *dai)
2379{
2380 mutex_lock(&client_mutex);
2381 list_del(&dai->list);
2382 mutex_unlock(&client_mutex);
2383
2384 pr_debug("Unregistered DAI '%s'\n", dai->name);
2385}
2386EXPORT_SYMBOL_GPL(snd_soc_unregister_dai);
2387
2388/**
2389 * snd_soc_register_dais - Register multiple DAIs with the ASoC core
2390 *
ac11a2b3
MB
2391 * @dai: Array of DAIs to register
2392 * @count: Number of DAIs
9115171a
MB
2393 */
2394int snd_soc_register_dais(struct snd_soc_dai *dai, size_t count)
2395{
2396 int i, ret;
2397
2398 for (i = 0; i < count; i++) {
2399 ret = snd_soc_register_dai(&dai[i]);
2400 if (ret != 0)
2401 goto err;
2402 }
2403
2404 return 0;
2405
2406err:
2407 for (i--; i >= 0; i--)
2408 snd_soc_unregister_dai(&dai[i]);
2409
2410 return ret;
2411}
2412EXPORT_SYMBOL_GPL(snd_soc_register_dais);
2413
2414/**
2415 * snd_soc_unregister_dais - Unregister multiple DAIs from the ASoC core
2416 *
ac11a2b3
MB
2417 * @dai: Array of DAIs to unregister
2418 * @count: Number of DAIs
9115171a
MB
2419 */
2420void snd_soc_unregister_dais(struct snd_soc_dai *dai, size_t count)
2421{
2422 int i;
2423
2424 for (i = 0; i < count; i++)
2425 snd_soc_unregister_dai(&dai[i]);
2426}
2427EXPORT_SYMBOL_GPL(snd_soc_unregister_dais);
2428
12a48a8c
MB
2429/**
2430 * snd_soc_register_platform - Register a platform with the ASoC core
2431 *
ac11a2b3 2432 * @platform: platform to register
12a48a8c
MB
2433 */
2434int snd_soc_register_platform(struct snd_soc_platform *platform)
2435{
2436 if (!platform->name)
2437 return -EINVAL;
2438
2439 INIT_LIST_HEAD(&platform->list);
2440
2441 mutex_lock(&client_mutex);
2442 list_add(&platform->list, &platform_list);
435c5e25 2443 snd_soc_instantiate_cards();
12a48a8c
MB
2444 mutex_unlock(&client_mutex);
2445
2446 pr_debug("Registered platform '%s'\n", platform->name);
2447
2448 return 0;
2449}
2450EXPORT_SYMBOL_GPL(snd_soc_register_platform);
2451
2452/**
2453 * snd_soc_unregister_platform - Unregister a platform from the ASoC core
2454 *
ac11a2b3 2455 * @platform: platform to unregister
12a48a8c
MB
2456 */
2457void snd_soc_unregister_platform(struct snd_soc_platform *platform)
2458{
2459 mutex_lock(&client_mutex);
2460 list_del(&platform->list);
2461 mutex_unlock(&client_mutex);
2462
2463 pr_debug("Unregistered platform '%s'\n", platform->name);
2464}
2465EXPORT_SYMBOL_GPL(snd_soc_unregister_platform);
2466
151ab22c
MB
2467static u64 codec_format_map[] = {
2468 SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE,
2469 SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_U16_BE,
2470 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_BE,
2471 SNDRV_PCM_FMTBIT_U24_LE | SNDRV_PCM_FMTBIT_U24_BE,
2472 SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S32_BE,
2473 SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_U32_BE,
2474 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_U24_3BE,
2475 SNDRV_PCM_FMTBIT_U24_3LE | SNDRV_PCM_FMTBIT_U24_3BE,
2476 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S20_3BE,
2477 SNDRV_PCM_FMTBIT_U20_3LE | SNDRV_PCM_FMTBIT_U20_3BE,
2478 SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S18_3BE,
2479 SNDRV_PCM_FMTBIT_U18_3LE | SNDRV_PCM_FMTBIT_U18_3BE,
2480 SNDRV_PCM_FMTBIT_FLOAT_LE | SNDRV_PCM_FMTBIT_FLOAT_BE,
2481 SNDRV_PCM_FMTBIT_FLOAT64_LE | SNDRV_PCM_FMTBIT_FLOAT64_BE,
2482 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
2483 | SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE,
2484};
2485
2486/* Fix up the DAI formats for endianness: codecs don't actually see
2487 * the endianness of the data but we're using the CPU format
2488 * definitions which do need to include endianness so we ensure that
2489 * codec DAIs always have both big and little endian variants set.
2490 */
2491static void fixup_codec_formats(struct snd_soc_pcm_stream *stream)
2492{
2493 int i;
2494
2495 for (i = 0; i < ARRAY_SIZE(codec_format_map); i++)
2496 if (stream->formats & codec_format_map[i])
2497 stream->formats |= codec_format_map[i];
2498}
2499
0d0cf00a
MB
2500/**
2501 * snd_soc_register_codec - Register a codec with the ASoC core
2502 *
ac11a2b3 2503 * @codec: codec to register
0d0cf00a
MB
2504 */
2505int snd_soc_register_codec(struct snd_soc_codec *codec)
2506{
151ab22c
MB
2507 int i;
2508
0d0cf00a
MB
2509 if (!codec->name)
2510 return -EINVAL;
2511
2512 /* The device should become mandatory over time */
2513 if (!codec->dev)
2514 printk(KERN_WARNING "No device for codec %s\n", codec->name);
2515
2516 INIT_LIST_HEAD(&codec->list);
2517
151ab22c
MB
2518 for (i = 0; i < codec->num_dai; i++) {
2519 fixup_codec_formats(&codec->dai[i].playback);
2520 fixup_codec_formats(&codec->dai[i].capture);
2521 }
2522
0d0cf00a
MB
2523 mutex_lock(&client_mutex);
2524 list_add(&codec->list, &codec_list);
2525 snd_soc_instantiate_cards();
2526 mutex_unlock(&client_mutex);
2527
2528 pr_debug("Registered codec '%s'\n", codec->name);
2529
2530 return 0;
2531}
2532EXPORT_SYMBOL_GPL(snd_soc_register_codec);
2533
2534/**
2535 * snd_soc_unregister_codec - Unregister a codec from the ASoC core
2536 *
ac11a2b3 2537 * @codec: codec to unregister
0d0cf00a
MB
2538 */
2539void snd_soc_unregister_codec(struct snd_soc_codec *codec)
2540{
2541 mutex_lock(&client_mutex);
2542 list_del(&codec->list);
2543 mutex_unlock(&client_mutex);
2544
2545 pr_debug("Unregistered codec '%s'\n", codec->name);
2546}
2547EXPORT_SYMBOL_GPL(snd_soc_unregister_codec);
2548
c9b3a40f 2549static int __init snd_soc_init(void)
db2a4165 2550{
384c89e2
MB
2551#ifdef CONFIG_DEBUG_FS
2552 debugfs_root = debugfs_create_dir("asoc", NULL);
2553 if (IS_ERR(debugfs_root) || !debugfs_root) {
2554 printk(KERN_WARNING
2555 "ASoC: Failed to create debugfs directory\n");
2556 debugfs_root = NULL;
2557 }
2558#endif
2559
db2a4165
FM
2560 return platform_driver_register(&soc_driver);
2561}
2562
7d8c16a6 2563static void __exit snd_soc_exit(void)
db2a4165 2564{
384c89e2
MB
2565#ifdef CONFIG_DEBUG_FS
2566 debugfs_remove_recursive(debugfs_root);
2567#endif
3ff3f64b 2568 platform_driver_unregister(&soc_driver);
db2a4165
FM
2569}
2570
2571module_init(snd_soc_init);
2572module_exit(snd_soc_exit);
2573
2574/* Module information */
d331124d 2575MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk");
db2a4165
FM
2576MODULE_DESCRIPTION("ALSA SoC Core");
2577MODULE_LICENSE("GPL");
8b45a209 2578MODULE_ALIAS("platform:soc-audio");
This page took 0.356946 seconds and 5 git commands to generate.