OSDN Git Service

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