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