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