Merge remote-tracking branch 'asoc/fix/arizona' into asoc-linus
[linux-block.git] / sound / soc / soc-dapm.c
1 /*
2  * soc-dapm.c  --  ALSA SoC Dynamic Audio Power Management
3  *
4  * Copyright 2005 Wolfson Microelectronics PLC.
5  * Author: Liam Girdwood <lrg@slimlogic.co.uk>
6  *
7  *  This program is free software; you can redistribute  it and/or modify it
8  *  under  the terms of  the GNU General  Public License as published by the
9  *  Free Software Foundation;  either version 2 of the  License, or (at your
10  *  option) any later version.
11  *
12  *  Features:
13  *    o Changes power status of internal codec blocks depending on the
14  *      dynamic configuration of codec internal audio paths and active
15  *      DACs/ADCs.
16  *    o Platform power domain - can support external components i.e. amps and
17  *      mic/headphone insertion events.
18  *    o Automatic Mic Bias support
19  *    o Jack insertion power event initiation - e.g. hp insertion will enable
20  *      sinks, dacs, etc
21  *    o Delayed power down of audio subsystem to reduce pops between a quick
22  *      device reopen.
23  *
24  */
25
26 #include <linux/module.h>
27 #include <linux/moduleparam.h>
28 #include <linux/init.h>
29 #include <linux/async.h>
30 #include <linux/delay.h>
31 #include <linux/pm.h>
32 #include <linux/bitops.h>
33 #include <linux/platform_device.h>
34 #include <linux/jiffies.h>
35 #include <linux/debugfs.h>
36 #include <linux/pm_runtime.h>
37 #include <linux/regulator/consumer.h>
38 #include <linux/clk.h>
39 #include <linux/slab.h>
40 #include <sound/core.h>
41 #include <sound/pcm.h>
42 #include <sound/pcm_params.h>
43 #include <sound/soc.h>
44 #include <sound/initval.h>
45
46 #include <trace/events/asoc.h>
47
48 #define DAPM_UPDATE_STAT(widget, val) widget->dapm->card->dapm_stats.val++;
49
50 static int snd_soc_dapm_add_path(struct snd_soc_dapm_context *dapm,
51         struct snd_soc_dapm_widget *wsource, struct snd_soc_dapm_widget *wsink,
52         const char *control,
53         int (*connected)(struct snd_soc_dapm_widget *source,
54                          struct snd_soc_dapm_widget *sink));
55 static struct snd_soc_dapm_widget *
56 snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
57                          const struct snd_soc_dapm_widget *widget);
58
59 /* dapm power sequences - make this per codec in the future */
60 static int dapm_up_seq[] = {
61         [snd_soc_dapm_pre] = 0,
62         [snd_soc_dapm_regulator_supply] = 1,
63         [snd_soc_dapm_clock_supply] = 1,
64         [snd_soc_dapm_supply] = 2,
65         [snd_soc_dapm_micbias] = 3,
66         [snd_soc_dapm_dai_link] = 2,
67         [snd_soc_dapm_dai_in] = 4,
68         [snd_soc_dapm_dai_out] = 4,
69         [snd_soc_dapm_aif_in] = 4,
70         [snd_soc_dapm_aif_out] = 4,
71         [snd_soc_dapm_mic] = 5,
72         [snd_soc_dapm_mux] = 6,
73         [snd_soc_dapm_virt_mux] = 6,
74         [snd_soc_dapm_value_mux] = 6,
75         [snd_soc_dapm_dac] = 7,
76         [snd_soc_dapm_switch] = 8,
77         [snd_soc_dapm_mixer] = 8,
78         [snd_soc_dapm_mixer_named_ctl] = 8,
79         [snd_soc_dapm_pga] = 9,
80         [snd_soc_dapm_adc] = 10,
81         [snd_soc_dapm_out_drv] = 11,
82         [snd_soc_dapm_hp] = 11,
83         [snd_soc_dapm_spk] = 11,
84         [snd_soc_dapm_line] = 11,
85         [snd_soc_dapm_kcontrol] = 12,
86         [snd_soc_dapm_post] = 13,
87 };
88
89 static int dapm_down_seq[] = {
90         [snd_soc_dapm_pre] = 0,
91         [snd_soc_dapm_kcontrol] = 1,
92         [snd_soc_dapm_adc] = 2,
93         [snd_soc_dapm_hp] = 3,
94         [snd_soc_dapm_spk] = 3,
95         [snd_soc_dapm_line] = 3,
96         [snd_soc_dapm_out_drv] = 3,
97         [snd_soc_dapm_pga] = 4,
98         [snd_soc_dapm_switch] = 5,
99         [snd_soc_dapm_mixer_named_ctl] = 5,
100         [snd_soc_dapm_mixer] = 5,
101         [snd_soc_dapm_dac] = 6,
102         [snd_soc_dapm_mic] = 7,
103         [snd_soc_dapm_micbias] = 8,
104         [snd_soc_dapm_mux] = 9,
105         [snd_soc_dapm_virt_mux] = 9,
106         [snd_soc_dapm_value_mux] = 9,
107         [snd_soc_dapm_aif_in] = 10,
108         [snd_soc_dapm_aif_out] = 10,
109         [snd_soc_dapm_dai_in] = 10,
110         [snd_soc_dapm_dai_out] = 10,
111         [snd_soc_dapm_dai_link] = 11,
112         [snd_soc_dapm_supply] = 12,
113         [snd_soc_dapm_clock_supply] = 13,
114         [snd_soc_dapm_regulator_supply] = 13,
115         [snd_soc_dapm_post] = 14,
116 };
117
118 static void pop_wait(u32 pop_time)
119 {
120         if (pop_time)
121                 schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time));
122 }
123
124 static void pop_dbg(struct device *dev, u32 pop_time, const char *fmt, ...)
125 {
126         va_list args;
127         char *buf;
128
129         if (!pop_time)
130                 return;
131
132         buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
133         if (buf == NULL)
134                 return;
135
136         va_start(args, fmt);
137         vsnprintf(buf, PAGE_SIZE, fmt, args);
138         dev_info(dev, "%s", buf);
139         va_end(args);
140
141         kfree(buf);
142 }
143
144 static bool dapm_dirty_widget(struct snd_soc_dapm_widget *w)
145 {
146         return !list_empty(&w->dirty);
147 }
148
149 void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason)
150 {
151         if (!dapm_dirty_widget(w)) {
152                 dev_vdbg(w->dapm->dev, "Marking %s dirty due to %s\n",
153                          w->name, reason);
154                 list_add_tail(&w->dirty, &w->dapm->card->dapm_dirty);
155         }
156 }
157 EXPORT_SYMBOL_GPL(dapm_mark_dirty);
158
159 void dapm_mark_io_dirty(struct snd_soc_dapm_context *dapm)
160 {
161         struct snd_soc_card *card = dapm->card;
162         struct snd_soc_dapm_widget *w;
163
164         mutex_lock(&card->dapm_mutex);
165
166         list_for_each_entry(w, &card->widgets, list) {
167                 switch (w->id) {
168                 case snd_soc_dapm_input:
169                 case snd_soc_dapm_output:
170                         dapm_mark_dirty(w, "Rechecking inputs and outputs");
171                         break;
172                 default:
173                         break;
174                 }
175         }
176
177         mutex_unlock(&card->dapm_mutex);
178 }
179 EXPORT_SYMBOL_GPL(dapm_mark_io_dirty);
180
181 /* create a new dapm widget */
182 static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
183         const struct snd_soc_dapm_widget *_widget)
184 {
185         return kmemdup(_widget, sizeof(*_widget), GFP_KERNEL);
186 }
187
188 struct dapm_kcontrol_data {
189         unsigned int value;
190         struct snd_soc_dapm_widget *widget;
191         struct list_head paths;
192         struct snd_soc_dapm_widget_list *wlist;
193 };
194
195 static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
196         struct snd_kcontrol *kcontrol)
197 {
198         struct dapm_kcontrol_data *data;
199         struct soc_mixer_control *mc;
200
201         data = kzalloc(sizeof(*data), GFP_KERNEL);
202         if (!data) {
203                 dev_err(widget->dapm->dev,
204                                 "ASoC: can't allocate kcontrol data for %s\n",
205                                 widget->name);
206                 return -ENOMEM;
207         }
208
209         INIT_LIST_HEAD(&data->paths);
210
211         switch (widget->id) {
212         case snd_soc_dapm_switch:
213         case snd_soc_dapm_mixer:
214         case snd_soc_dapm_mixer_named_ctl:
215                 mc = (struct soc_mixer_control *)kcontrol->private_value;
216
217                 if (mc->autodisable) {
218                         struct snd_soc_dapm_widget template;
219
220                         memset(&template, 0, sizeof(template));
221                         template.reg = mc->reg;
222                         template.mask = (1 << fls(mc->max)) - 1;
223                         template.shift = mc->shift;
224                         if (mc->invert)
225                                 template.off_val = mc->max;
226                         else
227                                 template.off_val = 0;
228                         template.on_val = template.off_val;
229                         template.id = snd_soc_dapm_kcontrol;
230                         template.name = kcontrol->id.name;
231
232                         data->value = template.on_val;
233
234                         data->widget = snd_soc_dapm_new_control(widget->dapm,
235                                 &template);
236                         if (!data->widget) {
237                                 kfree(data);
238                                 return -ENOMEM;
239                         }
240                 }
241                 break;
242         default:
243                 break;
244         }
245
246         kcontrol->private_data = data;
247
248         return 0;
249 }
250
251 static void dapm_kcontrol_free(struct snd_kcontrol *kctl)
252 {
253         struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl);
254         kfree(data->widget);
255         kfree(data->wlist);
256         kfree(data);
257 }
258
259 static struct snd_soc_dapm_widget_list *dapm_kcontrol_get_wlist(
260         const struct snd_kcontrol *kcontrol)
261 {
262         struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
263
264         return data->wlist;
265 }
266
267 static int dapm_kcontrol_add_widget(struct snd_kcontrol *kcontrol,
268         struct snd_soc_dapm_widget *widget)
269 {
270         struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
271         struct snd_soc_dapm_widget_list *new_wlist;
272         unsigned int n;
273
274         if (data->wlist)
275                 n = data->wlist->num_widgets + 1;
276         else
277                 n = 1;
278
279         new_wlist = krealloc(data->wlist,
280                         sizeof(*new_wlist) + sizeof(widget) * n, GFP_KERNEL);
281         if (!new_wlist)
282                 return -ENOMEM;
283
284         new_wlist->widgets[n - 1] = widget;
285         new_wlist->num_widgets = n;
286
287         data->wlist = new_wlist;
288
289         return 0;
290 }
291
292 static void dapm_kcontrol_add_path(const struct snd_kcontrol *kcontrol,
293         struct snd_soc_dapm_path *path)
294 {
295         struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
296
297         list_add_tail(&path->list_kcontrol, &data->paths);
298
299         if (data->widget) {
300                 snd_soc_dapm_add_path(data->widget->dapm, data->widget,
301                     path->source, NULL, NULL);
302         }
303 }
304
305 static bool dapm_kcontrol_is_powered(const struct snd_kcontrol *kcontrol)
306 {
307         struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
308
309         if (!data->widget)
310                 return true;
311
312         return data->widget->power;
313 }
314
315 static struct list_head *dapm_kcontrol_get_path_list(
316         const struct snd_kcontrol *kcontrol)
317 {
318         struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
319
320         return &data->paths;
321 }
322
323 #define dapm_kcontrol_for_each_path(path, kcontrol) \
324         list_for_each_entry(path, dapm_kcontrol_get_path_list(kcontrol), \
325                 list_kcontrol)
326
327 static unsigned int dapm_kcontrol_get_value(const struct snd_kcontrol *kcontrol)
328 {
329         struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
330
331         return data->value;
332 }
333
334 static bool dapm_kcontrol_set_value(const struct snd_kcontrol *kcontrol,
335         unsigned int value)
336 {
337         struct dapm_kcontrol_data *data = snd_kcontrol_chip(kcontrol);
338
339         if (data->value == value)
340                 return false;
341
342         if (data->widget)
343                 data->widget->on_val = value;
344
345         data->value = value;
346
347         return true;
348 }
349
350 /**
351  * snd_soc_dapm_kcontrol_codec() - Returns the codec associated to a kcontrol
352  * @kcontrol: The kcontrol
353  */
354 struct snd_soc_codec *snd_soc_dapm_kcontrol_codec(struct snd_kcontrol *kcontrol)
355 {
356         return dapm_kcontrol_get_wlist(kcontrol)->widgets[0]->codec;
357 }
358 EXPORT_SYMBOL_GPL(snd_soc_dapm_kcontrol_codec);
359
360 static void dapm_reset(struct snd_soc_card *card)
361 {
362         struct snd_soc_dapm_widget *w;
363
364         memset(&card->dapm_stats, 0, sizeof(card->dapm_stats));
365
366         list_for_each_entry(w, &card->widgets, list) {
367                 w->new_power = w->power;
368                 w->power_checked = false;
369                 w->inputs = -1;
370                 w->outputs = -1;
371         }
372 }
373
374 static int soc_widget_read(struct snd_soc_dapm_widget *w, int reg)
375 {
376         if (w->codec)
377                 return snd_soc_read(w->codec, reg);
378         else if (w->platform)
379                 return snd_soc_platform_read(w->platform, reg);
380
381         dev_err(w->dapm->dev, "ASoC: no valid widget read method\n");
382         return -1;
383 }
384
385 static int soc_widget_write(struct snd_soc_dapm_widget *w, int reg, int val)
386 {
387         if (w->codec)
388                 return snd_soc_write(w->codec, reg, val);
389         else if (w->platform)
390                 return snd_soc_platform_write(w->platform, reg, val);
391
392         dev_err(w->dapm->dev, "ASoC: no valid widget write method\n");
393         return -1;
394 }
395
396 static inline void soc_widget_lock(struct snd_soc_dapm_widget *w)
397 {
398         if (w->codec && !w->codec->using_regmap)
399                 mutex_lock(&w->codec->mutex);
400         else if (w->platform)
401                 mutex_lock(&w->platform->mutex);
402 }
403
404 static inline void soc_widget_unlock(struct snd_soc_dapm_widget *w)
405 {
406         if (w->codec && !w->codec->using_regmap)
407                 mutex_unlock(&w->codec->mutex);
408         else if (w->platform)
409                 mutex_unlock(&w->platform->mutex);
410 }
411
412 static void soc_dapm_async_complete(struct snd_soc_dapm_context *dapm)
413 {
414         if (dapm->codec && dapm->codec->using_regmap)
415                 regmap_async_complete(dapm->codec->control_data);
416 }
417
418 static int soc_widget_update_bits_locked(struct snd_soc_dapm_widget *w,
419         unsigned short reg, unsigned int mask, unsigned int value)
420 {
421         bool change;
422         unsigned int old, new;
423         int ret;
424
425         if (w->codec && w->codec->using_regmap) {
426                 ret = regmap_update_bits_check_async(w->codec->control_data,
427                                                      reg, mask, value,
428                                                      &change);
429                 if (ret != 0)
430                         return ret;
431         } else {
432                 soc_widget_lock(w);
433                 ret = soc_widget_read(w, reg);
434                 if (ret < 0) {
435                         soc_widget_unlock(w);
436                         return ret;
437                 }
438
439                 old = ret;
440                 new = (old & ~mask) | (value & mask);
441                 change = old != new;
442                 if (change) {
443                         ret = soc_widget_write(w, reg, new);
444                         if (ret < 0) {
445                                 soc_widget_unlock(w);
446                                 return ret;
447                         }
448                 }
449                 soc_widget_unlock(w);
450         }
451
452         return change;
453 }
454
455 /**
456  * snd_soc_dapm_set_bias_level - set the bias level for the system
457  * @dapm: DAPM context
458  * @level: level to configure
459  *
460  * Configure the bias (power) levels for the SoC audio device.
461  *
462  * Returns 0 for success else error.
463  */
464 static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm,
465                                        enum snd_soc_bias_level level)
466 {
467         struct snd_soc_card *card = dapm->card;
468         int ret = 0;
469
470         trace_snd_soc_bias_level_start(card, level);
471
472         if (card && card->set_bias_level)
473                 ret = card->set_bias_level(card, dapm, level);
474         if (ret != 0)
475                 goto out;
476
477         if (dapm->codec) {
478                 if (dapm->codec->driver->set_bias_level)
479                         ret = dapm->codec->driver->set_bias_level(dapm->codec,
480                                                                   level);
481                 else
482                         dapm->bias_level = level;
483         } else if (!card || dapm != &card->dapm) {
484                 dapm->bias_level = level;
485         }
486
487         if (ret != 0)
488                 goto out;
489
490         if (card && card->set_bias_level_post)
491                 ret = card->set_bias_level_post(card, dapm, level);
492 out:
493         trace_snd_soc_bias_level_done(card, level);
494
495         return ret;
496 }
497
498 /* set up initial codec paths */
499 static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
500         struct snd_soc_dapm_path *p, int i)
501 {
502         switch (w->id) {
503         case snd_soc_dapm_switch:
504         case snd_soc_dapm_mixer:
505         case snd_soc_dapm_mixer_named_ctl: {
506                 int val;
507                 struct soc_mixer_control *mc = (struct soc_mixer_control *)
508                         w->kcontrol_news[i].private_value;
509                 int reg = mc->reg;
510                 unsigned int shift = mc->shift;
511                 int max = mc->max;
512                 unsigned int mask = (1 << fls(max)) - 1;
513                 unsigned int invert = mc->invert;
514
515                 if (reg != SND_SOC_NOPM) {
516                         val = soc_widget_read(w, reg);
517                         val = (val >> shift) & mask;
518                         if (invert)
519                                 val = max - val;
520                         p->connect = !!val;
521                 } else {
522                         p->connect = 0;
523                 }
524
525         }
526         break;
527         case snd_soc_dapm_mux: {
528                 struct soc_enum *e = (struct soc_enum *)
529                         w->kcontrol_news[i].private_value;
530                 int val, item;
531
532                 val = soc_widget_read(w, e->reg);
533                 item = (val >> e->shift_l) & e->mask;
534
535                 if (item < e->max && !strcmp(p->name, e->texts[item]))
536                         p->connect = 1;
537                 else
538                         p->connect = 0;
539         }
540         break;
541         case snd_soc_dapm_virt_mux: {
542                 struct soc_enum *e = (struct soc_enum *)
543                         w->kcontrol_news[i].private_value;
544
545                 p->connect = 0;
546                 /* since a virtual mux has no backing registers to
547                  * decide which path to connect, it will try to match
548                  * with the first enumeration.  This is to ensure
549                  * that the default mux choice (the first) will be
550                  * correctly powered up during initialization.
551                  */
552                 if (!strcmp(p->name, e->texts[0]))
553                         p->connect = 1;
554         }
555         break;
556         case snd_soc_dapm_value_mux: {
557                 struct soc_enum *e = (struct soc_enum *)
558                         w->kcontrol_news[i].private_value;
559                 int val, item;
560
561                 val = soc_widget_read(w, e->reg);
562                 val = (val >> e->shift_l) & e->mask;
563                 for (item = 0; item < e->max; item++) {
564                         if (val == e->values[item])
565                                 break;
566                 }
567
568                 if (item < e->max && !strcmp(p->name, e->texts[item]))
569                         p->connect = 1;
570                 else
571                         p->connect = 0;
572         }
573         break;
574         /* does not affect routing - always connected */
575         case snd_soc_dapm_pga:
576         case snd_soc_dapm_out_drv:
577         case snd_soc_dapm_output:
578         case snd_soc_dapm_adc:
579         case snd_soc_dapm_input:
580         case snd_soc_dapm_siggen:
581         case snd_soc_dapm_dac:
582         case snd_soc_dapm_micbias:
583         case snd_soc_dapm_vmid:
584         case snd_soc_dapm_supply:
585         case snd_soc_dapm_regulator_supply:
586         case snd_soc_dapm_clock_supply:
587         case snd_soc_dapm_aif_in:
588         case snd_soc_dapm_aif_out:
589         case snd_soc_dapm_dai_in:
590         case snd_soc_dapm_dai_out:
591         case snd_soc_dapm_hp:
592         case snd_soc_dapm_mic:
593         case snd_soc_dapm_spk:
594         case snd_soc_dapm_line:
595         case snd_soc_dapm_dai_link:
596         case snd_soc_dapm_kcontrol:
597                 p->connect = 1;
598         break;
599         /* does affect routing - dynamically connected */
600         case snd_soc_dapm_pre:
601         case snd_soc_dapm_post:
602                 p->connect = 0;
603         break;
604         }
605 }
606
607 /* connect mux widget to its interconnecting audio paths */
608 static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
609         struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
610         struct snd_soc_dapm_path *path, const char *control_name,
611         const struct snd_kcontrol_new *kcontrol)
612 {
613         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
614         int i;
615
616         for (i = 0; i < e->max; i++) {
617                 if (!(strcmp(control_name, e->texts[i]))) {
618                         list_add(&path->list, &dapm->card->paths);
619                         list_add(&path->list_sink, &dest->sources);
620                         list_add(&path->list_source, &src->sinks);
621                         path->name = (char*)e->texts[i];
622                         dapm_set_path_status(dest, path, 0);
623                         return 0;
624                 }
625         }
626
627         return -ENODEV;
628 }
629
630 /* connect mixer widget to its interconnecting audio paths */
631 static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm,
632         struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
633         struct snd_soc_dapm_path *path, const char *control_name)
634 {
635         int i;
636
637         /* search for mixer kcontrol */
638         for (i = 0; i < dest->num_kcontrols; i++) {
639                 if (!strcmp(control_name, dest->kcontrol_news[i].name)) {
640                         list_add(&path->list, &dapm->card->paths);
641                         list_add(&path->list_sink, &dest->sources);
642                         list_add(&path->list_source, &src->sinks);
643                         path->name = dest->kcontrol_news[i].name;
644                         dapm_set_path_status(dest, path, i);
645                         return 0;
646                 }
647         }
648         return -ENODEV;
649 }
650
651 static int dapm_is_shared_kcontrol(struct snd_soc_dapm_context *dapm,
652         struct snd_soc_dapm_widget *kcontrolw,
653         const struct snd_kcontrol_new *kcontrol_new,
654         struct snd_kcontrol **kcontrol)
655 {
656         struct snd_soc_dapm_widget *w;
657         int i;
658
659         *kcontrol = NULL;
660
661         list_for_each_entry(w, &dapm->card->widgets, list) {
662                 if (w == kcontrolw || w->dapm != kcontrolw->dapm)
663                         continue;
664                 for (i = 0; i < w->num_kcontrols; i++) {
665                         if (&w->kcontrol_news[i] == kcontrol_new) {
666                                 if (w->kcontrols)
667                                         *kcontrol = w->kcontrols[i];
668                                 return 1;
669                         }
670                 }
671         }
672
673         return 0;
674 }
675
676 /*
677  * Determine if a kcontrol is shared. If it is, look it up. If it isn't,
678  * create it. Either way, add the widget into the control's widget list
679  */
680 static int dapm_create_or_share_mixmux_kcontrol(struct snd_soc_dapm_widget *w,
681         int kci)
682 {
683         struct snd_soc_dapm_context *dapm = w->dapm;
684         struct snd_card *card = dapm->card->snd_card;
685         const char *prefix;
686         size_t prefix_len;
687         int shared;
688         struct snd_kcontrol *kcontrol;
689         bool wname_in_long_name, kcname_in_long_name;
690         char *long_name;
691         const char *name;
692         int ret;
693
694         if (dapm->codec)
695                 prefix = dapm->codec->name_prefix;
696         else
697                 prefix = NULL;
698
699         if (prefix)
700                 prefix_len = strlen(prefix) + 1;
701         else
702                 prefix_len = 0;
703
704         shared = dapm_is_shared_kcontrol(dapm, w, &w->kcontrol_news[kci],
705                                          &kcontrol);
706
707         if (!kcontrol) {
708                 if (shared) {
709                         wname_in_long_name = false;
710                         kcname_in_long_name = true;
711                 } else {
712                         switch (w->id) {
713                         case snd_soc_dapm_switch:
714                         case snd_soc_dapm_mixer:
715                                 wname_in_long_name = true;
716                                 kcname_in_long_name = true;
717                                 break;
718                         case snd_soc_dapm_mixer_named_ctl:
719                                 wname_in_long_name = false;
720                                 kcname_in_long_name = true;
721                                 break;
722                         case snd_soc_dapm_mux:
723                         case snd_soc_dapm_virt_mux:
724                         case snd_soc_dapm_value_mux:
725                                 wname_in_long_name = true;
726                                 kcname_in_long_name = false;
727                                 break;
728                         default:
729                                 return -EINVAL;
730                         }
731                 }
732
733                 if (wname_in_long_name && kcname_in_long_name) {
734                         /*
735                          * The control will get a prefix from the control
736                          * creation process but we're also using the same
737                          * prefix for widgets so cut the prefix off the
738                          * front of the widget name.
739                          */
740                         long_name = kasprintf(GFP_KERNEL, "%s %s",
741                                  w->name + prefix_len,
742                                  w->kcontrol_news[kci].name);
743                         if (long_name == NULL)
744                                 return -ENOMEM;
745
746                         name = long_name;
747                 } else if (wname_in_long_name) {
748                         long_name = NULL;
749                         name = w->name + prefix_len;
750                 } else {
751                         long_name = NULL;
752                         name = w->kcontrol_news[kci].name;
753                 }
754
755                 kcontrol = snd_soc_cnew(&w->kcontrol_news[kci], NULL, name,
756                                         prefix);
757                 kfree(long_name);
758                 if (!kcontrol)
759                         return -ENOMEM;
760                 kcontrol->private_free = dapm_kcontrol_free;
761
762                 ret = dapm_kcontrol_data_alloc(w, kcontrol);
763                 if (ret) {
764                         snd_ctl_free_one(kcontrol);
765                         return ret;
766                 }
767
768                 ret = snd_ctl_add(card, kcontrol);
769                 if (ret < 0) {
770                         dev_err(dapm->dev,
771                                 "ASoC: failed to add widget %s dapm kcontrol %s: %d\n",
772                                 w->name, name, ret);
773                         return ret;
774                 }
775         }
776
777         ret = dapm_kcontrol_add_widget(kcontrol, w);
778         if (ret)
779                 return ret;
780
781         w->kcontrols[kci] = kcontrol;
782
783         return 0;
784 }
785
786 /* create new dapm mixer control */
787 static int dapm_new_mixer(struct snd_soc_dapm_widget *w)
788 {
789         int i, ret;
790         struct snd_soc_dapm_path *path;
791
792         /* add kcontrol */
793         for (i = 0; i < w->num_kcontrols; i++) {
794                 /* match name */
795                 list_for_each_entry(path, &w->sources, list_sink) {
796                         /* mixer/mux paths name must match control name */
797                         if (path->name != (char *)w->kcontrol_news[i].name)
798                                 continue;
799
800                         if (w->kcontrols[i]) {
801                                 dapm_kcontrol_add_path(w->kcontrols[i], path);
802                                 continue;
803                         }
804
805                         ret = dapm_create_or_share_mixmux_kcontrol(w, i);
806                         if (ret < 0)
807                                 return ret;
808
809                         dapm_kcontrol_add_path(w->kcontrols[i], path);
810                 }
811         }
812
813         return 0;
814 }
815
816 /* create new dapm mux control */
817 static int dapm_new_mux(struct snd_soc_dapm_widget *w)
818 {
819         struct snd_soc_dapm_context *dapm = w->dapm;
820         struct snd_soc_dapm_path *path;
821         int ret;
822
823         if (w->num_kcontrols != 1) {
824                 dev_err(dapm->dev,
825                         "ASoC: mux %s has incorrect number of controls\n",
826                         w->name);
827                 return -EINVAL;
828         }
829
830         if (list_empty(&w->sources)) {
831                 dev_err(dapm->dev, "ASoC: mux %s has no paths\n", w->name);
832                 return -EINVAL;
833         }
834
835         ret = dapm_create_or_share_mixmux_kcontrol(w, 0);
836         if (ret < 0)
837                 return ret;
838
839         list_for_each_entry(path, &w->sources, list_sink)
840                 dapm_kcontrol_add_path(w->kcontrols[0], path);
841
842         return 0;
843 }
844
845 /* create new dapm volume control */
846 static int dapm_new_pga(struct snd_soc_dapm_widget *w)
847 {
848         if (w->num_kcontrols)
849                 dev_err(w->dapm->dev,
850                         "ASoC: PGA controls not supported: '%s'\n", w->name);
851
852         return 0;
853 }
854
855 /* reset 'walked' bit for each dapm path */
856 static void dapm_clear_walk_output(struct snd_soc_dapm_context *dapm,
857                                    struct list_head *sink)
858 {
859         struct snd_soc_dapm_path *p;
860
861         list_for_each_entry(p, sink, list_source) {
862                 if (p->walked) {
863                         p->walked = 0;
864                         dapm_clear_walk_output(dapm, &p->sink->sinks);
865                 }
866         }
867 }
868
869 static void dapm_clear_walk_input(struct snd_soc_dapm_context *dapm,
870                                   struct list_head *source)
871 {
872         struct snd_soc_dapm_path *p;
873
874         list_for_each_entry(p, source, list_sink) {
875                 if (p->walked) {
876                         p->walked = 0;
877                         dapm_clear_walk_input(dapm, &p->source->sources);
878                 }
879         }
880 }
881
882
883 /* We implement power down on suspend by checking the power state of
884  * the ALSA card - when we are suspending the ALSA state for the card
885  * is set to D3.
886  */
887 static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget)
888 {
889         int level = snd_power_get_state(widget->dapm->card->snd_card);
890
891         switch (level) {
892         case SNDRV_CTL_POWER_D3hot:
893         case SNDRV_CTL_POWER_D3cold:
894                 if (widget->ignore_suspend)
895                         dev_dbg(widget->dapm->dev, "ASoC: %s ignoring suspend\n",
896                                 widget->name);
897                 return widget->ignore_suspend;
898         default:
899                 return 1;
900         }
901 }
902
903 /* add widget to list if it's not already in the list */
904 static int dapm_list_add_widget(struct snd_soc_dapm_widget_list **list,
905         struct snd_soc_dapm_widget *w)
906 {
907         struct snd_soc_dapm_widget_list *wlist;
908         int wlistsize, wlistentries, i;
909
910         if (*list == NULL)
911                 return -EINVAL;
912
913         wlist = *list;
914
915         /* is this widget already in the list */
916         for (i = 0; i < wlist->num_widgets; i++) {
917                 if (wlist->widgets[i] == w)
918                         return 0;
919         }
920
921         /* allocate some new space */
922         wlistentries = wlist->num_widgets + 1;
923         wlistsize = sizeof(struct snd_soc_dapm_widget_list) +
924                         wlistentries * sizeof(struct snd_soc_dapm_widget *);
925         *list = krealloc(wlist, wlistsize, GFP_KERNEL);
926         if (*list == NULL) {
927                 dev_err(w->dapm->dev, "ASoC: can't allocate widget list for %s\n",
928                         w->name);
929                 return -ENOMEM;
930         }
931         wlist = *list;
932
933         /* insert the widget */
934         dev_dbg(w->dapm->dev, "ASoC: added %s in widget list pos %d\n",
935                         w->name, wlist->num_widgets);
936
937         wlist->widgets[wlist->num_widgets] = w;
938         wlist->num_widgets++;
939         return 1;
940 }
941
942 /*
943  * Recursively check for a completed path to an active or physically connected
944  * output widget. Returns number of complete paths.
945  */
946 static int is_connected_output_ep(struct snd_soc_dapm_widget *widget,
947         struct snd_soc_dapm_widget_list **list)
948 {
949         struct snd_soc_dapm_path *path;
950         int con = 0;
951
952         if (widget->outputs >= 0)
953                 return widget->outputs;
954
955         DAPM_UPDATE_STAT(widget, path_checks);
956
957         switch (widget->id) {
958         case snd_soc_dapm_supply:
959         case snd_soc_dapm_regulator_supply:
960         case snd_soc_dapm_clock_supply:
961         case snd_soc_dapm_kcontrol:
962                 return 0;
963         default:
964                 break;
965         }
966
967         switch (widget->id) {
968         case snd_soc_dapm_adc:
969         case snd_soc_dapm_aif_out:
970         case snd_soc_dapm_dai_out:
971                 if (widget->active) {
972                         widget->outputs = snd_soc_dapm_suspend_check(widget);
973                         return widget->outputs;
974                 }
975         default:
976                 break;
977         }
978
979         if (widget->connected) {
980                 /* connected pin ? */
981                 if (widget->id == snd_soc_dapm_output && !widget->ext) {
982                         widget->outputs = snd_soc_dapm_suspend_check(widget);
983                         return widget->outputs;
984                 }
985
986                 /* connected jack or spk ? */
987                 if (widget->id == snd_soc_dapm_hp ||
988                     widget->id == snd_soc_dapm_spk ||
989                     (widget->id == snd_soc_dapm_line &&
990                      !list_empty(&widget->sources))) {
991                         widget->outputs = snd_soc_dapm_suspend_check(widget);
992                         return widget->outputs;
993                 }
994         }
995
996         list_for_each_entry(path, &widget->sinks, list_source) {
997                 DAPM_UPDATE_STAT(widget, neighbour_checks);
998
999                 if (path->weak)
1000                         continue;
1001
1002                 if (path->walking)
1003                         return 1;
1004
1005                 if (path->walked)
1006                         continue;
1007
1008                 trace_snd_soc_dapm_output_path(widget, path);
1009
1010                 if (path->sink && path->connect) {
1011                         path->walked = 1;
1012                         path->walking = 1;
1013
1014                         /* do we need to add this widget to the list ? */
1015                         if (list) {
1016                                 int err;
1017                                 err = dapm_list_add_widget(list, path->sink);
1018                                 if (err < 0) {
1019                                         dev_err(widget->dapm->dev,
1020                                                 "ASoC: could not add widget %s\n",
1021                                                 widget->name);
1022                                         path->walking = 0;
1023                                         return con;
1024                                 }
1025                         }
1026
1027                         con += is_connected_output_ep(path->sink, list);
1028
1029                         path->walking = 0;
1030                 }
1031         }
1032
1033         widget->outputs = con;
1034
1035         return con;
1036 }
1037
1038 /*
1039  * Recursively check for a completed path to an active or physically connected
1040  * input widget. Returns number of complete paths.
1041  */
1042 static int is_connected_input_ep(struct snd_soc_dapm_widget *widget,
1043         struct snd_soc_dapm_widget_list **list)
1044 {
1045         struct snd_soc_dapm_path *path;
1046         int con = 0;
1047
1048         if (widget->inputs >= 0)
1049                 return widget->inputs;
1050
1051         DAPM_UPDATE_STAT(widget, path_checks);
1052
1053         switch (widget->id) {
1054         case snd_soc_dapm_supply:
1055         case snd_soc_dapm_regulator_supply:
1056         case snd_soc_dapm_clock_supply:
1057         case snd_soc_dapm_kcontrol:
1058                 return 0;
1059         default:
1060                 break;
1061         }
1062
1063         /* active stream ? */
1064         switch (widget->id) {
1065         case snd_soc_dapm_dac:
1066         case snd_soc_dapm_aif_in:
1067         case snd_soc_dapm_dai_in:
1068                 if (widget->active) {
1069                         widget->inputs = snd_soc_dapm_suspend_check(widget);
1070                         return widget->inputs;
1071                 }
1072         default:
1073                 break;
1074         }
1075
1076         if (widget->connected) {
1077                 /* connected pin ? */
1078                 if (widget->id == snd_soc_dapm_input && !widget->ext) {
1079                         widget->inputs = snd_soc_dapm_suspend_check(widget);
1080                         return widget->inputs;
1081                 }
1082
1083                 /* connected VMID/Bias for lower pops */
1084                 if (widget->id == snd_soc_dapm_vmid) {
1085                         widget->inputs = snd_soc_dapm_suspend_check(widget);
1086                         return widget->inputs;
1087                 }
1088
1089                 /* connected jack ? */
1090                 if (widget->id == snd_soc_dapm_mic ||
1091                     (widget->id == snd_soc_dapm_line &&
1092                      !list_empty(&widget->sinks))) {
1093                         widget->inputs = snd_soc_dapm_suspend_check(widget);
1094                         return widget->inputs;
1095                 }
1096
1097                 /* signal generator */
1098                 if (widget->id == snd_soc_dapm_siggen) {
1099                         widget->inputs = snd_soc_dapm_suspend_check(widget);
1100                         return widget->inputs;
1101                 }
1102         }
1103
1104         list_for_each_entry(path, &widget->sources, list_sink) {
1105                 DAPM_UPDATE_STAT(widget, neighbour_checks);
1106
1107                 if (path->weak)
1108                         continue;
1109
1110                 if (path->walking)
1111                         return 1;
1112
1113                 if (path->walked)
1114                         continue;
1115
1116                 trace_snd_soc_dapm_input_path(widget, path);
1117
1118                 if (path->source && path->connect) {
1119                         path->walked = 1;
1120                         path->walking = 1;
1121
1122                         /* do we need to add this widget to the list ? */
1123                         if (list) {
1124                                 int err;
1125                                 err = dapm_list_add_widget(list, path->source);
1126                                 if (err < 0) {
1127                                         dev_err(widget->dapm->dev,
1128                                                 "ASoC: could not add widget %s\n",
1129                                                 widget->name);
1130                                         path->walking = 0;
1131                                         return con;
1132                                 }
1133                         }
1134
1135                         con += is_connected_input_ep(path->source, list);
1136
1137                         path->walking = 0;
1138                 }
1139         }
1140
1141         widget->inputs = con;
1142
1143         return con;
1144 }
1145
1146 /**
1147  * snd_soc_dapm_get_connected_widgets - query audio path and it's widgets.
1148  * @dai: the soc DAI.
1149  * @stream: stream direction.
1150  * @list: list of active widgets for this stream.
1151  *
1152  * Queries DAPM graph as to whether an valid audio stream path exists for
1153  * the initial stream specified by name. This takes into account
1154  * current mixer and mux kcontrol settings. Creates list of valid widgets.
1155  *
1156  * Returns the number of valid paths or negative error.
1157  */
1158 int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream,
1159         struct snd_soc_dapm_widget_list **list)
1160 {
1161         struct snd_soc_card *card = dai->card;
1162         int paths;
1163
1164         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
1165         dapm_reset(card);
1166
1167         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
1168                 paths = is_connected_output_ep(dai->playback_widget, list);
1169                 dapm_clear_walk_output(&card->dapm,
1170                                        &dai->playback_widget->sinks);
1171         } else {
1172                 paths = is_connected_input_ep(dai->capture_widget, list);
1173                 dapm_clear_walk_input(&card->dapm,
1174                                       &dai->capture_widget->sources);
1175         }
1176
1177         trace_snd_soc_dapm_connected(paths, stream);
1178         mutex_unlock(&card->dapm_mutex);
1179
1180         return paths;
1181 }
1182
1183 /*
1184  * Handler for generic register modifier widget.
1185  */
1186 int dapm_reg_event(struct snd_soc_dapm_widget *w,
1187                    struct snd_kcontrol *kcontrol, int event)
1188 {
1189         unsigned int val;
1190
1191         if (SND_SOC_DAPM_EVENT_ON(event))
1192                 val = w->on_val;
1193         else
1194                 val = w->off_val;
1195
1196         soc_widget_update_bits_locked(w, -(w->reg + 1),
1197                             w->mask << w->shift, val << w->shift);
1198
1199         return 0;
1200 }
1201 EXPORT_SYMBOL_GPL(dapm_reg_event);
1202
1203 /*
1204  * Handler for regulator supply widget.
1205  */
1206 int dapm_regulator_event(struct snd_soc_dapm_widget *w,
1207                    struct snd_kcontrol *kcontrol, int event)
1208 {
1209         int ret;
1210
1211         soc_dapm_async_complete(w->dapm);
1212
1213         if (SND_SOC_DAPM_EVENT_ON(event)) {
1214                 if (w->on_val & SND_SOC_DAPM_REGULATOR_BYPASS) {
1215                         ret = regulator_allow_bypass(w->regulator, false);
1216                         if (ret != 0)
1217                                 dev_warn(w->dapm->dev,
1218                                          "ASoC: Failed to bypass %s: %d\n",
1219                                          w->name, ret);
1220                 }
1221
1222                 return regulator_enable(w->regulator);
1223         } else {
1224                 if (w->on_val & SND_SOC_DAPM_REGULATOR_BYPASS) {
1225                         ret = regulator_allow_bypass(w->regulator, true);
1226                         if (ret != 0)
1227                                 dev_warn(w->dapm->dev,
1228                                          "ASoC: Failed to unbypass %s: %d\n",
1229                                          w->name, ret);
1230                 }
1231
1232                 return regulator_disable_deferred(w->regulator, w->shift);
1233         }
1234 }
1235 EXPORT_SYMBOL_GPL(dapm_regulator_event);
1236
1237 /*
1238  * Handler for clock supply widget.
1239  */
1240 int dapm_clock_event(struct snd_soc_dapm_widget *w,
1241                    struct snd_kcontrol *kcontrol, int event)
1242 {
1243         if (!w->clk)
1244                 return -EIO;
1245
1246         soc_dapm_async_complete(w->dapm);
1247
1248 #ifdef CONFIG_HAVE_CLK
1249         if (SND_SOC_DAPM_EVENT_ON(event)) {
1250                 return clk_prepare_enable(w->clk);
1251         } else {
1252                 clk_disable_unprepare(w->clk);
1253                 return 0;
1254         }
1255 #endif
1256         return 0;
1257 }
1258 EXPORT_SYMBOL_GPL(dapm_clock_event);
1259
1260 static int dapm_widget_power_check(struct snd_soc_dapm_widget *w)
1261 {
1262         if (w->power_checked)
1263                 return w->new_power;
1264
1265         if (w->force)
1266                 w->new_power = 1;
1267         else
1268                 w->new_power = w->power_check(w);
1269
1270         w->power_checked = true;
1271
1272         return w->new_power;
1273 }
1274
1275 /* Generic check to see if a widget should be powered.
1276  */
1277 static int dapm_generic_check_power(struct snd_soc_dapm_widget *w)
1278 {
1279         int in, out;
1280
1281         DAPM_UPDATE_STAT(w, power_checks);
1282
1283         in = is_connected_input_ep(w, NULL);
1284         dapm_clear_walk_input(w->dapm, &w->sources);
1285         out = is_connected_output_ep(w, NULL);
1286         dapm_clear_walk_output(w->dapm, &w->sinks);
1287         return out != 0 && in != 0;
1288 }
1289
1290 /* Check to see if an ADC has power */
1291 static int dapm_adc_check_power(struct snd_soc_dapm_widget *w)
1292 {
1293         int in;
1294
1295         DAPM_UPDATE_STAT(w, power_checks);
1296
1297         if (w->active) {
1298                 in = is_connected_input_ep(w, NULL);
1299                 dapm_clear_walk_input(w->dapm, &w->sources);
1300                 return in != 0;
1301         } else {
1302                 return dapm_generic_check_power(w);
1303         }
1304 }
1305
1306 /* Check to see if a DAC has power */
1307 static int dapm_dac_check_power(struct snd_soc_dapm_widget *w)
1308 {
1309         int out;
1310
1311         DAPM_UPDATE_STAT(w, power_checks);
1312
1313         if (w->active) {
1314                 out = is_connected_output_ep(w, NULL);
1315                 dapm_clear_walk_output(w->dapm, &w->sinks);
1316                 return out != 0;
1317         } else {
1318                 return dapm_generic_check_power(w);
1319         }
1320 }
1321
1322 /* Check to see if a power supply is needed */
1323 static int dapm_supply_check_power(struct snd_soc_dapm_widget *w)
1324 {
1325         struct snd_soc_dapm_path *path;
1326
1327         DAPM_UPDATE_STAT(w, power_checks);
1328
1329         /* Check if one of our outputs is connected */
1330         list_for_each_entry(path, &w->sinks, list_source) {
1331                 DAPM_UPDATE_STAT(w, neighbour_checks);
1332
1333                 if (path->weak)
1334                         continue;
1335
1336                 if (path->connected &&
1337                     !path->connected(path->source, path->sink))
1338                         continue;
1339
1340                 if (!path->sink)
1341                         continue;
1342
1343                 if (dapm_widget_power_check(path->sink))
1344                         return 1;
1345         }
1346
1347         return 0;
1348 }
1349
1350 static int dapm_always_on_check_power(struct snd_soc_dapm_widget *w)
1351 {
1352         return 1;
1353 }
1354
1355 static int dapm_seq_compare(struct snd_soc_dapm_widget *a,
1356                             struct snd_soc_dapm_widget *b,
1357                             bool power_up)
1358 {
1359         int *sort;
1360
1361         if (power_up)
1362                 sort = dapm_up_seq;
1363         else
1364                 sort = dapm_down_seq;
1365
1366         if (sort[a->id] != sort[b->id])
1367                 return sort[a->id] - sort[b->id];
1368         if (a->subseq != b->subseq) {
1369                 if (power_up)
1370                         return a->subseq - b->subseq;
1371                 else
1372                         return b->subseq - a->subseq;
1373         }
1374         if (a->reg != b->reg)
1375                 return a->reg - b->reg;
1376         if (a->dapm != b->dapm)
1377                 return (unsigned long)a->dapm - (unsigned long)b->dapm;
1378
1379         return 0;
1380 }
1381
1382 /* Insert a widget in order into a DAPM power sequence. */
1383 static void dapm_seq_insert(struct snd_soc_dapm_widget *new_widget,
1384                             struct list_head *list,
1385                             bool power_up)
1386 {
1387         struct snd_soc_dapm_widget *w;
1388
1389         list_for_each_entry(w, list, power_list)
1390                 if (dapm_seq_compare(new_widget, w, power_up) < 0) {
1391                         list_add_tail(&new_widget->power_list, &w->power_list);
1392                         return;
1393                 }
1394
1395         list_add_tail(&new_widget->power_list, list);
1396 }
1397
1398 static void dapm_seq_check_event(struct snd_soc_card *card,
1399                                  struct snd_soc_dapm_widget *w, int event)
1400 {
1401         const char *ev_name;
1402         int power, ret;
1403
1404         switch (event) {
1405         case SND_SOC_DAPM_PRE_PMU:
1406                 ev_name = "PRE_PMU";
1407                 power = 1;
1408                 break;
1409         case SND_SOC_DAPM_POST_PMU:
1410                 ev_name = "POST_PMU";
1411                 power = 1;
1412                 break;
1413         case SND_SOC_DAPM_PRE_PMD:
1414                 ev_name = "PRE_PMD";
1415                 power = 0;
1416                 break;
1417         case SND_SOC_DAPM_POST_PMD:
1418                 ev_name = "POST_PMD";
1419                 power = 0;
1420                 break;
1421         case SND_SOC_DAPM_WILL_PMU:
1422                 ev_name = "WILL_PMU";
1423                 power = 1;
1424                 break;
1425         case SND_SOC_DAPM_WILL_PMD:
1426                 ev_name = "WILL_PMD";
1427                 power = 0;
1428                 break;
1429         default:
1430                 BUG();
1431                 return;
1432         }
1433
1434         if (w->new_power != power)
1435                 return;
1436
1437         if (w->event && (w->event_flags & event)) {
1438                 pop_dbg(w->dapm->dev, card->pop_time, "pop test : %s %s\n",
1439                         w->name, ev_name);
1440                 soc_dapm_async_complete(w->dapm);
1441                 trace_snd_soc_dapm_widget_event_start(w, event);
1442                 ret = w->event(w, NULL, event);
1443                 trace_snd_soc_dapm_widget_event_done(w, event);
1444                 if (ret < 0)
1445                         dev_err(w->dapm->dev, "ASoC: %s: %s event failed: %d\n",
1446                                ev_name, w->name, ret);
1447         }
1448 }
1449
1450 /* Apply the coalesced changes from a DAPM sequence */
1451 static void dapm_seq_run_coalesced(struct snd_soc_card *card,
1452                                    struct list_head *pending)
1453 {
1454         struct snd_soc_dapm_widget *w;
1455         int reg;
1456         unsigned int value = 0;
1457         unsigned int mask = 0;
1458
1459         reg = list_first_entry(pending, struct snd_soc_dapm_widget,
1460                                power_list)->reg;
1461
1462         list_for_each_entry(w, pending, power_list) {
1463                 BUG_ON(reg != w->reg);
1464                 w->power = w->new_power;
1465
1466                 mask |= w->mask << w->shift;
1467                 if (w->power)
1468                         value |= w->on_val << w->shift;
1469                 else
1470                         value |= w->off_val << w->shift;
1471
1472                 pop_dbg(w->dapm->dev, card->pop_time,
1473                         "pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n",
1474                         w->name, reg, value, mask);
1475
1476                 /* Check for events */
1477                 dapm_seq_check_event(card, w, SND_SOC_DAPM_PRE_PMU);
1478                 dapm_seq_check_event(card, w, SND_SOC_DAPM_PRE_PMD);
1479         }
1480
1481         if (reg >= 0) {
1482                 /* Any widget will do, they should all be updating the
1483                  * same register.
1484                  */
1485                 w = list_first_entry(pending, struct snd_soc_dapm_widget,
1486                                      power_list);
1487
1488                 pop_dbg(w->dapm->dev, card->pop_time,
1489                         "pop test : Applying 0x%x/0x%x to %x in %dms\n",
1490                         value, mask, reg, card->pop_time);
1491                 pop_wait(card->pop_time);
1492                 soc_widget_update_bits_locked(w, reg, mask, value);
1493         }
1494
1495         list_for_each_entry(w, pending, power_list) {
1496                 dapm_seq_check_event(card, w, SND_SOC_DAPM_POST_PMU);
1497                 dapm_seq_check_event(card, w, SND_SOC_DAPM_POST_PMD);
1498         }
1499 }
1500
1501 /* Apply a DAPM power sequence.
1502  *
1503  * We walk over a pre-sorted list of widgets to apply power to.  In
1504  * order to minimise the number of writes to the device required
1505  * multiple widgets will be updated in a single write where possible.
1506  * Currently anything that requires more than a single write is not
1507  * handled.
1508  */
1509 static void dapm_seq_run(struct snd_soc_card *card,
1510         struct list_head *list, int event, bool power_up)
1511 {
1512         struct snd_soc_dapm_widget *w, *n;
1513         struct snd_soc_dapm_context *d;
1514         LIST_HEAD(pending);
1515         int cur_sort = -1;
1516         int cur_subseq = -1;
1517         int cur_reg = SND_SOC_NOPM;
1518         struct snd_soc_dapm_context *cur_dapm = NULL;
1519         int ret, i;
1520         int *sort;
1521
1522         if (power_up)
1523                 sort = dapm_up_seq;
1524         else
1525                 sort = dapm_down_seq;
1526
1527         list_for_each_entry_safe(w, n, list, power_list) {
1528                 ret = 0;
1529
1530                 /* Do we need to apply any queued changes? */
1531                 if (sort[w->id] != cur_sort || w->reg != cur_reg ||
1532                     w->dapm != cur_dapm || w->subseq != cur_subseq) {
1533                         if (!list_empty(&pending))
1534                                 dapm_seq_run_coalesced(card, &pending);
1535
1536                         if (cur_dapm && cur_dapm->seq_notifier) {
1537                                 for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++)
1538                                         if (sort[i] == cur_sort)
1539                                                 cur_dapm->seq_notifier(cur_dapm,
1540                                                                        i,
1541                                                                        cur_subseq);
1542                         }
1543
1544                         if (cur_dapm && w->dapm != cur_dapm)
1545                                 soc_dapm_async_complete(cur_dapm);
1546
1547                         INIT_LIST_HEAD(&pending);
1548                         cur_sort = -1;
1549                         cur_subseq = INT_MIN;
1550                         cur_reg = SND_SOC_NOPM;
1551                         cur_dapm = NULL;
1552                 }
1553
1554                 switch (w->id) {
1555                 case snd_soc_dapm_pre:
1556                         if (!w->event)
1557                                 list_for_each_entry_safe_continue(w, n, list,
1558                                                                   power_list);
1559
1560                         if (event == SND_SOC_DAPM_STREAM_START)
1561                                 ret = w->event(w,
1562                                                NULL, SND_SOC_DAPM_PRE_PMU);
1563                         else if (event == SND_SOC_DAPM_STREAM_STOP)
1564                                 ret = w->event(w,
1565                                                NULL, SND_SOC_DAPM_PRE_PMD);
1566                         break;
1567
1568                 case snd_soc_dapm_post:
1569                         if (!w->event)
1570                                 list_for_each_entry_safe_continue(w, n, list,
1571                                                                   power_list);
1572
1573                         if (event == SND_SOC_DAPM_STREAM_START)
1574                                 ret = w->event(w,
1575                                                NULL, SND_SOC_DAPM_POST_PMU);
1576                         else if (event == SND_SOC_DAPM_STREAM_STOP)
1577                                 ret = w->event(w,
1578                                                NULL, SND_SOC_DAPM_POST_PMD);
1579                         break;
1580
1581                 default:
1582                         /* Queue it up for application */
1583                         cur_sort = sort[w->id];
1584                         cur_subseq = w->subseq;
1585                         cur_reg = w->reg;
1586                         cur_dapm = w->dapm;
1587                         list_move(&w->power_list, &pending);
1588                         break;
1589                 }
1590
1591                 if (ret < 0)
1592                         dev_err(w->dapm->dev,
1593                                 "ASoC: Failed to apply widget power: %d\n", ret);
1594         }
1595
1596         if (!list_empty(&pending))
1597                 dapm_seq_run_coalesced(card, &pending);
1598
1599         if (cur_dapm && cur_dapm->seq_notifier) {
1600                 for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++)
1601                         if (sort[i] == cur_sort)
1602                                 cur_dapm->seq_notifier(cur_dapm,
1603                                                        i, cur_subseq);
1604         }
1605
1606         list_for_each_entry(d, &card->dapm_list, list) {
1607                 soc_dapm_async_complete(d);
1608         }
1609 }
1610
1611 static void dapm_widget_update(struct snd_soc_card *card)
1612 {
1613         struct snd_soc_dapm_update *update = card->update;
1614         struct snd_soc_dapm_widget_list *wlist;
1615         struct snd_soc_dapm_widget *w = NULL;
1616         unsigned int wi;
1617         int ret;
1618
1619         if (!update || !dapm_kcontrol_is_powered(update->kcontrol))
1620                 return;
1621
1622         wlist = dapm_kcontrol_get_wlist(update->kcontrol);
1623
1624         for (wi = 0; wi < wlist->num_widgets; wi++) {
1625                 w = wlist->widgets[wi];
1626
1627                 if (w->event && (w->event_flags & SND_SOC_DAPM_PRE_REG)) {
1628                         ret = w->event(w, update->kcontrol, SND_SOC_DAPM_PRE_REG);
1629                         if (ret != 0)
1630                                 dev_err(w->dapm->dev, "ASoC: %s DAPM pre-event failed: %d\n",
1631                                            w->name, ret);
1632                 }
1633         }
1634
1635         if (!w)
1636                 return;
1637
1638         ret = soc_widget_update_bits_locked(w, update->reg, update->mask,
1639                                   update->val);
1640         if (ret < 0)
1641                 dev_err(w->dapm->dev, "ASoC: %s DAPM update failed: %d\n",
1642                         w->name, ret);
1643
1644         for (wi = 0; wi < wlist->num_widgets; wi++) {
1645                 w = wlist->widgets[wi];
1646
1647                 if (w->event && (w->event_flags & SND_SOC_DAPM_POST_REG)) {
1648                         ret = w->event(w, update->kcontrol, SND_SOC_DAPM_POST_REG);
1649                         if (ret != 0)
1650                                 dev_err(w->dapm->dev, "ASoC: %s DAPM post-event failed: %d\n",
1651                                            w->name, ret);
1652                 }
1653         }
1654 }
1655
1656 /* Async callback run prior to DAPM sequences - brings to _PREPARE if
1657  * they're changing state.
1658  */
1659 static void dapm_pre_sequence_async(void *data, async_cookie_t cookie)
1660 {
1661         struct snd_soc_dapm_context *d = data;
1662         int ret;
1663
1664         /* If we're off and we're not supposed to be go into STANDBY */
1665         if (d->bias_level == SND_SOC_BIAS_OFF &&
1666             d->target_bias_level != SND_SOC_BIAS_OFF) {
1667                 if (d->dev)
1668                         pm_runtime_get_sync(d->dev);
1669
1670                 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_STANDBY);
1671                 if (ret != 0)
1672                         dev_err(d->dev,
1673                                 "ASoC: Failed to turn on bias: %d\n", ret);
1674         }
1675
1676         /* Prepare for a STADDBY->ON or ON->STANDBY transition */
1677         if (d->bias_level != d->target_bias_level) {
1678                 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_PREPARE);
1679                 if (ret != 0)
1680                         dev_err(d->dev,
1681                                 "ASoC: Failed to prepare bias: %d\n", ret);
1682         }
1683 }
1684
1685 /* Async callback run prior to DAPM sequences - brings to their final
1686  * state.
1687  */
1688 static void dapm_post_sequence_async(void *data, async_cookie_t cookie)
1689 {
1690         struct snd_soc_dapm_context *d = data;
1691         int ret;
1692
1693         /* If we just powered the last thing off drop to standby bias */
1694         if (d->bias_level == SND_SOC_BIAS_PREPARE &&
1695             (d->target_bias_level == SND_SOC_BIAS_STANDBY ||
1696              d->target_bias_level == SND_SOC_BIAS_OFF)) {
1697                 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_STANDBY);
1698                 if (ret != 0)
1699                         dev_err(d->dev, "ASoC: Failed to apply standby bias: %d\n",
1700                                 ret);
1701         }
1702
1703         /* If we're in standby and can support bias off then do that */
1704         if (d->bias_level == SND_SOC_BIAS_STANDBY &&
1705             d->target_bias_level == SND_SOC_BIAS_OFF) {
1706                 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_OFF);
1707                 if (ret != 0)
1708                         dev_err(d->dev, "ASoC: Failed to turn off bias: %d\n",
1709                                 ret);
1710
1711                 if (d->dev)
1712                         pm_runtime_put(d->dev);
1713         }
1714
1715         /* If we just powered up then move to active bias */
1716         if (d->bias_level == SND_SOC_BIAS_PREPARE &&
1717             d->target_bias_level == SND_SOC_BIAS_ON) {
1718                 ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_ON);
1719                 if (ret != 0)
1720                         dev_err(d->dev, "ASoC: Failed to apply active bias: %d\n",
1721                                 ret);
1722         }
1723 }
1724
1725 static void dapm_widget_set_peer_power(struct snd_soc_dapm_widget *peer,
1726                                        bool power, bool connect)
1727 {
1728         /* If a connection is being made or broken then that update
1729          * will have marked the peer dirty, otherwise the widgets are
1730          * not connected and this update has no impact. */
1731         if (!connect)
1732                 return;
1733
1734         /* If the peer is already in the state we're moving to then we
1735          * won't have an impact on it. */
1736         if (power != peer->power)
1737                 dapm_mark_dirty(peer, "peer state change");
1738 }
1739
1740 static void dapm_widget_set_power(struct snd_soc_dapm_widget *w, bool power,
1741                                   struct list_head *up_list,
1742                                   struct list_head *down_list)
1743 {
1744         struct snd_soc_dapm_path *path;
1745
1746         if (w->power == power)
1747                 return;
1748
1749         trace_snd_soc_dapm_widget_power(w, power);
1750
1751         /* If we changed our power state perhaps our neigbours changed
1752          * also.
1753          */
1754         list_for_each_entry(path, &w->sources, list_sink) {
1755                 if (path->source) {
1756                         dapm_widget_set_peer_power(path->source, power,
1757                                                    path->connect);
1758                 }
1759         }
1760         switch (w->id) {
1761         case snd_soc_dapm_supply:
1762         case snd_soc_dapm_regulator_supply:
1763         case snd_soc_dapm_clock_supply:
1764         case snd_soc_dapm_kcontrol:
1765                 /* Supplies can't affect their outputs, only their inputs */
1766                 break;
1767         default:
1768                 list_for_each_entry(path, &w->sinks, list_source) {
1769                         if (path->sink) {
1770                                 dapm_widget_set_peer_power(path->sink, power,
1771                                                            path->connect);
1772                         }
1773                 }
1774                 break;
1775         }
1776
1777         if (power)
1778                 dapm_seq_insert(w, up_list, true);
1779         else
1780                 dapm_seq_insert(w, down_list, false);
1781 }
1782
1783 static void dapm_power_one_widget(struct snd_soc_dapm_widget *w,
1784                                   struct list_head *up_list,
1785                                   struct list_head *down_list)
1786 {
1787         int power;
1788
1789         switch (w->id) {
1790         case snd_soc_dapm_pre:
1791                 dapm_seq_insert(w, down_list, false);
1792                 break;
1793         case snd_soc_dapm_post:
1794                 dapm_seq_insert(w, up_list, true);
1795                 break;
1796
1797         default:
1798                 power = dapm_widget_power_check(w);
1799
1800                 dapm_widget_set_power(w, power, up_list, down_list);
1801                 break;
1802         }
1803 }
1804
1805 /*
1806  * Scan each dapm widget for complete audio path.
1807  * A complete path is a route that has valid endpoints i.e.:-
1808  *
1809  *  o DAC to output pin.
1810  *  o Input Pin to ADC.
1811  *  o Input pin to Output pin (bypass, sidetone)
1812  *  o DAC to ADC (loopback).
1813  */
1814 static int dapm_power_widgets(struct snd_soc_card *card, int event)
1815 {
1816         struct snd_soc_dapm_widget *w;
1817         struct snd_soc_dapm_context *d;
1818         LIST_HEAD(up_list);
1819         LIST_HEAD(down_list);
1820         ASYNC_DOMAIN_EXCLUSIVE(async_domain);
1821         enum snd_soc_bias_level bias;
1822
1823         trace_snd_soc_dapm_start(card);
1824
1825         list_for_each_entry(d, &card->dapm_list, list) {
1826                 if (d->idle_bias_off)
1827                         d->target_bias_level = SND_SOC_BIAS_OFF;
1828                 else
1829                         d->target_bias_level = SND_SOC_BIAS_STANDBY;
1830         }
1831
1832         dapm_reset(card);
1833
1834         /* Check which widgets we need to power and store them in
1835          * lists indicating if they should be powered up or down.  We
1836          * only check widgets that have been flagged as dirty but note
1837          * that new widgets may be added to the dirty list while we
1838          * iterate.
1839          */
1840         list_for_each_entry(w, &card->dapm_dirty, dirty) {
1841                 dapm_power_one_widget(w, &up_list, &down_list);
1842         }
1843
1844         list_for_each_entry(w, &card->widgets, list) {
1845                 switch (w->id) {
1846                 case snd_soc_dapm_pre:
1847                 case snd_soc_dapm_post:
1848                         /* These widgets always need to be powered */
1849                         break;
1850                 default:
1851                         list_del_init(&w->dirty);
1852                         break;
1853                 }
1854
1855                 if (w->new_power) {
1856                         d = w->dapm;
1857
1858                         /* Supplies and micbiases only bring the
1859                          * context up to STANDBY as unless something
1860                          * else is active and passing audio they
1861                          * generally don't require full power.  Signal
1862                          * generators are virtual pins and have no
1863                          * power impact themselves.
1864                          */
1865                         switch (w->id) {
1866                         case snd_soc_dapm_siggen:
1867                         case snd_soc_dapm_vmid:
1868                                 break;
1869                         case snd_soc_dapm_supply:
1870                         case snd_soc_dapm_regulator_supply:
1871                         case snd_soc_dapm_clock_supply:
1872                         case snd_soc_dapm_micbias:
1873                                 if (d->target_bias_level < SND_SOC_BIAS_STANDBY)
1874                                         d->target_bias_level = SND_SOC_BIAS_STANDBY;
1875                                 break;
1876                         default:
1877                                 d->target_bias_level = SND_SOC_BIAS_ON;
1878                                 break;
1879                         }
1880                 }
1881
1882         }
1883
1884         /* Force all contexts in the card to the same bias state if
1885          * they're not ground referenced.
1886          */
1887         bias = SND_SOC_BIAS_OFF;
1888         list_for_each_entry(d, &card->dapm_list, list)
1889                 if (d->target_bias_level > bias)
1890                         bias = d->target_bias_level;
1891         list_for_each_entry(d, &card->dapm_list, list)
1892                 if (!d->idle_bias_off)
1893                         d->target_bias_level = bias;
1894
1895         trace_snd_soc_dapm_walk_done(card);
1896
1897         /* Run all the bias changes in parallel */
1898         list_for_each_entry(d, &card->dapm_list, list)
1899                 async_schedule_domain(dapm_pre_sequence_async, d,
1900                                         &async_domain);
1901         async_synchronize_full_domain(&async_domain);
1902
1903         list_for_each_entry(w, &down_list, power_list) {
1904                 dapm_seq_check_event(card, w, SND_SOC_DAPM_WILL_PMD);
1905         }
1906
1907         list_for_each_entry(w, &up_list, power_list) {
1908                 dapm_seq_check_event(card, w, SND_SOC_DAPM_WILL_PMU);
1909         }
1910
1911         /* Power down widgets first; try to avoid amplifying pops. */
1912         dapm_seq_run(card, &down_list, event, false);
1913
1914         dapm_widget_update(card);
1915
1916         /* Now power up. */
1917         dapm_seq_run(card, &up_list, event, true);
1918
1919         /* Run all the bias changes in parallel */
1920         list_for_each_entry(d, &card->dapm_list, list)
1921                 async_schedule_domain(dapm_post_sequence_async, d,
1922                                         &async_domain);
1923         async_synchronize_full_domain(&async_domain);
1924
1925         /* do we need to notify any clients that DAPM event is complete */
1926         list_for_each_entry(d, &card->dapm_list, list) {
1927                 if (d->stream_event)
1928                         d->stream_event(d, event);
1929         }
1930
1931         pop_dbg(card->dev, card->pop_time,
1932                 "DAPM sequencing finished, waiting %dms\n", card->pop_time);
1933         pop_wait(card->pop_time);
1934
1935         trace_snd_soc_dapm_done(card);
1936
1937         return 0;
1938 }
1939
1940 #ifdef CONFIG_DEBUG_FS
1941 static ssize_t dapm_widget_power_read_file(struct file *file,
1942                                            char __user *user_buf,
1943                                            size_t count, loff_t *ppos)
1944 {
1945         struct snd_soc_dapm_widget *w = file->private_data;
1946         char *buf;
1947         int in, out;
1948         ssize_t ret;
1949         struct snd_soc_dapm_path *p = NULL;
1950
1951         buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
1952         if (!buf)
1953                 return -ENOMEM;
1954
1955         in = is_connected_input_ep(w, NULL);
1956         dapm_clear_walk_input(w->dapm, &w->sources);
1957         out = is_connected_output_ep(w, NULL);
1958         dapm_clear_walk_output(w->dapm, &w->sinks);
1959
1960         ret = snprintf(buf, PAGE_SIZE, "%s: %s%s  in %d out %d",
1961                        w->name, w->power ? "On" : "Off",
1962                        w->force ? " (forced)" : "", in, out);
1963
1964         if (w->reg >= 0)
1965                 ret += snprintf(buf + ret, PAGE_SIZE - ret,
1966                                 " - R%d(0x%x) mask 0x%x",
1967                                 w->reg, w->reg, w->mask << w->shift);
1968
1969         ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n");
1970
1971         if (w->sname)
1972                 ret += snprintf(buf + ret, PAGE_SIZE - ret, " stream %s %s\n",
1973                                 w->sname,
1974                                 w->active ? "active" : "inactive");
1975
1976         list_for_each_entry(p, &w->sources, list_sink) {
1977                 if (p->connected && !p->connected(w, p->source))
1978                         continue;
1979
1980                 if (p->connect)
1981                         ret += snprintf(buf + ret, PAGE_SIZE - ret,
1982                                         " in  \"%s\" \"%s\"\n",
1983                                         p->name ? p->name : "static",
1984                                         p->source->name);
1985         }
1986         list_for_each_entry(p, &w->sinks, list_source) {
1987                 if (p->connected && !p->connected(w, p->sink))
1988                         continue;
1989
1990                 if (p->connect)
1991                         ret += snprintf(buf + ret, PAGE_SIZE - ret,
1992                                         " out \"%s\" \"%s\"\n",
1993                                         p->name ? p->name : "static",
1994                                         p->sink->name);
1995         }
1996
1997         ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
1998
1999         kfree(buf);
2000         return ret;
2001 }
2002
2003 static const struct file_operations dapm_widget_power_fops = {
2004         .open = simple_open,
2005         .read = dapm_widget_power_read_file,
2006         .llseek = default_llseek,
2007 };
2008
2009 static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf,
2010                                    size_t count, loff_t *ppos)
2011 {
2012         struct snd_soc_dapm_context *dapm = file->private_data;
2013         char *level;
2014
2015         switch (dapm->bias_level) {
2016         case SND_SOC_BIAS_ON:
2017                 level = "On\n";
2018                 break;
2019         case SND_SOC_BIAS_PREPARE:
2020                 level = "Prepare\n";
2021                 break;
2022         case SND_SOC_BIAS_STANDBY:
2023                 level = "Standby\n";
2024                 break;
2025         case SND_SOC_BIAS_OFF:
2026                 level = "Off\n";
2027                 break;
2028         default:
2029                 BUG();
2030                 level = "Unknown\n";
2031                 break;
2032         }
2033
2034         return simple_read_from_buffer(user_buf, count, ppos, level,
2035                                        strlen(level));
2036 }
2037
2038 static const struct file_operations dapm_bias_fops = {
2039         .open = simple_open,
2040         .read = dapm_bias_read_file,
2041         .llseek = default_llseek,
2042 };
2043
2044 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
2045         struct dentry *parent)
2046 {
2047         struct dentry *d;
2048
2049         dapm->debugfs_dapm = debugfs_create_dir("dapm", parent);
2050
2051         if (!dapm->debugfs_dapm) {
2052                 dev_warn(dapm->dev,
2053                        "ASoC: Failed to create DAPM debugfs directory\n");
2054                 return;
2055         }
2056
2057         d = debugfs_create_file("bias_level", 0444,
2058                                 dapm->debugfs_dapm, dapm,
2059                                 &dapm_bias_fops);
2060         if (!d)
2061                 dev_warn(dapm->dev,
2062                          "ASoC: Failed to create bias level debugfs file\n");
2063 }
2064
2065 static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w)
2066 {
2067         struct snd_soc_dapm_context *dapm = w->dapm;
2068         struct dentry *d;
2069
2070         if (!dapm->debugfs_dapm || !w->name)
2071                 return;
2072
2073         d = debugfs_create_file(w->name, 0444,
2074                                 dapm->debugfs_dapm, w,
2075                                 &dapm_widget_power_fops);
2076         if (!d)
2077                 dev_warn(w->dapm->dev,
2078                         "ASoC: Failed to create %s debugfs file\n",
2079                         w->name);
2080 }
2081
2082 static void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm)
2083 {
2084         debugfs_remove_recursive(dapm->debugfs_dapm);
2085 }
2086
2087 #else
2088 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
2089         struct dentry *parent)
2090 {
2091 }
2092
2093 static inline void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w)
2094 {
2095 }
2096
2097 static inline void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm)
2098 {
2099 }
2100
2101 #endif
2102
2103 /* test and update the power status of a mux widget */
2104 static int soc_dapm_mux_update_power(struct snd_soc_card *card,
2105                                  struct snd_kcontrol *kcontrol, int mux, struct soc_enum *e)
2106 {
2107         struct snd_soc_dapm_path *path;
2108         int found = 0;
2109
2110         /* find dapm widget path assoc with kcontrol */
2111         dapm_kcontrol_for_each_path(path, kcontrol) {
2112                 if (!path->name || !e->texts[mux])
2113                         continue;
2114
2115                 found = 1;
2116                 /* we now need to match the string in the enum to the path */
2117                 if (!(strcmp(path->name, e->texts[mux]))) {
2118                         path->connect = 1; /* new connection */
2119                         dapm_mark_dirty(path->source, "mux connection");
2120                 } else {
2121                         if (path->connect)
2122                                 dapm_mark_dirty(path->source,
2123                                                 "mux disconnection");
2124                         path->connect = 0; /* old connection must be powered down */
2125                 }
2126                 dapm_mark_dirty(path->sink, "mux change");
2127         }
2128
2129         if (found)
2130                 dapm_power_widgets(card, SND_SOC_DAPM_STREAM_NOP);
2131
2132         return found;
2133 }
2134
2135 int snd_soc_dapm_mux_update_power(struct snd_soc_dapm_context *dapm,
2136         struct snd_kcontrol *kcontrol, int mux, struct soc_enum *e,
2137         struct snd_soc_dapm_update *update)
2138 {
2139         struct snd_soc_card *card = dapm->card;
2140         int ret;
2141
2142         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
2143         card->update = update;
2144         ret = soc_dapm_mux_update_power(card, kcontrol, mux, e);
2145         card->update = NULL;
2146         mutex_unlock(&card->dapm_mutex);
2147         if (ret > 0)
2148                 soc_dpcm_runtime_update(card);
2149         return ret;
2150 }
2151 EXPORT_SYMBOL_GPL(snd_soc_dapm_mux_update_power);
2152
2153 /* test and update the power status of a mixer or switch widget */
2154 static int soc_dapm_mixer_update_power(struct snd_soc_card *card,
2155                                    struct snd_kcontrol *kcontrol, int connect)
2156 {
2157         struct snd_soc_dapm_path *path;
2158         int found = 0;
2159
2160         /* find dapm widget path assoc with kcontrol */
2161         dapm_kcontrol_for_each_path(path, kcontrol) {
2162                 found = 1;
2163                 path->connect = connect;
2164                 dapm_mark_dirty(path->source, "mixer connection");
2165                 dapm_mark_dirty(path->sink, "mixer update");
2166         }
2167
2168         if (found)
2169                 dapm_power_widgets(card, SND_SOC_DAPM_STREAM_NOP);
2170
2171         return found;
2172 }
2173
2174 int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context *dapm,
2175         struct snd_kcontrol *kcontrol, int connect,
2176         struct snd_soc_dapm_update *update)
2177 {
2178         struct snd_soc_card *card = dapm->card;
2179         int ret;
2180
2181         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
2182         card->update = update;
2183         ret = soc_dapm_mixer_update_power(card, kcontrol, connect);
2184         card->update = NULL;
2185         mutex_unlock(&card->dapm_mutex);
2186         if (ret > 0)
2187                 soc_dpcm_runtime_update(card);
2188         return ret;
2189 }
2190 EXPORT_SYMBOL_GPL(snd_soc_dapm_mixer_update_power);
2191
2192 /* show dapm widget status in sys fs */
2193 static ssize_t dapm_widget_show(struct device *dev,
2194         struct device_attribute *attr, char *buf)
2195 {
2196         struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
2197         struct snd_soc_codec *codec =rtd->codec;
2198         struct snd_soc_dapm_widget *w;
2199         int count = 0;
2200         char *state = "not set";
2201
2202         list_for_each_entry(w, &codec->card->widgets, list) {
2203                 if (w->dapm != &codec->dapm)
2204                         continue;
2205
2206                 /* only display widgets that burnm power */
2207                 switch (w->id) {
2208                 case snd_soc_dapm_hp:
2209                 case snd_soc_dapm_mic:
2210                 case snd_soc_dapm_spk:
2211                 case snd_soc_dapm_line:
2212                 case snd_soc_dapm_micbias:
2213                 case snd_soc_dapm_dac:
2214                 case snd_soc_dapm_adc:
2215                 case snd_soc_dapm_pga:
2216                 case snd_soc_dapm_out_drv:
2217                 case snd_soc_dapm_mixer:
2218                 case snd_soc_dapm_mixer_named_ctl:
2219                 case snd_soc_dapm_supply:
2220                 case snd_soc_dapm_regulator_supply:
2221                 case snd_soc_dapm_clock_supply:
2222                         if (w->name)
2223                                 count += sprintf(buf + count, "%s: %s\n",
2224                                         w->name, w->power ? "On":"Off");
2225                 break;
2226                 default:
2227                 break;
2228                 }
2229         }
2230
2231         switch (codec->dapm.bias_level) {
2232         case SND_SOC_BIAS_ON:
2233                 state = "On";
2234                 break;
2235         case SND_SOC_BIAS_PREPARE:
2236                 state = "Prepare";
2237                 break;
2238         case SND_SOC_BIAS_STANDBY:
2239                 state = "Standby";
2240                 break;
2241         case SND_SOC_BIAS_OFF:
2242                 state = "Off";
2243                 break;
2244         }
2245         count += sprintf(buf + count, "PM State: %s\n", state);
2246
2247         return count;
2248 }
2249
2250 static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL);
2251
2252 int snd_soc_dapm_sys_add(struct device *dev)
2253 {
2254         return device_create_file(dev, &dev_attr_dapm_widget);
2255 }
2256
2257 static void snd_soc_dapm_sys_remove(struct device *dev)
2258 {
2259         device_remove_file(dev, &dev_attr_dapm_widget);
2260 }
2261
2262 static void dapm_free_path(struct snd_soc_dapm_path *path)
2263 {
2264         list_del(&path->list_sink);
2265         list_del(&path->list_source);
2266         list_del(&path->list_kcontrol);
2267         list_del(&path->list);
2268         kfree(path);
2269 }
2270
2271 /* free all dapm widgets and resources */
2272 static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
2273 {
2274         struct snd_soc_dapm_widget *w, *next_w;
2275         struct snd_soc_dapm_path *p, *next_p;
2276
2277         list_for_each_entry_safe(w, next_w, &dapm->card->widgets, list) {
2278                 if (w->dapm != dapm)
2279                         continue;
2280                 list_del(&w->list);
2281                 /*
2282                  * remove source and sink paths associated to this widget.
2283                  * While removing the path, remove reference to it from both
2284                  * source and sink widgets so that path is removed only once.
2285                  */
2286                 list_for_each_entry_safe(p, next_p, &w->sources, list_sink)
2287                         dapm_free_path(p);
2288
2289                 list_for_each_entry_safe(p, next_p, &w->sinks, list_source)
2290                         dapm_free_path(p);
2291
2292                 kfree(w->kcontrols);
2293                 kfree(w->name);
2294                 kfree(w);
2295         }
2296 }
2297
2298 static struct snd_soc_dapm_widget *dapm_find_widget(
2299                         struct snd_soc_dapm_context *dapm, const char *pin,
2300                         bool search_other_contexts)
2301 {
2302         struct snd_soc_dapm_widget *w;
2303         struct snd_soc_dapm_widget *fallback = NULL;
2304
2305         list_for_each_entry(w, &dapm->card->widgets, list) {
2306                 if (!strcmp(w->name, pin)) {
2307                         if (w->dapm == dapm)
2308                                 return w;
2309                         else
2310                                 fallback = w;
2311                 }
2312         }
2313
2314         if (search_other_contexts)
2315                 return fallback;
2316
2317         return NULL;
2318 }
2319
2320 static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
2321                                 const char *pin, int status)
2322 {
2323         struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
2324
2325         if (!w) {
2326                 dev_err(dapm->dev, "ASoC: DAPM unknown pin %s\n", pin);
2327                 return -EINVAL;
2328         }
2329
2330         if (w->connected != status)
2331                 dapm_mark_dirty(w, "pin configuration");
2332
2333         w->connected = status;
2334         if (status == 0)
2335                 w->force = 0;
2336
2337         return 0;
2338 }
2339
2340 /**
2341  * snd_soc_dapm_sync - scan and power dapm paths
2342  * @dapm: DAPM context
2343  *
2344  * Walks all dapm audio paths and powers widgets according to their
2345  * stream or path usage.
2346  *
2347  * Returns 0 for success.
2348  */
2349 int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm)
2350 {
2351         int ret;
2352
2353         /*
2354          * Suppress early reports (eg, jacks syncing their state) to avoid
2355          * silly DAPM runs during card startup.
2356          */
2357         if (!dapm->card || !dapm->card->instantiated)
2358                 return 0;
2359
2360         mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
2361         ret = dapm_power_widgets(dapm->card, SND_SOC_DAPM_STREAM_NOP);
2362         mutex_unlock(&dapm->card->dapm_mutex);
2363         return ret;
2364 }
2365 EXPORT_SYMBOL_GPL(snd_soc_dapm_sync);
2366
2367 static int snd_soc_dapm_add_path(struct snd_soc_dapm_context *dapm,
2368         struct snd_soc_dapm_widget *wsource, struct snd_soc_dapm_widget *wsink,
2369         const char *control,
2370         int (*connected)(struct snd_soc_dapm_widget *source,
2371                          struct snd_soc_dapm_widget *sink))
2372 {
2373         struct snd_soc_dapm_path *path;
2374         int ret;
2375
2376         path = kzalloc(sizeof(struct snd_soc_dapm_path), GFP_KERNEL);
2377         if (!path)
2378                 return -ENOMEM;
2379
2380         path->source = wsource;
2381         path->sink = wsink;
2382         path->connected = connected;
2383         INIT_LIST_HEAD(&path->list);
2384         INIT_LIST_HEAD(&path->list_kcontrol);
2385         INIT_LIST_HEAD(&path->list_source);
2386         INIT_LIST_HEAD(&path->list_sink);
2387
2388         /* check for external widgets */
2389         if (wsink->id == snd_soc_dapm_input) {
2390                 if (wsource->id == snd_soc_dapm_micbias ||
2391                         wsource->id == snd_soc_dapm_mic ||
2392                         wsource->id == snd_soc_dapm_line ||
2393                         wsource->id == snd_soc_dapm_output)
2394                         wsink->ext = 1;
2395         }
2396         if (wsource->id == snd_soc_dapm_output) {
2397                 if (wsink->id == snd_soc_dapm_spk ||
2398                         wsink->id == snd_soc_dapm_hp ||
2399                         wsink->id == snd_soc_dapm_line ||
2400                         wsink->id == snd_soc_dapm_input)
2401                         wsource->ext = 1;
2402         }
2403
2404         dapm_mark_dirty(wsource, "Route added");
2405         dapm_mark_dirty(wsink, "Route added");
2406
2407         /* connect static paths */
2408         if (control == NULL) {
2409                 list_add(&path->list, &dapm->card->paths);
2410                 list_add(&path->list_sink, &wsink->sources);
2411                 list_add(&path->list_source, &wsource->sinks);
2412                 path->connect = 1;
2413                 return 0;
2414         }
2415
2416         /* connect dynamic paths */
2417         switch (wsink->id) {
2418         case snd_soc_dapm_adc:
2419         case snd_soc_dapm_dac:
2420         case snd_soc_dapm_pga:
2421         case snd_soc_dapm_out_drv:
2422         case snd_soc_dapm_input:
2423         case snd_soc_dapm_output:
2424         case snd_soc_dapm_siggen:
2425         case snd_soc_dapm_micbias:
2426         case snd_soc_dapm_vmid:
2427         case snd_soc_dapm_pre:
2428         case snd_soc_dapm_post:
2429         case snd_soc_dapm_supply:
2430         case snd_soc_dapm_regulator_supply:
2431         case snd_soc_dapm_clock_supply:
2432         case snd_soc_dapm_aif_in:
2433         case snd_soc_dapm_aif_out:
2434         case snd_soc_dapm_dai_in:
2435         case snd_soc_dapm_dai_out:
2436         case snd_soc_dapm_dai_link:
2437         case snd_soc_dapm_kcontrol:
2438                 list_add(&path->list, &dapm->card->paths);
2439                 list_add(&path->list_sink, &wsink->sources);
2440                 list_add(&path->list_source, &wsource->sinks);
2441                 path->connect = 1;
2442                 return 0;
2443         case snd_soc_dapm_mux:
2444         case snd_soc_dapm_virt_mux:
2445         case snd_soc_dapm_value_mux:
2446                 ret = dapm_connect_mux(dapm, wsource, wsink, path, control,
2447                         &wsink->kcontrol_news[0]);
2448                 if (ret != 0)
2449                         goto err;
2450                 break;
2451         case snd_soc_dapm_switch:
2452         case snd_soc_dapm_mixer:
2453         case snd_soc_dapm_mixer_named_ctl:
2454                 ret = dapm_connect_mixer(dapm, wsource, wsink, path, control);
2455                 if (ret != 0)
2456                         goto err;
2457                 break;
2458         case snd_soc_dapm_hp:
2459         case snd_soc_dapm_mic:
2460         case snd_soc_dapm_line:
2461         case snd_soc_dapm_spk:
2462                 list_add(&path->list, &dapm->card->paths);
2463                 list_add(&path->list_sink, &wsink->sources);
2464                 list_add(&path->list_source, &wsource->sinks);
2465                 path->connect = 0;
2466                 return 0;
2467         }
2468
2469         return 0;
2470 err:
2471         kfree(path);
2472         return ret;
2473 }
2474
2475 static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
2476                                   const struct snd_soc_dapm_route *route)
2477 {
2478         struct snd_soc_dapm_widget *wsource = NULL, *wsink = NULL, *w;
2479         struct snd_soc_dapm_widget *wtsource = NULL, *wtsink = NULL;
2480         const char *sink;
2481         const char *source;
2482         char prefixed_sink[80];
2483         char prefixed_source[80];
2484         int ret;
2485
2486         if (dapm->codec && dapm->codec->name_prefix) {
2487                 snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s",
2488                          dapm->codec->name_prefix, route->sink);
2489                 sink = prefixed_sink;
2490                 snprintf(prefixed_source, sizeof(prefixed_source), "%s %s",
2491                          dapm->codec->name_prefix, route->source);
2492                 source = prefixed_source;
2493         } else {
2494                 sink = route->sink;
2495                 source = route->source;
2496         }
2497
2498         /*
2499          * find src and dest widgets over all widgets but favor a widget from
2500          * current DAPM context
2501          */
2502         list_for_each_entry(w, &dapm->card->widgets, list) {
2503                 if (!wsink && !(strcmp(w->name, sink))) {
2504                         wtsink = w;
2505                         if (w->dapm == dapm)
2506                                 wsink = w;
2507                         continue;
2508                 }
2509                 if (!wsource && !(strcmp(w->name, source))) {
2510                         wtsource = w;
2511                         if (w->dapm == dapm)
2512                                 wsource = w;
2513                 }
2514         }
2515         /* use widget from another DAPM context if not found from this */
2516         if (!wsink)
2517                 wsink = wtsink;
2518         if (!wsource)
2519                 wsource = wtsource;
2520
2521         if (wsource == NULL) {
2522                 dev_err(dapm->dev, "ASoC: no source widget found for %s\n",
2523                         route->source);
2524                 return -ENODEV;
2525         }
2526         if (wsink == NULL) {
2527                 dev_err(dapm->dev, "ASoC: no sink widget found for %s\n",
2528                         route->sink);
2529                 return -ENODEV;
2530         }
2531
2532         ret = snd_soc_dapm_add_path(dapm, wsource, wsink, route->control,
2533                 route->connected);
2534         if (ret)
2535                 goto err;
2536
2537         return 0;
2538 err:
2539         dev_warn(dapm->dev, "ASoC: no dapm match for %s --> %s --> %s\n",
2540                  source, route->control, sink);
2541         return ret;
2542 }
2543
2544 static int snd_soc_dapm_del_route(struct snd_soc_dapm_context *dapm,
2545                                   const struct snd_soc_dapm_route *route)
2546 {
2547         struct snd_soc_dapm_path *path, *p;
2548         const char *sink;
2549         const char *source;
2550         char prefixed_sink[80];
2551         char prefixed_source[80];
2552
2553         if (route->control) {
2554                 dev_err(dapm->dev,
2555                         "ASoC: Removal of routes with controls not supported\n");
2556                 return -EINVAL;
2557         }
2558
2559         if (dapm->codec && dapm->codec->name_prefix) {
2560                 snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s",
2561                          dapm->codec->name_prefix, route->sink);
2562                 sink = prefixed_sink;
2563                 snprintf(prefixed_source, sizeof(prefixed_source), "%s %s",
2564                          dapm->codec->name_prefix, route->source);
2565                 source = prefixed_source;
2566         } else {
2567                 sink = route->sink;
2568                 source = route->source;
2569         }
2570
2571         path = NULL;
2572         list_for_each_entry(p, &dapm->card->paths, list) {
2573                 if (strcmp(p->source->name, source) != 0)
2574                         continue;
2575                 if (strcmp(p->sink->name, sink) != 0)
2576                         continue;
2577                 path = p;
2578                 break;
2579         }
2580
2581         if (path) {
2582                 dapm_mark_dirty(path->source, "Route removed");
2583                 dapm_mark_dirty(path->sink, "Route removed");
2584
2585                 dapm_free_path(path);
2586         } else {
2587                 dev_warn(dapm->dev, "ASoC: Route %s->%s does not exist\n",
2588                          source, sink);
2589         }
2590
2591         return 0;
2592 }
2593
2594 /**
2595  * snd_soc_dapm_add_routes - Add routes between DAPM widgets
2596  * @dapm: DAPM context
2597  * @route: audio routes
2598  * @num: number of routes
2599  *
2600  * Connects 2 dapm widgets together via a named audio path. The sink is
2601  * the widget receiving the audio signal, whilst the source is the sender
2602  * of the audio signal.
2603  *
2604  * Returns 0 for success else error. On error all resources can be freed
2605  * with a call to snd_soc_card_free().
2606  */
2607 int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
2608                             const struct snd_soc_dapm_route *route, int num)
2609 {
2610         int i, r, ret = 0;
2611
2612         mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT);
2613         for (i = 0; i < num; i++) {
2614                 r = snd_soc_dapm_add_route(dapm, route);
2615                 if (r < 0) {
2616                         dev_err(dapm->dev, "ASoC: Failed to add route %s -> %s -> %s\n",
2617                                 route->source,
2618                                 route->control ? route->control : "direct",
2619                                 route->sink);
2620                         ret = r;
2621                 }
2622                 route++;
2623         }
2624         mutex_unlock(&dapm->card->dapm_mutex);
2625
2626         return ret;
2627 }
2628 EXPORT_SYMBOL_GPL(snd_soc_dapm_add_routes);
2629
2630 /**
2631  * snd_soc_dapm_del_routes - Remove routes between DAPM widgets
2632  * @dapm: DAPM context
2633  * @route: audio routes
2634  * @num: number of routes
2635  *
2636  * Removes routes from the DAPM context.
2637  */
2638 int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm,
2639                             const struct snd_soc_dapm_route *route, int num)
2640 {
2641         int i, ret = 0;
2642
2643         mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT);
2644         for (i = 0; i < num; i++) {
2645                 snd_soc_dapm_del_route(dapm, route);
2646                 route++;
2647         }
2648         mutex_unlock(&dapm->card->dapm_mutex);
2649
2650         return ret;
2651 }
2652 EXPORT_SYMBOL_GPL(snd_soc_dapm_del_routes);
2653
2654 static int snd_soc_dapm_weak_route(struct snd_soc_dapm_context *dapm,
2655                                    const struct snd_soc_dapm_route *route)
2656 {
2657         struct snd_soc_dapm_widget *source = dapm_find_widget(dapm,
2658                                                               route->source,
2659                                                               true);
2660         struct snd_soc_dapm_widget *sink = dapm_find_widget(dapm,
2661                                                             route->sink,
2662                                                             true);
2663         struct snd_soc_dapm_path *path;
2664         int count = 0;
2665
2666         if (!source) {
2667                 dev_err(dapm->dev, "ASoC: Unable to find source %s for weak route\n",
2668                         route->source);
2669                 return -ENODEV;
2670         }
2671
2672         if (!sink) {
2673                 dev_err(dapm->dev, "ASoC: Unable to find sink %s for weak route\n",
2674                         route->sink);
2675                 return -ENODEV;
2676         }
2677
2678         if (route->control || route->connected)
2679                 dev_warn(dapm->dev, "ASoC: Ignoring control for weak route %s->%s\n",
2680                          route->source, route->sink);
2681
2682         list_for_each_entry(path, &source->sinks, list_source) {
2683                 if (path->sink == sink) {
2684                         path->weak = 1;
2685                         count++;
2686                 }
2687         }
2688
2689         if (count == 0)
2690                 dev_err(dapm->dev, "ASoC: No path found for weak route %s->%s\n",
2691                         route->source, route->sink);
2692         if (count > 1)
2693                 dev_warn(dapm->dev, "ASoC: %d paths found for weak route %s->%s\n",
2694                          count, route->source, route->sink);
2695
2696         return 0;
2697 }
2698
2699 /**
2700  * snd_soc_dapm_weak_routes - Mark routes between DAPM widgets as weak
2701  * @dapm: DAPM context
2702  * @route: audio routes
2703  * @num: number of routes
2704  *
2705  * Mark existing routes matching those specified in the passed array
2706  * as being weak, meaning that they are ignored for the purpose of
2707  * power decisions.  The main intended use case is for sidetone paths
2708  * which couple audio between other independent paths if they are both
2709  * active in order to make the combination work better at the user
2710  * level but which aren't intended to be "used".
2711  *
2712  * Note that CODEC drivers should not use this as sidetone type paths
2713  * can frequently also be used as bypass paths.
2714  */
2715 int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm,
2716                              const struct snd_soc_dapm_route *route, int num)
2717 {
2718         int i, err;
2719         int ret = 0;
2720
2721         mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT);
2722         for (i = 0; i < num; i++) {
2723                 err = snd_soc_dapm_weak_route(dapm, route);
2724                 if (err)
2725                         ret = err;
2726                 route++;
2727         }
2728         mutex_unlock(&dapm->card->dapm_mutex);
2729
2730         return ret;
2731 }
2732 EXPORT_SYMBOL_GPL(snd_soc_dapm_weak_routes);
2733
2734 /**
2735  * snd_soc_dapm_new_widgets - add new dapm widgets
2736  * @dapm: DAPM context
2737  *
2738  * Checks the codec for any new dapm widgets and creates them if found.
2739  *
2740  * Returns 0 for success.
2741  */
2742 int snd_soc_dapm_new_widgets(struct snd_soc_card *card)
2743 {
2744         struct snd_soc_dapm_widget *w;
2745         unsigned int val;
2746
2747         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT);
2748
2749         list_for_each_entry(w, &card->widgets, list)
2750         {
2751                 if (w->new)
2752                         continue;
2753
2754                 if (w->num_kcontrols) {
2755                         w->kcontrols = kzalloc(w->num_kcontrols *
2756                                                 sizeof(struct snd_kcontrol *),
2757                                                 GFP_KERNEL);
2758                         if (!w->kcontrols) {
2759                                 mutex_unlock(&card->dapm_mutex);
2760                                 return -ENOMEM;
2761                         }
2762                 }
2763
2764                 switch(w->id) {
2765                 case snd_soc_dapm_switch:
2766                 case snd_soc_dapm_mixer:
2767                 case snd_soc_dapm_mixer_named_ctl:
2768                         dapm_new_mixer(w);
2769                         break;
2770                 case snd_soc_dapm_mux:
2771                 case snd_soc_dapm_virt_mux:
2772                 case snd_soc_dapm_value_mux:
2773                         dapm_new_mux(w);
2774                         break;
2775                 case snd_soc_dapm_pga:
2776                 case snd_soc_dapm_out_drv:
2777                         dapm_new_pga(w);
2778                         break;
2779                 default:
2780                         break;
2781                 }
2782
2783                 /* Read the initial power state from the device */
2784                 if (w->reg >= 0) {
2785                         val = soc_widget_read(w, w->reg) >> w->shift;
2786                         val &= w->mask;
2787                         if (val == w->on_val)
2788                                 w->power = 1;
2789                 }
2790
2791                 w->new = 1;
2792
2793                 dapm_mark_dirty(w, "new widget");
2794                 dapm_debugfs_add_widget(w);
2795         }
2796
2797         dapm_power_widgets(card, SND_SOC_DAPM_STREAM_NOP);
2798         mutex_unlock(&card->dapm_mutex);
2799         return 0;
2800 }
2801 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
2802
2803 /**
2804  * snd_soc_dapm_get_volsw - dapm mixer get callback
2805  * @kcontrol: mixer control
2806  * @ucontrol: control element information
2807  *
2808  * Callback to get the value of a dapm mixer control.
2809  *
2810  * Returns 0 for success.
2811  */
2812 int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
2813         struct snd_ctl_elem_value *ucontrol)
2814 {
2815         struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
2816         struct snd_soc_card *card = codec->card;
2817         struct soc_mixer_control *mc =
2818                 (struct soc_mixer_control *)kcontrol->private_value;
2819         int reg = mc->reg;
2820         unsigned int shift = mc->shift;
2821         int max = mc->max;
2822         unsigned int mask = (1 << fls(max)) - 1;
2823         unsigned int invert = mc->invert;
2824         unsigned int val;
2825
2826         if (snd_soc_volsw_is_stereo(mc))
2827                 dev_warn(codec->dapm.dev,
2828                          "ASoC: Control '%s' is stereo, which is not supported\n",
2829                          kcontrol->id.name);
2830
2831         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
2832         if (dapm_kcontrol_is_powered(kcontrol) && reg != SND_SOC_NOPM)
2833                 val = (snd_soc_read(codec, reg) >> shift) & mask;
2834         else
2835                 val = dapm_kcontrol_get_value(kcontrol);
2836         mutex_unlock(&card->dapm_mutex);
2837
2838         if (invert)
2839                 ucontrol->value.integer.value[0] = max - val;
2840         else
2841                 ucontrol->value.integer.value[0] = val;
2842
2843         return 0;
2844 }
2845 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw);
2846
2847 /**
2848  * snd_soc_dapm_put_volsw - dapm mixer set callback
2849  * @kcontrol: mixer control
2850  * @ucontrol: control element information
2851  *
2852  * Callback to set the value of a dapm mixer control.
2853  *
2854  * Returns 0 for success.
2855  */
2856 int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
2857         struct snd_ctl_elem_value *ucontrol)
2858 {
2859         struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
2860         struct snd_soc_card *card = codec->card;
2861         struct soc_mixer_control *mc =
2862                 (struct soc_mixer_control *)kcontrol->private_value;
2863         int reg = mc->reg;
2864         unsigned int shift = mc->shift;
2865         int max = mc->max;
2866         unsigned int mask = (1 << fls(max)) - 1;
2867         unsigned int invert = mc->invert;
2868         unsigned int val;
2869         int connect, change;
2870         struct snd_soc_dapm_update update;
2871
2872         if (snd_soc_volsw_is_stereo(mc))
2873                 dev_warn(codec->dapm.dev,
2874                          "ASoC: Control '%s' is stereo, which is not supported\n",
2875                          kcontrol->id.name);
2876
2877         val = (ucontrol->value.integer.value[0] & mask);
2878         connect = !!val;
2879
2880         if (invert)
2881                 val = max - val;
2882
2883         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
2884
2885         change = dapm_kcontrol_set_value(kcontrol, val);
2886
2887         if (reg != SND_SOC_NOPM) {
2888                 mask = mask << shift;
2889                 val = val << shift;
2890
2891                 change = snd_soc_test_bits(codec, reg, mask, val);
2892         }
2893
2894         if (change) {
2895                 if (reg != SND_SOC_NOPM) {
2896                         update.kcontrol = kcontrol;
2897                         update.reg = reg;
2898                         update.mask = mask;
2899                         update.val = val;
2900
2901                         card->update = &update;
2902                 }
2903
2904                 soc_dapm_mixer_update_power(card, kcontrol, connect);
2905
2906                 card->update = NULL;
2907         }
2908
2909         mutex_unlock(&card->dapm_mutex);
2910         return change;
2911 }
2912 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
2913
2914 /**
2915  * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback
2916  * @kcontrol: mixer control
2917  * @ucontrol: control element information
2918  *
2919  * Callback to get the value of a dapm enumerated double mixer control.
2920  *
2921  * Returns 0 for success.
2922  */
2923 int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
2924         struct snd_ctl_elem_value *ucontrol)
2925 {
2926         struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
2927         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
2928         unsigned int val;
2929
2930         val = snd_soc_read(codec, e->reg);
2931         ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & e->mask;
2932         if (e->shift_l != e->shift_r)
2933                 ucontrol->value.enumerated.item[1] =
2934                         (val >> e->shift_r) & e->mask;
2935
2936         return 0;
2937 }
2938 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double);
2939
2940 /**
2941  * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback
2942  * @kcontrol: mixer control
2943  * @ucontrol: control element information
2944  *
2945  * Callback to set the value of a dapm enumerated double mixer control.
2946  *
2947  * Returns 0 for success.
2948  */
2949 int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
2950         struct snd_ctl_elem_value *ucontrol)
2951 {
2952         struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
2953         struct snd_soc_card *card = codec->card;
2954         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
2955         unsigned int val, mux, change;
2956         unsigned int mask;
2957         struct snd_soc_dapm_update update;
2958
2959         if (ucontrol->value.enumerated.item[0] > e->max - 1)
2960                 return -EINVAL;
2961         mux = ucontrol->value.enumerated.item[0];
2962         val = mux << e->shift_l;
2963         mask = e->mask << e->shift_l;
2964         if (e->shift_l != e->shift_r) {
2965                 if (ucontrol->value.enumerated.item[1] > e->max - 1)
2966                         return -EINVAL;
2967                 val |= ucontrol->value.enumerated.item[1] << e->shift_r;
2968                 mask |= e->mask << e->shift_r;
2969         }
2970
2971         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
2972
2973         change = snd_soc_test_bits(codec, e->reg, mask, val);
2974         if (change) {
2975                 update.kcontrol = kcontrol;
2976                 update.reg = e->reg;
2977                 update.mask = mask;
2978                 update.val = val;
2979                 card->update = &update;
2980
2981                 soc_dapm_mux_update_power(card, kcontrol, mux, e);
2982
2983                 card->update = NULL;
2984         }
2985
2986         mutex_unlock(&card->dapm_mutex);
2987         return change;
2988 }
2989 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double);
2990
2991 /**
2992  * snd_soc_dapm_get_enum_virt - Get virtual DAPM mux
2993  * @kcontrol: mixer control
2994  * @ucontrol: control element information
2995  *
2996  * Returns 0 for success.
2997  */
2998 int snd_soc_dapm_get_enum_virt(struct snd_kcontrol *kcontrol,
2999                                struct snd_ctl_elem_value *ucontrol)
3000 {
3001         ucontrol->value.enumerated.item[0] = dapm_kcontrol_get_value(kcontrol);
3002         return 0;
3003 }
3004 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_virt);
3005
3006 /**
3007  * snd_soc_dapm_put_enum_virt - Set virtual DAPM mux
3008  * @kcontrol: mixer control
3009  * @ucontrol: control element information
3010  *
3011  * Returns 0 for success.
3012  */
3013 int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol,
3014                                struct snd_ctl_elem_value *ucontrol)
3015 {
3016         struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
3017         struct snd_soc_card *card = codec->card;
3018         unsigned int value;
3019         struct soc_enum *e =
3020                 (struct soc_enum *)kcontrol->private_value;
3021         int change;
3022
3023         if (ucontrol->value.enumerated.item[0] >= e->max)
3024                 return -EINVAL;
3025
3026         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
3027
3028         value = ucontrol->value.enumerated.item[0];
3029         change = dapm_kcontrol_set_value(kcontrol, value);
3030         if (change)
3031                 soc_dapm_mux_update_power(card, kcontrol, value, e);
3032
3033         mutex_unlock(&card->dapm_mutex);
3034         return change;
3035 }
3036 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_virt);
3037
3038 /**
3039  * snd_soc_dapm_get_value_enum_double - dapm semi enumerated double mixer get
3040  *                                      callback
3041  * @kcontrol: mixer control
3042  * @ucontrol: control element information
3043  *
3044  * Callback to get the value of a dapm semi enumerated double mixer control.
3045  *
3046  * Semi enumerated mixer: the enumerated items are referred as values. Can be
3047  * used for handling bitfield coded enumeration for example.
3048  *
3049  * Returns 0 for success.
3050  */
3051 int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol,
3052         struct snd_ctl_elem_value *ucontrol)
3053 {
3054         struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
3055         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
3056         unsigned int reg_val, val, mux;
3057
3058         reg_val = snd_soc_read(codec, e->reg);
3059         val = (reg_val >> e->shift_l) & e->mask;
3060         for (mux = 0; mux < e->max; mux++) {
3061                 if (val == e->values[mux])
3062                         break;
3063         }
3064         ucontrol->value.enumerated.item[0] = mux;
3065         if (e->shift_l != e->shift_r) {
3066                 val = (reg_val >> e->shift_r) & e->mask;
3067                 for (mux = 0; mux < e->max; mux++) {
3068                         if (val == e->values[mux])
3069                                 break;
3070                 }
3071                 ucontrol->value.enumerated.item[1] = mux;
3072         }
3073
3074         return 0;
3075 }
3076 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_value_enum_double);
3077
3078 /**
3079  * snd_soc_dapm_put_value_enum_double - dapm semi enumerated double mixer set
3080  *                                      callback
3081  * @kcontrol: mixer control
3082  * @ucontrol: control element information
3083  *
3084  * Callback to set the value of a dapm semi enumerated double mixer control.
3085  *
3086  * Semi enumerated mixer: the enumerated items are referred as values. Can be
3087  * used for handling bitfield coded enumeration for example.
3088  *
3089  * Returns 0 for success.
3090  */
3091 int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
3092         struct snd_ctl_elem_value *ucontrol)
3093 {
3094         struct snd_soc_codec *codec = snd_soc_dapm_kcontrol_codec(kcontrol);
3095         struct snd_soc_card *card = codec->card;
3096         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
3097         unsigned int val, mux, change;
3098         unsigned int mask;
3099         struct snd_soc_dapm_update update;
3100
3101         if (ucontrol->value.enumerated.item[0] > e->max - 1)
3102                 return -EINVAL;
3103         mux = ucontrol->value.enumerated.item[0];
3104         val = e->values[ucontrol->value.enumerated.item[0]] << e->shift_l;
3105         mask = e->mask << e->shift_l;
3106         if (e->shift_l != e->shift_r) {
3107                 if (ucontrol->value.enumerated.item[1] > e->max - 1)
3108                         return -EINVAL;
3109                 val |= e->values[ucontrol->value.enumerated.item[1]] << e->shift_r;
3110                 mask |= e->mask << e->shift_r;
3111         }
3112
3113         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
3114
3115         change = snd_soc_test_bits(codec, e->reg, mask, val);
3116         if (change) {
3117                 update.kcontrol = kcontrol;
3118                 update.reg = e->reg;
3119                 update.mask = mask;
3120                 update.val = val;
3121                 card->update = &update;
3122
3123                 soc_dapm_mux_update_power(card, kcontrol, mux, e);
3124
3125                 card->update = NULL;
3126         }
3127
3128         mutex_unlock(&card->dapm_mutex);
3129         return change;
3130 }
3131 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_value_enum_double);
3132
3133 /**
3134  * snd_soc_dapm_info_pin_switch - Info for a pin switch
3135  *
3136  * @kcontrol: mixer control
3137  * @uinfo: control element information
3138  *
3139  * Callback to provide information about a pin switch control.
3140  */
3141 int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol,
3142                                  struct snd_ctl_elem_info *uinfo)
3143 {
3144         uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
3145         uinfo->count = 1;
3146         uinfo->value.integer.min = 0;
3147         uinfo->value.integer.max = 1;
3148
3149         return 0;
3150 }
3151 EXPORT_SYMBOL_GPL(snd_soc_dapm_info_pin_switch);
3152
3153 /**
3154  * snd_soc_dapm_get_pin_switch - Get information for a pin switch
3155  *
3156  * @kcontrol: mixer control
3157  * @ucontrol: Value
3158  */
3159 int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,
3160                                 struct snd_ctl_elem_value *ucontrol)
3161 {
3162         struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
3163         const char *pin = (const char *)kcontrol->private_value;
3164
3165         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
3166
3167         ucontrol->value.integer.value[0] =
3168                 snd_soc_dapm_get_pin_status(&card->dapm, pin);
3169
3170         mutex_unlock(&card->dapm_mutex);
3171
3172         return 0;
3173 }
3174 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_switch);
3175
3176 /**
3177  * snd_soc_dapm_put_pin_switch - Set information for a pin switch
3178  *
3179  * @kcontrol: mixer control
3180  * @ucontrol: Value
3181  */
3182 int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
3183                                 struct snd_ctl_elem_value *ucontrol)
3184 {
3185         struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
3186         const char *pin = (const char *)kcontrol->private_value;
3187
3188         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
3189
3190         if (ucontrol->value.integer.value[0])
3191                 snd_soc_dapm_enable_pin(&card->dapm, pin);
3192         else
3193                 snd_soc_dapm_disable_pin(&card->dapm, pin);
3194
3195         mutex_unlock(&card->dapm_mutex);
3196
3197         snd_soc_dapm_sync(&card->dapm);
3198         return 0;
3199 }
3200 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
3201
3202 static struct snd_soc_dapm_widget *
3203 snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
3204                          const struct snd_soc_dapm_widget *widget)
3205 {
3206         struct snd_soc_dapm_widget *w;
3207         int ret;
3208
3209         if ((w = dapm_cnew_widget(widget)) == NULL)
3210                 return NULL;
3211
3212         switch (w->id) {
3213         case snd_soc_dapm_regulator_supply:
3214                 w->regulator = devm_regulator_get(dapm->dev, w->name);
3215                 if (IS_ERR(w->regulator)) {
3216                         ret = PTR_ERR(w->regulator);
3217                         dev_err(dapm->dev, "ASoC: Failed to request %s: %d\n",
3218                                 w->name, ret);
3219                         return NULL;
3220                 }
3221
3222                 if (w->on_val & SND_SOC_DAPM_REGULATOR_BYPASS) {
3223                         ret = regulator_allow_bypass(w->regulator, true);
3224                         if (ret != 0)
3225                                 dev_warn(w->dapm->dev,
3226                                          "ASoC: Failed to unbypass %s: %d\n",
3227                                          w->name, ret);
3228                 }
3229                 break;
3230         case snd_soc_dapm_clock_supply:
3231 #ifdef CONFIG_CLKDEV_LOOKUP
3232                 w->clk = devm_clk_get(dapm->dev, w->name);
3233                 if (IS_ERR(w->clk)) {
3234                         ret = PTR_ERR(w->clk);
3235                         dev_err(dapm->dev, "ASoC: Failed to request %s: %d\n",
3236                                 w->name, ret);
3237                         return NULL;
3238                 }
3239 #else
3240                 return NULL;
3241 #endif
3242                 break;
3243         default:
3244                 break;
3245         }
3246
3247         if (dapm->codec && dapm->codec->name_prefix)
3248                 w->name = kasprintf(GFP_KERNEL, "%s %s",
3249                         dapm->codec->name_prefix, widget->name);
3250         else
3251                 w->name = kasprintf(GFP_KERNEL, "%s", widget->name);
3252
3253         if (w->name == NULL) {
3254                 kfree(w);
3255                 return NULL;
3256         }
3257
3258         switch (w->id) {
3259         case snd_soc_dapm_switch:
3260         case snd_soc_dapm_mixer:
3261         case snd_soc_dapm_mixer_named_ctl:
3262                 w->power_check = dapm_generic_check_power;
3263                 break;
3264         case snd_soc_dapm_mux:
3265         case snd_soc_dapm_virt_mux:
3266         case snd_soc_dapm_value_mux:
3267                 w->power_check = dapm_generic_check_power;
3268                 break;
3269         case snd_soc_dapm_dai_out:
3270                 w->power_check = dapm_adc_check_power;
3271                 break;
3272         case snd_soc_dapm_dai_in:
3273                 w->power_check = dapm_dac_check_power;
3274                 break;
3275         case snd_soc_dapm_adc:
3276         case snd_soc_dapm_aif_out:
3277         case snd_soc_dapm_dac:
3278         case snd_soc_dapm_aif_in:
3279         case snd_soc_dapm_pga:
3280         case snd_soc_dapm_out_drv:
3281         case snd_soc_dapm_input:
3282         case snd_soc_dapm_output:
3283         case snd_soc_dapm_micbias:
3284         case snd_soc_dapm_spk:
3285         case snd_soc_dapm_hp:
3286         case snd_soc_dapm_mic:
3287         case snd_soc_dapm_line:
3288         case snd_soc_dapm_dai_link:
3289                 w->power_check = dapm_generic_check_power;
3290                 break;
3291         case snd_soc_dapm_supply:
3292         case snd_soc_dapm_regulator_supply:
3293         case snd_soc_dapm_clock_supply:
3294         case snd_soc_dapm_kcontrol:
3295                 w->power_check = dapm_supply_check_power;
3296                 break;
3297         default:
3298                 w->power_check = dapm_always_on_check_power;
3299                 break;
3300         }
3301
3302         w->dapm = dapm;
3303         w->codec = dapm->codec;
3304         w->platform = dapm->platform;
3305         INIT_LIST_HEAD(&w->sources);
3306         INIT_LIST_HEAD(&w->sinks);
3307         INIT_LIST_HEAD(&w->list);
3308         INIT_LIST_HEAD(&w->dirty);
3309         list_add(&w->list, &dapm->card->widgets);
3310
3311         /* machine layer set ups unconnected pins and insertions */
3312         w->connected = 1;
3313         return w;
3314 }
3315
3316 /**
3317  * snd_soc_dapm_new_controls - create new dapm controls
3318  * @dapm: DAPM context
3319  * @widget: widget array
3320  * @num: number of widgets
3321  *
3322  * Creates new DAPM controls based upon the templates.
3323  *
3324  * Returns 0 for success else error.
3325  */
3326 int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,
3327         const struct snd_soc_dapm_widget *widget,
3328         int num)
3329 {
3330         struct snd_soc_dapm_widget *w;
3331         int i;
3332         int ret = 0;
3333
3334         mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_INIT);
3335         for (i = 0; i < num; i++) {
3336                 w = snd_soc_dapm_new_control(dapm, widget);
3337                 if (!w) {
3338                         dev_err(dapm->dev,
3339                                 "ASoC: Failed to create DAPM control %s\n",
3340                                 widget->name);
3341                         ret = -ENOMEM;
3342                         break;
3343                 }
3344                 widget++;
3345         }
3346         mutex_unlock(&dapm->card->dapm_mutex);
3347         return ret;
3348 }
3349 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls);
3350
3351 static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
3352                                   struct snd_kcontrol *kcontrol, int event)
3353 {
3354         struct snd_soc_dapm_path *source_p, *sink_p;
3355         struct snd_soc_dai *source, *sink;
3356         const struct snd_soc_pcm_stream *config = w->params;
3357         struct snd_pcm_substream substream;
3358         struct snd_pcm_hw_params *params = NULL;
3359         u64 fmt;
3360         int ret;
3361
3362         BUG_ON(!config);
3363         BUG_ON(list_empty(&w->sources) || list_empty(&w->sinks));
3364
3365         /* We only support a single source and sink, pick the first */
3366         source_p = list_first_entry(&w->sources, struct snd_soc_dapm_path,
3367                                     list_sink);
3368         sink_p = list_first_entry(&w->sinks, struct snd_soc_dapm_path,
3369                                   list_source);
3370
3371         BUG_ON(!source_p || !sink_p);
3372         BUG_ON(!sink_p->source || !source_p->sink);
3373         BUG_ON(!source_p->source || !sink_p->sink);
3374
3375         source = source_p->source->priv;
3376         sink = sink_p->sink->priv;
3377
3378         /* Be a little careful as we don't want to overflow the mask array */
3379         if (config->formats) {
3380                 fmt = ffs(config->formats) - 1;
3381         } else {
3382                 dev_warn(w->dapm->dev, "ASoC: Invalid format %llx specified\n",
3383                          config->formats);
3384                 fmt = 0;
3385         }
3386
3387         /* Currently very limited parameter selection */
3388         params = kzalloc(sizeof(*params), GFP_KERNEL);
3389         if (!params) {
3390                 ret = -ENOMEM;
3391                 goto out;
3392         }
3393         snd_mask_set(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), fmt);
3394
3395         hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE)->min =
3396                 config->rate_min;
3397         hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE)->max =
3398                 config->rate_max;
3399
3400         hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS)->min
3401                 = config->channels_min;
3402         hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS)->max
3403                 = config->channels_max;
3404
3405         memset(&substream, 0, sizeof(substream));
3406
3407         switch (event) {
3408         case SND_SOC_DAPM_PRE_PMU:
3409                 if (source->driver->ops && source->driver->ops->hw_params) {
3410                         substream.stream = SNDRV_PCM_STREAM_CAPTURE;
3411                         ret = source->driver->ops->hw_params(&substream,
3412                                                              params, source);
3413                         if (ret != 0) {
3414                                 dev_err(source->dev,
3415                                         "ASoC: hw_params() failed: %d\n", ret);
3416                                 goto out;
3417                         }
3418                 }
3419
3420                 if (sink->driver->ops && sink->driver->ops->hw_params) {
3421                         substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
3422                         ret = sink->driver->ops->hw_params(&substream, params,
3423                                                            sink);
3424                         if (ret != 0) {
3425                                 dev_err(sink->dev,
3426                                         "ASoC: hw_params() failed: %d\n", ret);
3427                                 goto out;
3428                         }
3429                 }
3430                 break;
3431
3432         case SND_SOC_DAPM_POST_PMU:
3433                 ret = snd_soc_dai_digital_mute(sink, 0,
3434                                                SNDRV_PCM_STREAM_PLAYBACK);
3435                 if (ret != 0 && ret != -ENOTSUPP)
3436                         dev_warn(sink->dev, "ASoC: Failed to unmute: %d\n", ret);
3437                 ret = 0;
3438                 break;
3439
3440         case SND_SOC_DAPM_PRE_PMD:
3441                 ret = snd_soc_dai_digital_mute(sink, 1,
3442                                                SNDRV_PCM_STREAM_PLAYBACK);
3443                 if (ret != 0 && ret != -ENOTSUPP)
3444                         dev_warn(sink->dev, "ASoC: Failed to mute: %d\n", ret);
3445                 ret = 0;
3446                 break;
3447
3448         default:
3449                 BUG();
3450                 return -EINVAL;
3451         }
3452
3453 out:
3454         kfree(params);
3455         return ret;
3456 }
3457
3458 int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
3459                          const struct snd_soc_pcm_stream *params,
3460                          struct snd_soc_dapm_widget *source,
3461                          struct snd_soc_dapm_widget *sink)
3462 {
3463         struct snd_soc_dapm_route routes[2];
3464         struct snd_soc_dapm_widget template;
3465         struct snd_soc_dapm_widget *w;
3466         size_t len;
3467         char *link_name;
3468
3469         len = strlen(source->name) + strlen(sink->name) + 2;
3470         link_name = devm_kzalloc(card->dev, len, GFP_KERNEL);
3471         if (!link_name)
3472                 return -ENOMEM;
3473         snprintf(link_name, len, "%s-%s", source->name, sink->name);
3474
3475         memset(&template, 0, sizeof(template));
3476         template.reg = SND_SOC_NOPM;
3477         template.id = snd_soc_dapm_dai_link;
3478         template.name = link_name;
3479         template.event = snd_soc_dai_link_event;
3480         template.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
3481                 SND_SOC_DAPM_PRE_PMD;
3482
3483         dev_dbg(card->dev, "ASoC: adding %s widget\n", link_name);
3484
3485         w = snd_soc_dapm_new_control(&card->dapm, &template);
3486         if (!w) {
3487                 dev_err(card->dev, "ASoC: Failed to create %s widget\n",
3488                         link_name);
3489                 return -ENOMEM;
3490         }
3491
3492         w->params = params;
3493
3494         memset(&routes, 0, sizeof(routes));
3495
3496         routes[0].source = source->name;
3497         routes[0].sink = link_name;
3498         routes[1].source = link_name;
3499         routes[1].sink = sink->name;
3500
3501         return snd_soc_dapm_add_routes(&card->dapm, routes,
3502                                        ARRAY_SIZE(routes));
3503 }
3504
3505 int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
3506                                  struct snd_soc_dai *dai)
3507 {
3508         struct snd_soc_dapm_widget template;
3509         struct snd_soc_dapm_widget *w;
3510
3511         WARN_ON(dapm->dev != dai->dev);
3512
3513         memset(&template, 0, sizeof(template));
3514         template.reg = SND_SOC_NOPM;
3515
3516         if (dai->driver->playback.stream_name) {
3517                 template.id = snd_soc_dapm_dai_in;
3518                 template.name = dai->driver->playback.stream_name;
3519                 template.sname = dai->driver->playback.stream_name;
3520
3521                 dev_dbg(dai->dev, "ASoC: adding %s widget\n",
3522                         template.name);
3523
3524                 w = snd_soc_dapm_new_control(dapm, &template);
3525                 if (!w) {
3526                         dev_err(dapm->dev, "ASoC: Failed to create %s widget\n",
3527                                 dai->driver->playback.stream_name);
3528                         return -ENOMEM;
3529                 }
3530
3531                 w->priv = dai;
3532                 dai->playback_widget = w;
3533         }
3534
3535         if (dai->driver->capture.stream_name) {
3536                 template.id = snd_soc_dapm_dai_out;
3537                 template.name = dai->driver->capture.stream_name;
3538                 template.sname = dai->driver->capture.stream_name;
3539
3540                 dev_dbg(dai->dev, "ASoC: adding %s widget\n",
3541                         template.name);
3542
3543                 w = snd_soc_dapm_new_control(dapm, &template);
3544                 if (!w) {
3545                         dev_err(dapm->dev, "ASoC: Failed to create %s widget\n",
3546                                 dai->driver->capture.stream_name);
3547                         return -ENOMEM;
3548                 }
3549
3550                 w->priv = dai;
3551                 dai->capture_widget = w;
3552         }
3553
3554         return 0;
3555 }
3556
3557 int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
3558 {
3559         struct snd_soc_dapm_widget *dai_w, *w;
3560         struct snd_soc_dai *dai;
3561
3562         /* For each DAI widget... */
3563         list_for_each_entry(dai_w, &card->widgets, list) {
3564                 switch (dai_w->id) {
3565                 case snd_soc_dapm_dai_in:
3566                 case snd_soc_dapm_dai_out:
3567                         break;
3568                 default:
3569                         continue;
3570                 }
3571
3572                 dai = dai_w->priv;
3573
3574                 /* ...find all widgets with the same stream and link them */
3575                 list_for_each_entry(w, &card->widgets, list) {
3576                         if (w->dapm != dai_w->dapm)
3577                                 continue;
3578
3579                         switch (w->id) {
3580                         case snd_soc_dapm_dai_in:
3581                         case snd_soc_dapm_dai_out:
3582                                 continue;
3583                         default:
3584                                 break;
3585                         }
3586
3587                         if (!w->sname || !strstr(w->sname, dai_w->name))
3588                                 continue;
3589
3590                         if (dai->driver->playback.stream_name &&
3591                             strstr(w->sname,
3592                                    dai->driver->playback.stream_name)) {
3593                                 dev_dbg(dai->dev, "%s -> %s\n",
3594                                          dai->playback_widget->name, w->name);
3595
3596                                 snd_soc_dapm_add_path(w->dapm,
3597                                         dai->playback_widget, w, NULL, NULL);
3598                         }
3599
3600                         if (dai->driver->capture.stream_name &&
3601                             strstr(w->sname,
3602                                    dai->driver->capture.stream_name)) {
3603                                 dev_dbg(dai->dev, "%s -> %s\n",
3604                                         w->name, dai->capture_widget->name);
3605
3606                                 snd_soc_dapm_add_path(w->dapm, w,
3607                                         dai->capture_widget, NULL, NULL);
3608                         }
3609                 }
3610         }
3611
3612         return 0;
3613 }
3614
3615 static void soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
3616         int event)
3617 {
3618
3619         struct snd_soc_dapm_widget *w_cpu, *w_codec;
3620         struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
3621         struct snd_soc_dai *codec_dai = rtd->codec_dai;
3622
3623         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
3624                 w_cpu = cpu_dai->playback_widget;
3625                 w_codec = codec_dai->playback_widget;
3626         } else {
3627                 w_cpu = cpu_dai->capture_widget;
3628                 w_codec = codec_dai->capture_widget;
3629         }
3630
3631         if (w_cpu) {
3632
3633                 dapm_mark_dirty(w_cpu, "stream event");
3634
3635                 switch (event) {
3636                 case SND_SOC_DAPM_STREAM_START:
3637                         w_cpu->active = 1;
3638                         break;
3639                 case SND_SOC_DAPM_STREAM_STOP:
3640                         w_cpu->active = 0;
3641                         break;
3642                 case SND_SOC_DAPM_STREAM_SUSPEND:
3643                 case SND_SOC_DAPM_STREAM_RESUME:
3644                 case SND_SOC_DAPM_STREAM_PAUSE_PUSH:
3645                 case SND_SOC_DAPM_STREAM_PAUSE_RELEASE:
3646                         break;
3647                 }
3648         }
3649
3650         if (w_codec) {
3651
3652                 dapm_mark_dirty(w_codec, "stream event");
3653
3654                 switch (event) {
3655                 case SND_SOC_DAPM_STREAM_START:
3656                         w_codec->active = 1;
3657                         break;
3658                 case SND_SOC_DAPM_STREAM_STOP:
3659                         w_codec->active = 0;
3660                         break;
3661                 case SND_SOC_DAPM_STREAM_SUSPEND:
3662                 case SND_SOC_DAPM_STREAM_RESUME:
3663                 case SND_SOC_DAPM_STREAM_PAUSE_PUSH:
3664                 case SND_SOC_DAPM_STREAM_PAUSE_RELEASE:
3665                         break;
3666                 }
3667         }
3668
3669         dapm_power_widgets(rtd->card, event);
3670 }
3671
3672 /**
3673  * snd_soc_dapm_stream_event - send a stream event to the dapm core
3674  * @rtd: PCM runtime data
3675  * @stream: stream name
3676  * @event: stream event
3677  *
3678  * Sends a stream event to the dapm core. The core then makes any
3679  * necessary widget power changes.
3680  *
3681  * Returns 0 for success else error.
3682  */
3683 void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
3684                               int event)
3685 {
3686         struct snd_soc_card *card = rtd->card;
3687
3688         mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
3689         soc_dapm_stream_event(rtd, stream, event);
3690         mutex_unlock(&card->dapm_mutex);
3691 }
3692
3693 /**
3694  * snd_soc_dapm_enable_pin - enable pin.
3695  * @dapm: DAPM context
3696  * @pin: pin name
3697  *
3698  * Enables input/output pin and its parents or children widgets iff there is
3699  * a valid audio route and active audio stream.
3700  * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
3701  * do any widget power switching.
3702  */
3703 int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin)
3704 {
3705         return snd_soc_dapm_set_pin(dapm, pin, 1);
3706 }
3707 EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin);
3708
3709 /**
3710  * snd_soc_dapm_force_enable_pin - force a pin to be enabled
3711  * @dapm: DAPM context
3712  * @pin: pin name
3713  *
3714  * Enables input/output pin regardless of any other state.  This is
3715  * intended for use with microphone bias supplies used in microphone
3716  * jack detection.
3717  *
3718  * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
3719  * do any widget power switching.
3720  */
3721 int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
3722                                   const char *pin)
3723 {
3724         struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
3725
3726         if (!w) {
3727                 dev_err(dapm->dev, "ASoC: unknown pin %s\n", pin);
3728                 return -EINVAL;
3729         }
3730
3731         dev_dbg(w->dapm->dev, "ASoC: force enable pin %s\n", pin);
3732         w->connected = 1;
3733         w->force = 1;
3734         dapm_mark_dirty(w, "force enable");
3735
3736         return 0;
3737 }
3738 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin);
3739
3740 /**
3741  * snd_soc_dapm_disable_pin - disable pin.
3742  * @dapm: DAPM context
3743  * @pin: pin name
3744  *
3745  * Disables input/output pin and its parents or children widgets.
3746  * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
3747  * do any widget power switching.
3748  */
3749 int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm,
3750                              const char *pin)
3751 {
3752         return snd_soc_dapm_set_pin(dapm, pin, 0);
3753 }
3754 EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin);
3755
3756 /**
3757  * snd_soc_dapm_nc_pin - permanently disable pin.
3758  * @dapm: DAPM context
3759  * @pin: pin name
3760  *
3761  * Marks the specified pin as being not connected, disabling it along
3762  * any parent or child widgets.  At present this is identical to
3763  * snd_soc_dapm_disable_pin() but in future it will be extended to do
3764  * additional things such as disabling controls which only affect
3765  * paths through the pin.
3766  *
3767  * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
3768  * do any widget power switching.
3769  */
3770 int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin)
3771 {
3772         return snd_soc_dapm_set_pin(dapm, pin, 0);
3773 }
3774 EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin);
3775
3776 /**
3777  * snd_soc_dapm_get_pin_status - get audio pin status
3778  * @dapm: DAPM context
3779  * @pin: audio signal pin endpoint (or start point)
3780  *
3781  * Get audio pin status - connected or disconnected.
3782  *
3783  * Returns 1 for connected otherwise 0.
3784  */
3785 int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm,
3786                                 const char *pin)
3787 {
3788         struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
3789
3790         if (w)
3791                 return w->connected;
3792
3793         return 0;
3794 }
3795 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status);
3796
3797 /**
3798  * snd_soc_dapm_ignore_suspend - ignore suspend status for DAPM endpoint
3799  * @dapm: DAPM context
3800  * @pin: audio signal pin endpoint (or start point)
3801  *
3802  * Mark the given endpoint or pin as ignoring suspend.  When the
3803  * system is disabled a path between two endpoints flagged as ignoring
3804  * suspend will not be disabled.  The path must already be enabled via
3805  * normal means at suspend time, it will not be turned on if it was not
3806  * already enabled.
3807  */
3808 int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
3809                                 const char *pin)
3810 {
3811         struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, false);
3812
3813         if (!w) {
3814                 dev_err(dapm->dev, "ASoC: unknown pin %s\n", pin);
3815                 return -EINVAL;
3816         }
3817
3818         w->ignore_suspend = 1;
3819
3820         return 0;
3821 }
3822 EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
3823
3824 static bool snd_soc_dapm_widget_in_card_paths(struct snd_soc_card *card,
3825                                               struct snd_soc_dapm_widget *w)
3826 {
3827         struct snd_soc_dapm_path *p;
3828
3829         list_for_each_entry(p, &card->paths, list) {
3830                 if ((p->source == w) || (p->sink == w)) {
3831                         dev_dbg(card->dev,
3832                             "... Path %s(id:%d dapm:%p) - %s(id:%d dapm:%p)\n",
3833                             p->source->name, p->source->id, p->source->dapm,
3834                             p->sink->name, p->sink->id, p->sink->dapm);
3835
3836                         /* Connected to something other than the codec */
3837                         if (p->source->dapm != p->sink->dapm)
3838                                 return true;
3839                         /*
3840                          * Loopback connection from codec external pin to
3841                          * codec external pin
3842                          */
3843                         if (p->sink->id == snd_soc_dapm_input) {
3844                                 switch (p->source->id) {
3845                                 case snd_soc_dapm_output:
3846                                 case snd_soc_dapm_micbias:
3847                                         return true;
3848                                 default:
3849                                         break;
3850                                 }
3851                         }
3852                 }
3853         }
3854
3855         return false;
3856 }
3857
3858 /**
3859  * snd_soc_dapm_auto_nc_codec_pins - call snd_soc_dapm_nc_pin for unused pins
3860  * @codec: The codec whose pins should be processed
3861  *
3862  * Automatically call snd_soc_dapm_nc_pin() for any external pins in the codec
3863  * which are unused. Pins are used if they are connected externally to the
3864  * codec, whether that be to some other device, or a loop-back connection to
3865  * the codec itself.
3866  */
3867 void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec)
3868 {
3869         struct snd_soc_card *card = codec->card;
3870         struct snd_soc_dapm_context *dapm = &codec->dapm;
3871         struct snd_soc_dapm_widget *w;
3872
3873         dev_dbg(codec->dev, "ASoC: Auto NC: DAPMs: card:%p codec:%p\n",
3874                 &card->dapm, &codec->dapm);
3875
3876         list_for_each_entry(w, &card->widgets, list) {
3877                 if (w->dapm != dapm)
3878                         continue;
3879                 switch (w->id) {
3880                 case snd_soc_dapm_input:
3881                 case snd_soc_dapm_output:
3882                 case snd_soc_dapm_micbias:
3883                         dev_dbg(codec->dev, "ASoC: Auto NC: Checking widget %s\n",
3884                                 w->name);
3885                         if (!snd_soc_dapm_widget_in_card_paths(card, w)) {
3886                                 dev_dbg(codec->dev,
3887                                         "... Not in map; disabling\n");
3888                                 snd_soc_dapm_nc_pin(dapm, w->name);
3889                         }
3890                         break;
3891                 default:
3892                         break;
3893                 }
3894         }
3895 }
3896
3897 /**
3898  * snd_soc_dapm_free - free dapm resources
3899  * @dapm: DAPM context
3900  *
3901  * Free all dapm widgets and resources.
3902  */
3903 void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm)
3904 {
3905         snd_soc_dapm_sys_remove(dapm->dev);
3906         dapm_debugfs_cleanup(dapm);
3907         dapm_free_widgets(dapm);
3908         list_del(&dapm->list);
3909 }
3910 EXPORT_SYMBOL_GPL(snd_soc_dapm_free);
3911
3912 static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm)
3913 {
3914         struct snd_soc_card *card = dapm->card;
3915         struct snd_soc_dapm_widget *w;
3916         LIST_HEAD(down_list);
3917         int powerdown = 0;
3918
3919         mutex_lock(&card->dapm_mutex);
3920
3921         list_for_each_entry(w, &dapm->card->widgets, list) {
3922                 if (w->dapm != dapm)
3923                         continue;
3924                 if (w->power) {
3925                         dapm_seq_insert(w, &down_list, false);
3926                         w->power = 0;
3927                         powerdown = 1;
3928                 }
3929         }
3930
3931         /* If there were no widgets to power down we're already in
3932          * standby.
3933          */
3934         if (powerdown) {
3935                 if (dapm->bias_level == SND_SOC_BIAS_ON)
3936                         snd_soc_dapm_set_bias_level(dapm,
3937                                                     SND_SOC_BIAS_PREPARE);
3938                 dapm_seq_run(card, &down_list, 0, false);
3939                 if (dapm->bias_level == SND_SOC_BIAS_PREPARE)
3940                         snd_soc_dapm_set_bias_level(dapm,
3941                                                     SND_SOC_BIAS_STANDBY);
3942         }
3943
3944         mutex_unlock(&card->dapm_mutex);
3945 }
3946
3947 /*
3948  * snd_soc_dapm_shutdown - callback for system shutdown
3949  */
3950 void snd_soc_dapm_shutdown(struct snd_soc_card *card)
3951 {
3952         struct snd_soc_codec *codec;
3953
3954         list_for_each_entry(codec, &card->codec_dev_list, card_list) {
3955                 soc_dapm_shutdown_codec(&codec->dapm);
3956                 if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY)
3957                         snd_soc_dapm_set_bias_level(&codec->dapm,
3958                                                     SND_SOC_BIAS_OFF);
3959         }
3960 }
3961
3962 /* Module information */
3963 MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk");
3964 MODULE_DESCRIPTION("Dynamic Audio Power Management core for ALSA SoC");
3965 MODULE_LICENSE("GPL");