xref: /linux/sound/soc/soc-dapm.c (revision b43ab901d671e3e3cad425ea5e9a3c74e266dcdd)
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/meadphone 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 powerdown of audio susbsystem to reduce pops between a quick
22  *      device reopen.
23  *
24  *  Todo:
25  *    o DAPM power change sequencing - allow for configurable per
26  *      codec sequences.
27  *    o Support for analogue bias optimisation.
28  *    o Support for reduced codec oversampling rates.
29  *    o Support for reduced codec bias currents.
30  */
31 
32 #include <linux/module.h>
33 #include <linux/moduleparam.h>
34 #include <linux/init.h>
35 #include <linux/async.h>
36 #include <linux/delay.h>
37 #include <linux/pm.h>
38 #include <linux/bitops.h>
39 #include <linux/platform_device.h>
40 #include <linux/jiffies.h>
41 #include <linux/debugfs.h>
42 #include <linux/pm_runtime.h>
43 #include <linux/slab.h>
44 #include <sound/core.h>
45 #include <sound/pcm.h>
46 #include <sound/pcm_params.h>
47 #include <sound/soc.h>
48 #include <sound/initval.h>
49 
50 #include <trace/events/asoc.h>
51 
52 #define DAPM_UPDATE_STAT(widget, val) widget->dapm->card->dapm_stats.val++;
53 
54 /* dapm power sequences - make this per codec in the future */
55 static int dapm_up_seq[] = {
56 	[snd_soc_dapm_pre] = 0,
57 	[snd_soc_dapm_supply] = 1,
58 	[snd_soc_dapm_micbias] = 2,
59 	[snd_soc_dapm_aif_in] = 3,
60 	[snd_soc_dapm_aif_out] = 3,
61 	[snd_soc_dapm_mic] = 4,
62 	[snd_soc_dapm_mux] = 5,
63 	[snd_soc_dapm_virt_mux] = 5,
64 	[snd_soc_dapm_value_mux] = 5,
65 	[snd_soc_dapm_dac] = 6,
66 	[snd_soc_dapm_mixer] = 7,
67 	[snd_soc_dapm_mixer_named_ctl] = 7,
68 	[snd_soc_dapm_pga] = 8,
69 	[snd_soc_dapm_adc] = 9,
70 	[snd_soc_dapm_out_drv] = 10,
71 	[snd_soc_dapm_hp] = 10,
72 	[snd_soc_dapm_spk] = 10,
73 	[snd_soc_dapm_post] = 11,
74 };
75 
76 static int dapm_down_seq[] = {
77 	[snd_soc_dapm_pre] = 0,
78 	[snd_soc_dapm_adc] = 1,
79 	[snd_soc_dapm_hp] = 2,
80 	[snd_soc_dapm_spk] = 2,
81 	[snd_soc_dapm_out_drv] = 2,
82 	[snd_soc_dapm_pga] = 4,
83 	[snd_soc_dapm_mixer_named_ctl] = 5,
84 	[snd_soc_dapm_mixer] = 5,
85 	[snd_soc_dapm_dac] = 6,
86 	[snd_soc_dapm_mic] = 7,
87 	[snd_soc_dapm_micbias] = 8,
88 	[snd_soc_dapm_mux] = 9,
89 	[snd_soc_dapm_virt_mux] = 9,
90 	[snd_soc_dapm_value_mux] = 9,
91 	[snd_soc_dapm_aif_in] = 10,
92 	[snd_soc_dapm_aif_out] = 10,
93 	[snd_soc_dapm_supply] = 11,
94 	[snd_soc_dapm_post] = 12,
95 };
96 
97 static void pop_wait(u32 pop_time)
98 {
99 	if (pop_time)
100 		schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time));
101 }
102 
103 static void pop_dbg(struct device *dev, u32 pop_time, const char *fmt, ...)
104 {
105 	va_list args;
106 	char *buf;
107 
108 	if (!pop_time)
109 		return;
110 
111 	buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
112 	if (buf == NULL)
113 		return;
114 
115 	va_start(args, fmt);
116 	vsnprintf(buf, PAGE_SIZE, fmt, args);
117 	dev_info(dev, "%s", buf);
118 	va_end(args);
119 
120 	kfree(buf);
121 }
122 
123 static bool dapm_dirty_widget(struct snd_soc_dapm_widget *w)
124 {
125 	return !list_empty(&w->dirty);
126 }
127 
128 void dapm_mark_dirty(struct snd_soc_dapm_widget *w, const char *reason)
129 {
130 	if (!dapm_dirty_widget(w)) {
131 		dev_vdbg(w->dapm->dev, "Marking %s dirty due to %s\n",
132 			 w->name, reason);
133 		list_add_tail(&w->dirty, &w->dapm->card->dapm_dirty);
134 	}
135 }
136 EXPORT_SYMBOL_GPL(dapm_mark_dirty);
137 
138 /* create a new dapm widget */
139 static inline struct snd_soc_dapm_widget *dapm_cnew_widget(
140 	const struct snd_soc_dapm_widget *_widget)
141 {
142 	return kmemdup(_widget, sizeof(*_widget), GFP_KERNEL);
143 }
144 
145 /* get snd_card from DAPM context */
146 static inline struct snd_card *dapm_get_snd_card(
147 	struct snd_soc_dapm_context *dapm)
148 {
149 	if (dapm->codec)
150 		return dapm->codec->card->snd_card;
151 	else if (dapm->platform)
152 		return dapm->platform->card->snd_card;
153 	else
154 		BUG();
155 
156 	/* unreachable */
157 	return NULL;
158 }
159 
160 /* get soc_card from DAPM context */
161 static inline struct snd_soc_card *dapm_get_soc_card(
162 		struct snd_soc_dapm_context *dapm)
163 {
164 	if (dapm->codec)
165 		return dapm->codec->card;
166 	else if (dapm->platform)
167 		return dapm->platform->card;
168 	else
169 		BUG();
170 
171 	/* unreachable */
172 	return NULL;
173 }
174 
175 static int soc_widget_read(struct snd_soc_dapm_widget *w, int reg)
176 {
177 	if (w->codec)
178 		return snd_soc_read(w->codec, reg);
179 	else if (w->platform)
180 		return snd_soc_platform_read(w->platform, reg);
181 
182 	dev_err(w->dapm->dev, "no valid widget read method\n");
183 	return -1;
184 }
185 
186 static int soc_widget_write(struct snd_soc_dapm_widget *w, int reg, int val)
187 {
188 	if (w->codec)
189 		return snd_soc_write(w->codec, reg, val);
190 	else if (w->platform)
191 		return snd_soc_platform_write(w->platform, reg, val);
192 
193 	dev_err(w->dapm->dev, "no valid widget write method\n");
194 	return -1;
195 }
196 
197 static int soc_widget_update_bits(struct snd_soc_dapm_widget *w,
198 	unsigned short reg, unsigned int mask, unsigned int value)
199 {
200 	int change;
201 	unsigned int old, new;
202 	int ret;
203 
204 	ret = soc_widget_read(w, reg);
205 	if (ret < 0)
206 		return ret;
207 
208 	old = ret;
209 	new = (old & ~mask) | (value & mask);
210 	change = old != new;
211 	if (change) {
212 		ret = soc_widget_write(w, reg, new);
213 		if (ret < 0)
214 			return ret;
215 	}
216 
217 	return change;
218 }
219 
220 /**
221  * snd_soc_dapm_set_bias_level - set the bias level for the system
222  * @dapm: DAPM context
223  * @level: level to configure
224  *
225  * Configure the bias (power) levels for the SoC audio device.
226  *
227  * Returns 0 for success else error.
228  */
229 static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm,
230 				       enum snd_soc_bias_level level)
231 {
232 	struct snd_soc_card *card = dapm->card;
233 	int ret = 0;
234 
235 	trace_snd_soc_bias_level_start(card, level);
236 
237 	if (card && card->set_bias_level)
238 		ret = card->set_bias_level(card, dapm, level);
239 	if (ret != 0)
240 		goto out;
241 
242 	if (dapm->codec) {
243 		if (dapm->codec->driver->set_bias_level)
244 			ret = dapm->codec->driver->set_bias_level(dapm->codec,
245 								  level);
246 		else
247 			dapm->bias_level = level;
248 	}
249 	if (ret != 0)
250 		goto out;
251 
252 	if (card && card->set_bias_level_post)
253 		ret = card->set_bias_level_post(card, dapm, level);
254 out:
255 	trace_snd_soc_bias_level_done(card, level);
256 
257 	return ret;
258 }
259 
260 /* set up initial codec paths */
261 static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
262 	struct snd_soc_dapm_path *p, int i)
263 {
264 	switch (w->id) {
265 	case snd_soc_dapm_switch:
266 	case snd_soc_dapm_mixer:
267 	case snd_soc_dapm_mixer_named_ctl: {
268 		int val;
269 		struct soc_mixer_control *mc = (struct soc_mixer_control *)
270 			w->kcontrol_news[i].private_value;
271 		unsigned int reg = mc->reg;
272 		unsigned int shift = mc->shift;
273 		int max = mc->max;
274 		unsigned int mask = (1 << fls(max)) - 1;
275 		unsigned int invert = mc->invert;
276 
277 		val = soc_widget_read(w, reg);
278 		val = (val >> shift) & mask;
279 
280 		if ((invert && !val) || (!invert && val))
281 			p->connect = 1;
282 		else
283 			p->connect = 0;
284 	}
285 	break;
286 	case snd_soc_dapm_mux: {
287 		struct soc_enum *e = (struct soc_enum *)
288 			w->kcontrol_news[i].private_value;
289 		int val, item, bitmask;
290 
291 		for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
292 			;
293 		val = soc_widget_read(w, e->reg);
294 		item = (val >> e->shift_l) & (bitmask - 1);
295 
296 		p->connect = 0;
297 		for (i = 0; i < e->max; i++) {
298 			if (!(strcmp(p->name, e->texts[i])) && item == i)
299 				p->connect = 1;
300 		}
301 	}
302 	break;
303 	case snd_soc_dapm_virt_mux: {
304 		struct soc_enum *e = (struct soc_enum *)
305 			w->kcontrol_news[i].private_value;
306 
307 		p->connect = 0;
308 		/* since a virtual mux has no backing registers to
309 		 * decide which path to connect, it will try to match
310 		 * with the first enumeration.  This is to ensure
311 		 * that the default mux choice (the first) will be
312 		 * correctly powered up during initialization.
313 		 */
314 		if (!strcmp(p->name, e->texts[0]))
315 			p->connect = 1;
316 	}
317 	break;
318 	case snd_soc_dapm_value_mux: {
319 		struct soc_enum *e = (struct soc_enum *)
320 			w->kcontrol_news[i].private_value;
321 		int val, item;
322 
323 		val = soc_widget_read(w, e->reg);
324 		val = (val >> e->shift_l) & e->mask;
325 		for (item = 0; item < e->max; item++) {
326 			if (val == e->values[item])
327 				break;
328 		}
329 
330 		p->connect = 0;
331 		for (i = 0; i < e->max; i++) {
332 			if (!(strcmp(p->name, e->texts[i])) && item == i)
333 				p->connect = 1;
334 		}
335 	}
336 	break;
337 	/* does not affect routing - always connected */
338 	case snd_soc_dapm_pga:
339 	case snd_soc_dapm_out_drv:
340 	case snd_soc_dapm_output:
341 	case snd_soc_dapm_adc:
342 	case snd_soc_dapm_input:
343 	case snd_soc_dapm_siggen:
344 	case snd_soc_dapm_dac:
345 	case snd_soc_dapm_micbias:
346 	case snd_soc_dapm_vmid:
347 	case snd_soc_dapm_supply:
348 	case snd_soc_dapm_aif_in:
349 	case snd_soc_dapm_aif_out:
350 	case snd_soc_dapm_hp:
351 	case snd_soc_dapm_mic:
352 	case snd_soc_dapm_spk:
353 	case snd_soc_dapm_line:
354 		p->connect = 1;
355 	break;
356 	/* does affect routing - dynamically connected */
357 	case snd_soc_dapm_pre:
358 	case snd_soc_dapm_post:
359 		p->connect = 0;
360 	break;
361 	}
362 }
363 
364 /* connect mux widget to its interconnecting audio paths */
365 static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
366 	struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
367 	struct snd_soc_dapm_path *path, const char *control_name,
368 	const struct snd_kcontrol_new *kcontrol)
369 {
370 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
371 	int i;
372 
373 	for (i = 0; i < e->max; i++) {
374 		if (!(strcmp(control_name, e->texts[i]))) {
375 			list_add(&path->list, &dapm->card->paths);
376 			list_add(&path->list_sink, &dest->sources);
377 			list_add(&path->list_source, &src->sinks);
378 			path->name = (char*)e->texts[i];
379 			dapm_set_path_status(dest, path, 0);
380 			return 0;
381 		}
382 	}
383 
384 	return -ENODEV;
385 }
386 
387 /* connect mixer widget to its interconnecting audio paths */
388 static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm,
389 	struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
390 	struct snd_soc_dapm_path *path, const char *control_name)
391 {
392 	int i;
393 
394 	/* search for mixer kcontrol */
395 	for (i = 0; i < dest->num_kcontrols; i++) {
396 		if (!strcmp(control_name, dest->kcontrol_news[i].name)) {
397 			list_add(&path->list, &dapm->card->paths);
398 			list_add(&path->list_sink, &dest->sources);
399 			list_add(&path->list_source, &src->sinks);
400 			path->name = dest->kcontrol_news[i].name;
401 			dapm_set_path_status(dest, path, i);
402 			return 0;
403 		}
404 	}
405 	return -ENODEV;
406 }
407 
408 static int dapm_is_shared_kcontrol(struct snd_soc_dapm_context *dapm,
409 	struct snd_soc_dapm_widget *kcontrolw,
410 	const struct snd_kcontrol_new *kcontrol_new,
411 	struct snd_kcontrol **kcontrol)
412 {
413 	struct snd_soc_dapm_widget *w;
414 	int i;
415 
416 	*kcontrol = NULL;
417 
418 	list_for_each_entry(w, &dapm->card->widgets, list) {
419 		if (w == kcontrolw || w->dapm != kcontrolw->dapm)
420 			continue;
421 		for (i = 0; i < w->num_kcontrols; i++) {
422 			if (&w->kcontrol_news[i] == kcontrol_new) {
423 				if (w->kcontrols)
424 					*kcontrol = w->kcontrols[i];
425 				return 1;
426 			}
427 		}
428 	}
429 
430 	return 0;
431 }
432 
433 /* create new dapm mixer control */
434 static int dapm_new_mixer(struct snd_soc_dapm_widget *w)
435 {
436 	struct snd_soc_dapm_context *dapm = w->dapm;
437 	int i, ret = 0;
438 	size_t name_len, prefix_len;
439 	struct snd_soc_dapm_path *path;
440 	struct snd_card *card = dapm->card->snd_card;
441 	const char *prefix;
442 	struct snd_soc_dapm_widget_list *wlist;
443 	size_t wlistsize;
444 
445 	if (dapm->codec)
446 		prefix = dapm->codec->name_prefix;
447 	else
448 		prefix = NULL;
449 
450 	if (prefix)
451 		prefix_len = strlen(prefix) + 1;
452 	else
453 		prefix_len = 0;
454 
455 	/* add kcontrol */
456 	for (i = 0; i < w->num_kcontrols; i++) {
457 
458 		/* match name */
459 		list_for_each_entry(path, &w->sources, list_sink) {
460 
461 			/* mixer/mux paths name must match control name */
462 			if (path->name != (char *)w->kcontrol_news[i].name)
463 				continue;
464 
465 			if (w->kcontrols[i]) {
466 				path->kcontrol = w->kcontrols[i];
467 				continue;
468 			}
469 
470 			wlistsize = sizeof(struct snd_soc_dapm_widget_list) +
471 				    sizeof(struct snd_soc_dapm_widget *),
472 			wlist = kzalloc(wlistsize, GFP_KERNEL);
473 			if (wlist == NULL) {
474 				dev_err(dapm->dev,
475 					"asoc: can't allocate widget list for %s\n",
476 					w->name);
477 				return -ENOMEM;
478 			}
479 			wlist->num_widgets = 1;
480 			wlist->widgets[0] = w;
481 
482 			/* add dapm control with long name.
483 			 * for dapm_mixer this is the concatenation of the
484 			 * mixer and kcontrol name.
485 			 * for dapm_mixer_named_ctl this is simply the
486 			 * kcontrol name.
487 			 */
488 			name_len = strlen(w->kcontrol_news[i].name) + 1;
489 			if (w->id != snd_soc_dapm_mixer_named_ctl)
490 				name_len += 1 + strlen(w->name);
491 
492 			path->long_name = kmalloc(name_len, GFP_KERNEL);
493 
494 			if (path->long_name == NULL) {
495 				kfree(wlist);
496 				return -ENOMEM;
497 			}
498 
499 			switch (w->id) {
500 			default:
501 				/* The control will get a prefix from
502 				 * the control creation process but
503 				 * we're also using the same prefix
504 				 * for widgets so cut the prefix off
505 				 * the front of the widget name.
506 				 */
507 				snprintf(path->long_name, name_len, "%s %s",
508 					 w->name + prefix_len,
509 					 w->kcontrol_news[i].name);
510 				break;
511 			case snd_soc_dapm_mixer_named_ctl:
512 				snprintf(path->long_name, name_len, "%s",
513 					 w->kcontrol_news[i].name);
514 				break;
515 			}
516 
517 			path->long_name[name_len - 1] = '\0';
518 
519 			path->kcontrol = snd_soc_cnew(&w->kcontrol_news[i],
520 						      wlist, path->long_name,
521 						      prefix);
522 			ret = snd_ctl_add(card, path->kcontrol);
523 			if (ret < 0) {
524 				dev_err(dapm->dev,
525 					"asoc: failed to add dapm kcontrol %s: %d\n",
526 					path->long_name, ret);
527 				kfree(wlist);
528 				kfree(path->long_name);
529 				path->long_name = NULL;
530 				return ret;
531 			}
532 			w->kcontrols[i] = path->kcontrol;
533 		}
534 	}
535 	return ret;
536 }
537 
538 /* create new dapm mux control */
539 static int dapm_new_mux(struct snd_soc_dapm_widget *w)
540 {
541 	struct snd_soc_dapm_context *dapm = w->dapm;
542 	struct snd_soc_dapm_path *path = NULL;
543 	struct snd_kcontrol *kcontrol;
544 	struct snd_card *card = dapm->card->snd_card;
545 	const char *prefix;
546 	size_t prefix_len;
547 	int ret;
548 	struct snd_soc_dapm_widget_list *wlist;
549 	int shared, wlistentries;
550 	size_t wlistsize;
551 	char *name;
552 
553 	if (w->num_kcontrols != 1) {
554 		dev_err(dapm->dev,
555 			"asoc: mux %s has incorrect number of controls\n",
556 			w->name);
557 		return -EINVAL;
558 	}
559 
560 	shared = dapm_is_shared_kcontrol(dapm, w, &w->kcontrol_news[0],
561 					 &kcontrol);
562 	if (kcontrol) {
563 		wlist = kcontrol->private_data;
564 		wlistentries = wlist->num_widgets + 1;
565 	} else {
566 		wlist = NULL;
567 		wlistentries = 1;
568 	}
569 	wlistsize = sizeof(struct snd_soc_dapm_widget_list) +
570 		wlistentries * sizeof(struct snd_soc_dapm_widget *),
571 	wlist = krealloc(wlist, wlistsize, GFP_KERNEL);
572 	if (wlist == NULL) {
573 		dev_err(dapm->dev,
574 			"asoc: can't allocate widget list for %s\n", w->name);
575 		return -ENOMEM;
576 	}
577 	wlist->num_widgets = wlistentries;
578 	wlist->widgets[wlistentries - 1] = w;
579 
580 	if (!kcontrol) {
581 		if (dapm->codec)
582 			prefix = dapm->codec->name_prefix;
583 		else
584 			prefix = NULL;
585 
586 		if (shared) {
587 			name = w->kcontrol_news[0].name;
588 			prefix_len = 0;
589 		} else {
590 			name = w->name;
591 			if (prefix)
592 				prefix_len = strlen(prefix) + 1;
593 			else
594 				prefix_len = 0;
595 		}
596 
597 		/*
598 		 * The control will get a prefix from the control creation
599 		 * process but we're also using the same prefix for widgets so
600 		 * cut the prefix off the front of the widget name.
601 		 */
602 		kcontrol = snd_soc_cnew(&w->kcontrol_news[0], wlist,
603 					name + prefix_len, prefix);
604 		ret = snd_ctl_add(card, kcontrol);
605 		if (ret < 0) {
606 			dev_err(dapm->dev, "failed to add kcontrol %s: %d\n",
607 				w->name, ret);
608 			kfree(wlist);
609 			return ret;
610 		}
611 	}
612 
613 	kcontrol->private_data = wlist;
614 
615 	w->kcontrols[0] = kcontrol;
616 
617 	list_for_each_entry(path, &w->sources, list_sink)
618 		path->kcontrol = kcontrol;
619 
620 	return 0;
621 }
622 
623 /* create new dapm volume control */
624 static int dapm_new_pga(struct snd_soc_dapm_widget *w)
625 {
626 	if (w->num_kcontrols)
627 		dev_err(w->dapm->dev,
628 			"asoc: PGA controls not supported: '%s'\n", w->name);
629 
630 	return 0;
631 }
632 
633 /* reset 'walked' bit for each dapm path */
634 static inline void dapm_clear_walk(struct snd_soc_dapm_context *dapm)
635 {
636 	struct snd_soc_dapm_path *p;
637 
638 	list_for_each_entry(p, &dapm->card->paths, list)
639 		p->walked = 0;
640 }
641 
642 /* We implement power down on suspend by checking the power state of
643  * the ALSA card - when we are suspending the ALSA state for the card
644  * is set to D3.
645  */
646 static int snd_soc_dapm_suspend_check(struct snd_soc_dapm_widget *widget)
647 {
648 	int level = snd_power_get_state(widget->dapm->card->snd_card);
649 
650 	switch (level) {
651 	case SNDRV_CTL_POWER_D3hot:
652 	case SNDRV_CTL_POWER_D3cold:
653 		if (widget->ignore_suspend)
654 			dev_dbg(widget->dapm->dev, "%s ignoring suspend\n",
655 				widget->name);
656 		return widget->ignore_suspend;
657 	default:
658 		return 1;
659 	}
660 }
661 
662 /*
663  * Recursively check for a completed path to an active or physically connected
664  * output widget. Returns number of complete paths.
665  */
666 static int is_connected_output_ep(struct snd_soc_dapm_widget *widget)
667 {
668 	struct snd_soc_dapm_path *path;
669 	int con = 0;
670 
671 	if (widget->outputs >= 0)
672 		return widget->outputs;
673 
674 	DAPM_UPDATE_STAT(widget, path_checks);
675 
676 	if (widget->id == snd_soc_dapm_supply)
677 		return 0;
678 
679 	switch (widget->id) {
680 	case snd_soc_dapm_adc:
681 	case snd_soc_dapm_aif_out:
682 		if (widget->active) {
683 			widget->outputs = snd_soc_dapm_suspend_check(widget);
684 			return widget->outputs;
685 		}
686 	default:
687 		break;
688 	}
689 
690 	if (widget->connected) {
691 		/* connected pin ? */
692 		if (widget->id == snd_soc_dapm_output && !widget->ext) {
693 			widget->outputs = snd_soc_dapm_suspend_check(widget);
694 			return widget->outputs;
695 		}
696 
697 		/* connected jack or spk ? */
698 		if (widget->id == snd_soc_dapm_hp ||
699 		    widget->id == snd_soc_dapm_spk ||
700 		    (widget->id == snd_soc_dapm_line &&
701 		     !list_empty(&widget->sources))) {
702 			widget->outputs = snd_soc_dapm_suspend_check(widget);
703 			return widget->outputs;
704 		}
705 	}
706 
707 	list_for_each_entry(path, &widget->sinks, list_source) {
708 		DAPM_UPDATE_STAT(widget, neighbour_checks);
709 
710 		if (path->weak)
711 			continue;
712 
713 		if (path->walked)
714 			continue;
715 
716 		if (path->sink && path->connect) {
717 			path->walked = 1;
718 			con += is_connected_output_ep(path->sink);
719 		}
720 	}
721 
722 	widget->outputs = con;
723 
724 	return con;
725 }
726 
727 /*
728  * Recursively check for a completed path to an active or physically connected
729  * input widget. Returns number of complete paths.
730  */
731 static int is_connected_input_ep(struct snd_soc_dapm_widget *widget)
732 {
733 	struct snd_soc_dapm_path *path;
734 	int con = 0;
735 
736 	if (widget->inputs >= 0)
737 		return widget->inputs;
738 
739 	DAPM_UPDATE_STAT(widget, path_checks);
740 
741 	if (widget->id == snd_soc_dapm_supply)
742 		return 0;
743 
744 	/* active stream ? */
745 	switch (widget->id) {
746 	case snd_soc_dapm_dac:
747 	case snd_soc_dapm_aif_in:
748 		if (widget->active) {
749 			widget->inputs = snd_soc_dapm_suspend_check(widget);
750 			return widget->inputs;
751 		}
752 	default:
753 		break;
754 	}
755 
756 	if (widget->connected) {
757 		/* connected pin ? */
758 		if (widget->id == snd_soc_dapm_input && !widget->ext) {
759 			widget->inputs = snd_soc_dapm_suspend_check(widget);
760 			return widget->inputs;
761 		}
762 
763 		/* connected VMID/Bias for lower pops */
764 		if (widget->id == snd_soc_dapm_vmid) {
765 			widget->inputs = snd_soc_dapm_suspend_check(widget);
766 			return widget->inputs;
767 		}
768 
769 		/* connected jack ? */
770 		if (widget->id == snd_soc_dapm_mic ||
771 		    (widget->id == snd_soc_dapm_line &&
772 		     !list_empty(&widget->sinks))) {
773 			widget->inputs = snd_soc_dapm_suspend_check(widget);
774 			return widget->inputs;
775 		}
776 
777 		/* signal generator */
778 		if (widget->id == snd_soc_dapm_siggen) {
779 			widget->inputs = snd_soc_dapm_suspend_check(widget);
780 			return widget->inputs;
781 		}
782 	}
783 
784 	list_for_each_entry(path, &widget->sources, list_sink) {
785 		DAPM_UPDATE_STAT(widget, neighbour_checks);
786 
787 		if (path->weak)
788 			continue;
789 
790 		if (path->walked)
791 			continue;
792 
793 		if (path->source && path->connect) {
794 			path->walked = 1;
795 			con += is_connected_input_ep(path->source);
796 		}
797 	}
798 
799 	widget->inputs = con;
800 
801 	return con;
802 }
803 
804 /*
805  * Handler for generic register modifier widget.
806  */
807 int dapm_reg_event(struct snd_soc_dapm_widget *w,
808 		   struct snd_kcontrol *kcontrol, int event)
809 {
810 	unsigned int val;
811 
812 	if (SND_SOC_DAPM_EVENT_ON(event))
813 		val = w->on_val;
814 	else
815 		val = w->off_val;
816 
817 	soc_widget_update_bits(w, -(w->reg + 1),
818 			    w->mask << w->shift, val << w->shift);
819 
820 	return 0;
821 }
822 EXPORT_SYMBOL_GPL(dapm_reg_event);
823 
824 static int dapm_widget_power_check(struct snd_soc_dapm_widget *w)
825 {
826 	if (w->power_checked)
827 		return w->new_power;
828 
829 	if (w->force)
830 		w->new_power = 1;
831 	else
832 		w->new_power = w->power_check(w);
833 
834 	w->power_checked = true;
835 
836 	return w->new_power;
837 }
838 
839 /* Generic check to see if a widget should be powered.
840  */
841 static int dapm_generic_check_power(struct snd_soc_dapm_widget *w)
842 {
843 	int in, out;
844 
845 	DAPM_UPDATE_STAT(w, power_checks);
846 
847 	in = is_connected_input_ep(w);
848 	dapm_clear_walk(w->dapm);
849 	out = is_connected_output_ep(w);
850 	dapm_clear_walk(w->dapm);
851 	return out != 0 && in != 0;
852 }
853 
854 /* Check to see if an ADC has power */
855 static int dapm_adc_check_power(struct snd_soc_dapm_widget *w)
856 {
857 	int in;
858 
859 	DAPM_UPDATE_STAT(w, power_checks);
860 
861 	if (w->active) {
862 		in = is_connected_input_ep(w);
863 		dapm_clear_walk(w->dapm);
864 		return in != 0;
865 	} else {
866 		return dapm_generic_check_power(w);
867 	}
868 }
869 
870 /* Check to see if a DAC has power */
871 static int dapm_dac_check_power(struct snd_soc_dapm_widget *w)
872 {
873 	int out;
874 
875 	DAPM_UPDATE_STAT(w, power_checks);
876 
877 	if (w->active) {
878 		out = is_connected_output_ep(w);
879 		dapm_clear_walk(w->dapm);
880 		return out != 0;
881 	} else {
882 		return dapm_generic_check_power(w);
883 	}
884 }
885 
886 /* Check to see if a power supply is needed */
887 static int dapm_supply_check_power(struct snd_soc_dapm_widget *w)
888 {
889 	struct snd_soc_dapm_path *path;
890 
891 	DAPM_UPDATE_STAT(w, power_checks);
892 
893 	/* Check if one of our outputs is connected */
894 	list_for_each_entry(path, &w->sinks, list_source) {
895 		DAPM_UPDATE_STAT(w, neighbour_checks);
896 
897 		if (path->weak)
898 			continue;
899 
900 		if (path->connected &&
901 		    !path->connected(path->source, path->sink))
902 			continue;
903 
904 		if (!path->sink)
905 			continue;
906 
907 		if (dapm_widget_power_check(path->sink))
908 			return 1;
909 	}
910 
911 	dapm_clear_walk(w->dapm);
912 
913 	return 0;
914 }
915 
916 static int dapm_always_on_check_power(struct snd_soc_dapm_widget *w)
917 {
918 	return 1;
919 }
920 
921 static int dapm_seq_compare(struct snd_soc_dapm_widget *a,
922 			    struct snd_soc_dapm_widget *b,
923 			    bool power_up)
924 {
925 	int *sort;
926 
927 	if (power_up)
928 		sort = dapm_up_seq;
929 	else
930 		sort = dapm_down_seq;
931 
932 	if (sort[a->id] != sort[b->id])
933 		return sort[a->id] - sort[b->id];
934 	if (a->subseq != b->subseq) {
935 		if (power_up)
936 			return a->subseq - b->subseq;
937 		else
938 			return b->subseq - a->subseq;
939 	}
940 	if (a->reg != b->reg)
941 		return a->reg - b->reg;
942 	if (a->dapm != b->dapm)
943 		return (unsigned long)a->dapm - (unsigned long)b->dapm;
944 
945 	return 0;
946 }
947 
948 /* Insert a widget in order into a DAPM power sequence. */
949 static void dapm_seq_insert(struct snd_soc_dapm_widget *new_widget,
950 			    struct list_head *list,
951 			    bool power_up)
952 {
953 	struct snd_soc_dapm_widget *w;
954 
955 	list_for_each_entry(w, list, power_list)
956 		if (dapm_seq_compare(new_widget, w, power_up) < 0) {
957 			list_add_tail(&new_widget->power_list, &w->power_list);
958 			return;
959 		}
960 
961 	list_add_tail(&new_widget->power_list, list);
962 }
963 
964 static void dapm_seq_check_event(struct snd_soc_dapm_context *dapm,
965 				 struct snd_soc_dapm_widget *w, int event)
966 {
967 	struct snd_soc_card *card = dapm->card;
968 	const char *ev_name;
969 	int power, ret;
970 
971 	switch (event) {
972 	case SND_SOC_DAPM_PRE_PMU:
973 		ev_name = "PRE_PMU";
974 		power = 1;
975 		break;
976 	case SND_SOC_DAPM_POST_PMU:
977 		ev_name = "POST_PMU";
978 		power = 1;
979 		break;
980 	case SND_SOC_DAPM_PRE_PMD:
981 		ev_name = "PRE_PMD";
982 		power = 0;
983 		break;
984 	case SND_SOC_DAPM_POST_PMD:
985 		ev_name = "POST_PMD";
986 		power = 0;
987 		break;
988 	default:
989 		BUG();
990 		return;
991 	}
992 
993 	if (w->power != power)
994 		return;
995 
996 	if (w->event && (w->event_flags & event)) {
997 		pop_dbg(dapm->dev, card->pop_time, "pop test : %s %s\n",
998 			w->name, ev_name);
999 		trace_snd_soc_dapm_widget_event_start(w, event);
1000 		ret = w->event(w, NULL, event);
1001 		trace_snd_soc_dapm_widget_event_done(w, event);
1002 		if (ret < 0)
1003 			pr_err("%s: %s event failed: %d\n",
1004 			       ev_name, w->name, ret);
1005 	}
1006 }
1007 
1008 /* Apply the coalesced changes from a DAPM sequence */
1009 static void dapm_seq_run_coalesced(struct snd_soc_dapm_context *dapm,
1010 				   struct list_head *pending)
1011 {
1012 	struct snd_soc_card *card = dapm->card;
1013 	struct snd_soc_dapm_widget *w;
1014 	int reg, power;
1015 	unsigned int value = 0;
1016 	unsigned int mask = 0;
1017 	unsigned int cur_mask;
1018 
1019 	reg = list_first_entry(pending, struct snd_soc_dapm_widget,
1020 			       power_list)->reg;
1021 
1022 	list_for_each_entry(w, pending, power_list) {
1023 		cur_mask = 1 << w->shift;
1024 		BUG_ON(reg != w->reg);
1025 
1026 		if (w->invert)
1027 			power = !w->power;
1028 		else
1029 			power = w->power;
1030 
1031 		mask |= cur_mask;
1032 		if (power)
1033 			value |= cur_mask;
1034 
1035 		pop_dbg(dapm->dev, card->pop_time,
1036 			"pop test : Queue %s: reg=0x%x, 0x%x/0x%x\n",
1037 			w->name, reg, value, mask);
1038 
1039 		/* Check for events */
1040 		dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMU);
1041 		dapm_seq_check_event(dapm, w, SND_SOC_DAPM_PRE_PMD);
1042 	}
1043 
1044 	if (reg >= 0) {
1045 		/* Any widget will do, they should all be updating the
1046 		 * same register.
1047 		 */
1048 		w = list_first_entry(pending, struct snd_soc_dapm_widget,
1049 				     power_list);
1050 
1051 		pop_dbg(dapm->dev, card->pop_time,
1052 			"pop test : Applying 0x%x/0x%x to %x in %dms\n",
1053 			value, mask, reg, card->pop_time);
1054 		pop_wait(card->pop_time);
1055 		soc_widget_update_bits(w, reg, mask, value);
1056 	}
1057 
1058 	list_for_each_entry(w, pending, power_list) {
1059 		dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMU);
1060 		dapm_seq_check_event(dapm, w, SND_SOC_DAPM_POST_PMD);
1061 	}
1062 }
1063 
1064 /* Apply a DAPM power sequence.
1065  *
1066  * We walk over a pre-sorted list of widgets to apply power to.  In
1067  * order to minimise the number of writes to the device required
1068  * multiple widgets will be updated in a single write where possible.
1069  * Currently anything that requires more than a single write is not
1070  * handled.
1071  */
1072 static void dapm_seq_run(struct snd_soc_dapm_context *dapm,
1073 			 struct list_head *list, int event, bool power_up)
1074 {
1075 	struct snd_soc_dapm_widget *w, *n;
1076 	LIST_HEAD(pending);
1077 	int cur_sort = -1;
1078 	int cur_subseq = -1;
1079 	int cur_reg = SND_SOC_NOPM;
1080 	struct snd_soc_dapm_context *cur_dapm = NULL;
1081 	int ret, i;
1082 	int *sort;
1083 
1084 	if (power_up)
1085 		sort = dapm_up_seq;
1086 	else
1087 		sort = dapm_down_seq;
1088 
1089 	list_for_each_entry_safe(w, n, list, power_list) {
1090 		ret = 0;
1091 
1092 		/* Do we need to apply any queued changes? */
1093 		if (sort[w->id] != cur_sort || w->reg != cur_reg ||
1094 		    w->dapm != cur_dapm || w->subseq != cur_subseq) {
1095 			if (!list_empty(&pending))
1096 				dapm_seq_run_coalesced(cur_dapm, &pending);
1097 
1098 			if (cur_dapm && cur_dapm->seq_notifier) {
1099 				for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++)
1100 					if (sort[i] == cur_sort)
1101 						cur_dapm->seq_notifier(cur_dapm,
1102 								       i,
1103 								       cur_subseq);
1104 			}
1105 
1106 			INIT_LIST_HEAD(&pending);
1107 			cur_sort = -1;
1108 			cur_subseq = INT_MIN;
1109 			cur_reg = SND_SOC_NOPM;
1110 			cur_dapm = NULL;
1111 		}
1112 
1113 		switch (w->id) {
1114 		case snd_soc_dapm_pre:
1115 			if (!w->event)
1116 				list_for_each_entry_safe_continue(w, n, list,
1117 								  power_list);
1118 
1119 			if (event == SND_SOC_DAPM_STREAM_START)
1120 				ret = w->event(w,
1121 					       NULL, SND_SOC_DAPM_PRE_PMU);
1122 			else if (event == SND_SOC_DAPM_STREAM_STOP)
1123 				ret = w->event(w,
1124 					       NULL, SND_SOC_DAPM_PRE_PMD);
1125 			break;
1126 
1127 		case snd_soc_dapm_post:
1128 			if (!w->event)
1129 				list_for_each_entry_safe_continue(w, n, list,
1130 								  power_list);
1131 
1132 			if (event == SND_SOC_DAPM_STREAM_START)
1133 				ret = w->event(w,
1134 					       NULL, SND_SOC_DAPM_POST_PMU);
1135 			else if (event == SND_SOC_DAPM_STREAM_STOP)
1136 				ret = w->event(w,
1137 					       NULL, SND_SOC_DAPM_POST_PMD);
1138 			break;
1139 
1140 		default:
1141 			/* Queue it up for application */
1142 			cur_sort = sort[w->id];
1143 			cur_subseq = w->subseq;
1144 			cur_reg = w->reg;
1145 			cur_dapm = w->dapm;
1146 			list_move(&w->power_list, &pending);
1147 			break;
1148 		}
1149 
1150 		if (ret < 0)
1151 			dev_err(w->dapm->dev,
1152 				"Failed to apply widget power: %d\n", ret);
1153 	}
1154 
1155 	if (!list_empty(&pending))
1156 		dapm_seq_run_coalesced(cur_dapm, &pending);
1157 
1158 	if (cur_dapm && cur_dapm->seq_notifier) {
1159 		for (i = 0; i < ARRAY_SIZE(dapm_up_seq); i++)
1160 			if (sort[i] == cur_sort)
1161 				cur_dapm->seq_notifier(cur_dapm,
1162 						       i, cur_subseq);
1163 	}
1164 }
1165 
1166 static void dapm_widget_update(struct snd_soc_dapm_context *dapm)
1167 {
1168 	struct snd_soc_dapm_update *update = dapm->update;
1169 	struct snd_soc_dapm_widget *w;
1170 	int ret;
1171 
1172 	if (!update)
1173 		return;
1174 
1175 	w = update->widget;
1176 
1177 	if (w->event &&
1178 	    (w->event_flags & SND_SOC_DAPM_PRE_REG)) {
1179 		ret = w->event(w, update->kcontrol, SND_SOC_DAPM_PRE_REG);
1180 		if (ret != 0)
1181 			pr_err("%s DAPM pre-event failed: %d\n",
1182 			       w->name, ret);
1183 	}
1184 
1185 	ret = snd_soc_update_bits(w->codec, update->reg, update->mask,
1186 				  update->val);
1187 	if (ret < 0)
1188 		pr_err("%s DAPM update failed: %d\n", w->name, ret);
1189 
1190 	if (w->event &&
1191 	    (w->event_flags & SND_SOC_DAPM_POST_REG)) {
1192 		ret = w->event(w, update->kcontrol, SND_SOC_DAPM_POST_REG);
1193 		if (ret != 0)
1194 			pr_err("%s DAPM post-event failed: %d\n",
1195 			       w->name, ret);
1196 	}
1197 }
1198 
1199 /* Async callback run prior to DAPM sequences - brings to _PREPARE if
1200  * they're changing state.
1201  */
1202 static void dapm_pre_sequence_async(void *data, async_cookie_t cookie)
1203 {
1204 	struct snd_soc_dapm_context *d = data;
1205 	int ret;
1206 
1207 	/* If we're off and we're not supposed to be go into STANDBY */
1208 	if (d->bias_level == SND_SOC_BIAS_OFF &&
1209 	    d->target_bias_level != SND_SOC_BIAS_OFF) {
1210 		if (d->dev)
1211 			pm_runtime_get_sync(d->dev);
1212 
1213 		ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_STANDBY);
1214 		if (ret != 0)
1215 			dev_err(d->dev,
1216 				"Failed to turn on bias: %d\n", ret);
1217 	}
1218 
1219 	/* Prepare for a STADDBY->ON or ON->STANDBY transition */
1220 	if (d->bias_level != d->target_bias_level) {
1221 		ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_PREPARE);
1222 		if (ret != 0)
1223 			dev_err(d->dev,
1224 				"Failed to prepare bias: %d\n", ret);
1225 	}
1226 }
1227 
1228 /* Async callback run prior to DAPM sequences - brings to their final
1229  * state.
1230  */
1231 static void dapm_post_sequence_async(void *data, async_cookie_t cookie)
1232 {
1233 	struct snd_soc_dapm_context *d = data;
1234 	int ret;
1235 
1236 	/* If we just powered the last thing off drop to standby bias */
1237 	if (d->bias_level == SND_SOC_BIAS_PREPARE &&
1238 	    (d->target_bias_level == SND_SOC_BIAS_STANDBY ||
1239 	     d->target_bias_level == SND_SOC_BIAS_OFF)) {
1240 		ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_STANDBY);
1241 		if (ret != 0)
1242 			dev_err(d->dev, "Failed to apply standby bias: %d\n",
1243 				ret);
1244 	}
1245 
1246 	/* If we're in standby and can support bias off then do that */
1247 	if (d->bias_level == SND_SOC_BIAS_STANDBY &&
1248 	    d->target_bias_level == SND_SOC_BIAS_OFF) {
1249 		ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_OFF);
1250 		if (ret != 0)
1251 			dev_err(d->dev, "Failed to turn off bias: %d\n", ret);
1252 
1253 		if (d->dev)
1254 			pm_runtime_put_sync(d->dev);
1255 	}
1256 
1257 	/* If we just powered up then move to active bias */
1258 	if (d->bias_level == SND_SOC_BIAS_PREPARE &&
1259 	    d->target_bias_level == SND_SOC_BIAS_ON) {
1260 		ret = snd_soc_dapm_set_bias_level(d, SND_SOC_BIAS_ON);
1261 		if (ret != 0)
1262 			dev_err(d->dev, "Failed to apply active bias: %d\n",
1263 				ret);
1264 	}
1265 }
1266 
1267 static void dapm_widget_set_peer_power(struct snd_soc_dapm_widget *peer,
1268 				       bool power, bool connect)
1269 {
1270 	/* If a connection is being made or broken then that update
1271 	 * will have marked the peer dirty, otherwise the widgets are
1272 	 * not connected and this update has no impact. */
1273 	if (!connect)
1274 		return;
1275 
1276 	/* If the peer is already in the state we're moving to then we
1277 	 * won't have an impact on it. */
1278 	if (power != peer->power)
1279 		dapm_mark_dirty(peer, "peer state change");
1280 }
1281 
1282 static void dapm_widget_set_power(struct snd_soc_dapm_widget *w, bool power,
1283 				  struct list_head *up_list,
1284 				  struct list_head *down_list)
1285 {
1286 	struct snd_soc_dapm_path *path;
1287 
1288 	if (w->power == power)
1289 		return;
1290 
1291 	trace_snd_soc_dapm_widget_power(w, power);
1292 
1293 	/* If we changed our power state perhaps our neigbours changed
1294 	 * also.
1295 	 */
1296 	list_for_each_entry(path, &w->sources, list_sink) {
1297 		if (path->source) {
1298 			dapm_widget_set_peer_power(path->source, power,
1299 						   path->connect);
1300 		}
1301 	}
1302 	switch (w->id) {
1303 	case snd_soc_dapm_supply:
1304 		/* Supplies can't affect their outputs, only their inputs */
1305 		break;
1306 	default:
1307 		list_for_each_entry(path, &w->sinks, list_source) {
1308 			if (path->sink) {
1309 				dapm_widget_set_peer_power(path->sink, power,
1310 							   path->connect);
1311 			}
1312 		}
1313 		break;
1314 	}
1315 
1316 	if (power)
1317 		dapm_seq_insert(w, up_list, true);
1318 	else
1319 		dapm_seq_insert(w, down_list, false);
1320 
1321 	w->power = power;
1322 }
1323 
1324 static void dapm_power_one_widget(struct snd_soc_dapm_widget *w,
1325 				  struct list_head *up_list,
1326 				  struct list_head *down_list)
1327 {
1328 	int power;
1329 
1330 	switch (w->id) {
1331 	case snd_soc_dapm_pre:
1332 		dapm_seq_insert(w, down_list, false);
1333 		break;
1334 	case snd_soc_dapm_post:
1335 		dapm_seq_insert(w, up_list, true);
1336 		break;
1337 
1338 	default:
1339 		power = dapm_widget_power_check(w);
1340 
1341 		dapm_widget_set_power(w, power, up_list, down_list);
1342 		break;
1343 	}
1344 }
1345 
1346 /*
1347  * Scan each dapm widget for complete audio path.
1348  * A complete path is a route that has valid endpoints i.e.:-
1349  *
1350  *  o DAC to output pin.
1351  *  o Input Pin to ADC.
1352  *  o Input pin to Output pin (bypass, sidetone)
1353  *  o DAC to ADC (loopback).
1354  */
1355 static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event)
1356 {
1357 	struct snd_soc_card *card = dapm->card;
1358 	struct snd_soc_dapm_widget *w;
1359 	struct snd_soc_dapm_context *d;
1360 	LIST_HEAD(up_list);
1361 	LIST_HEAD(down_list);
1362 	LIST_HEAD(async_domain);
1363 	enum snd_soc_bias_level bias;
1364 
1365 	trace_snd_soc_dapm_start(card);
1366 
1367 	list_for_each_entry(d, &card->dapm_list, list) {
1368 		if (d->n_widgets || d->codec == NULL) {
1369 			if (d->idle_bias_off)
1370 				d->target_bias_level = SND_SOC_BIAS_OFF;
1371 			else
1372 				d->target_bias_level = SND_SOC_BIAS_STANDBY;
1373 		}
1374 	}
1375 
1376 	memset(&card->dapm_stats, 0, sizeof(card->dapm_stats));
1377 
1378 	list_for_each_entry(w, &card->widgets, list) {
1379 		w->power_checked = false;
1380 		w->inputs = -1;
1381 		w->outputs = -1;
1382 	}
1383 
1384 	/* Check which widgets we need to power and store them in
1385 	 * lists indicating if they should be powered up or down.  We
1386 	 * only check widgets that have been flagged as dirty but note
1387 	 * that new widgets may be added to the dirty list while we
1388 	 * iterate.
1389 	 */
1390 	list_for_each_entry(w, &card->dapm_dirty, dirty) {
1391 		dapm_power_one_widget(w, &up_list, &down_list);
1392 	}
1393 
1394 	list_for_each_entry(w, &card->widgets, list) {
1395 		list_del_init(&w->dirty);
1396 
1397 		if (w->power) {
1398 			d = w->dapm;
1399 
1400 			/* Supplies and micbiases only bring the
1401 			 * context up to STANDBY as unless something
1402 			 * else is active and passing audio they
1403 			 * generally don't require full power.
1404 			 */
1405 			switch (w->id) {
1406 			case snd_soc_dapm_supply:
1407 			case snd_soc_dapm_micbias:
1408 				if (d->target_bias_level < SND_SOC_BIAS_STANDBY)
1409 					d->target_bias_level = SND_SOC_BIAS_STANDBY;
1410 				break;
1411 			default:
1412 				d->target_bias_level = SND_SOC_BIAS_ON;
1413 				break;
1414 			}
1415 		}
1416 
1417 	}
1418 
1419 	/* If there are no DAPM widgets then try to figure out power from the
1420 	 * event type.
1421 	 */
1422 	if (!dapm->n_widgets) {
1423 		switch (event) {
1424 		case SND_SOC_DAPM_STREAM_START:
1425 		case SND_SOC_DAPM_STREAM_RESUME:
1426 			dapm->target_bias_level = SND_SOC_BIAS_ON;
1427 			break;
1428 		case SND_SOC_DAPM_STREAM_STOP:
1429 			if (dapm->codec && dapm->codec->active)
1430 				dapm->target_bias_level = SND_SOC_BIAS_ON;
1431 			else
1432 				dapm->target_bias_level = SND_SOC_BIAS_STANDBY;
1433 			break;
1434 		case SND_SOC_DAPM_STREAM_SUSPEND:
1435 			dapm->target_bias_level = SND_SOC_BIAS_STANDBY;
1436 			break;
1437 		case SND_SOC_DAPM_STREAM_NOP:
1438 			dapm->target_bias_level = dapm->bias_level;
1439 			break;
1440 		default:
1441 			break;
1442 		}
1443 	}
1444 
1445 	/* Force all contexts in the card to the same bias state if
1446 	 * they're not ground referenced.
1447 	 */
1448 	bias = SND_SOC_BIAS_OFF;
1449 	list_for_each_entry(d, &card->dapm_list, list)
1450 		if (d->target_bias_level > bias)
1451 			bias = d->target_bias_level;
1452 	list_for_each_entry(d, &card->dapm_list, list)
1453 		if (!d->idle_bias_off)
1454 			d->target_bias_level = bias;
1455 
1456 	trace_snd_soc_dapm_walk_done(card);
1457 
1458 	/* Run all the bias changes in parallel */
1459 	list_for_each_entry(d, &dapm->card->dapm_list, list)
1460 		async_schedule_domain(dapm_pre_sequence_async, d,
1461 					&async_domain);
1462 	async_synchronize_full_domain(&async_domain);
1463 
1464 	/* Power down widgets first; try to avoid amplifying pops. */
1465 	dapm_seq_run(dapm, &down_list, event, false);
1466 
1467 	dapm_widget_update(dapm);
1468 
1469 	/* Now power up. */
1470 	dapm_seq_run(dapm, &up_list, event, true);
1471 
1472 	/* Run all the bias changes in parallel */
1473 	list_for_each_entry(d, &dapm->card->dapm_list, list)
1474 		async_schedule_domain(dapm_post_sequence_async, d,
1475 					&async_domain);
1476 	async_synchronize_full_domain(&async_domain);
1477 
1478 	pop_dbg(dapm->dev, card->pop_time,
1479 		"DAPM sequencing finished, waiting %dms\n", card->pop_time);
1480 	pop_wait(card->pop_time);
1481 
1482 	trace_snd_soc_dapm_done(card);
1483 
1484 	return 0;
1485 }
1486 
1487 #ifdef CONFIG_DEBUG_FS
1488 static int dapm_widget_power_open_file(struct inode *inode, struct file *file)
1489 {
1490 	file->private_data = inode->i_private;
1491 	return 0;
1492 }
1493 
1494 static ssize_t dapm_widget_power_read_file(struct file *file,
1495 					   char __user *user_buf,
1496 					   size_t count, loff_t *ppos)
1497 {
1498 	struct snd_soc_dapm_widget *w = file->private_data;
1499 	char *buf;
1500 	int in, out;
1501 	ssize_t ret;
1502 	struct snd_soc_dapm_path *p = NULL;
1503 
1504 	buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
1505 	if (!buf)
1506 		return -ENOMEM;
1507 
1508 	in = is_connected_input_ep(w);
1509 	dapm_clear_walk(w->dapm);
1510 	out = is_connected_output_ep(w);
1511 	dapm_clear_walk(w->dapm);
1512 
1513 	ret = snprintf(buf, PAGE_SIZE, "%s: %s  in %d out %d",
1514 		       w->name, w->power ? "On" : "Off", in, out);
1515 
1516 	if (w->reg >= 0)
1517 		ret += snprintf(buf + ret, PAGE_SIZE - ret,
1518 				" - R%d(0x%x) bit %d",
1519 				w->reg, w->reg, w->shift);
1520 
1521 	ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n");
1522 
1523 	if (w->sname)
1524 		ret += snprintf(buf + ret, PAGE_SIZE - ret, " stream %s %s\n",
1525 				w->sname,
1526 				w->active ? "active" : "inactive");
1527 
1528 	list_for_each_entry(p, &w->sources, list_sink) {
1529 		if (p->connected && !p->connected(w, p->sink))
1530 			continue;
1531 
1532 		if (p->connect)
1533 			ret += snprintf(buf + ret, PAGE_SIZE - ret,
1534 					" in  \"%s\" \"%s\"\n",
1535 					p->name ? p->name : "static",
1536 					p->source->name);
1537 	}
1538 	list_for_each_entry(p, &w->sinks, list_source) {
1539 		if (p->connected && !p->connected(w, p->sink))
1540 			continue;
1541 
1542 		if (p->connect)
1543 			ret += snprintf(buf + ret, PAGE_SIZE - ret,
1544 					" out \"%s\" \"%s\"\n",
1545 					p->name ? p->name : "static",
1546 					p->sink->name);
1547 	}
1548 
1549 	ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
1550 
1551 	kfree(buf);
1552 	return ret;
1553 }
1554 
1555 static const struct file_operations dapm_widget_power_fops = {
1556 	.open = dapm_widget_power_open_file,
1557 	.read = dapm_widget_power_read_file,
1558 	.llseek = default_llseek,
1559 };
1560 
1561 static int dapm_bias_open_file(struct inode *inode, struct file *file)
1562 {
1563 	file->private_data = inode->i_private;
1564 	return 0;
1565 }
1566 
1567 static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf,
1568 				   size_t count, loff_t *ppos)
1569 {
1570 	struct snd_soc_dapm_context *dapm = file->private_data;
1571 	char *level;
1572 
1573 	switch (dapm->bias_level) {
1574 	case SND_SOC_BIAS_ON:
1575 		level = "On\n";
1576 		break;
1577 	case SND_SOC_BIAS_PREPARE:
1578 		level = "Prepare\n";
1579 		break;
1580 	case SND_SOC_BIAS_STANDBY:
1581 		level = "Standby\n";
1582 		break;
1583 	case SND_SOC_BIAS_OFF:
1584 		level = "Off\n";
1585 		break;
1586 	default:
1587 		BUG();
1588 		level = "Unknown\n";
1589 		break;
1590 	}
1591 
1592 	return simple_read_from_buffer(user_buf, count, ppos, level,
1593 				       strlen(level));
1594 }
1595 
1596 static const struct file_operations dapm_bias_fops = {
1597 	.open = dapm_bias_open_file,
1598 	.read = dapm_bias_read_file,
1599 	.llseek = default_llseek,
1600 };
1601 
1602 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
1603 	struct dentry *parent)
1604 {
1605 	struct dentry *d;
1606 
1607 	dapm->debugfs_dapm = debugfs_create_dir("dapm", parent);
1608 
1609 	if (!dapm->debugfs_dapm) {
1610 		printk(KERN_WARNING
1611 		       "Failed to create DAPM debugfs directory\n");
1612 		return;
1613 	}
1614 
1615 	d = debugfs_create_file("bias_level", 0444,
1616 				dapm->debugfs_dapm, dapm,
1617 				&dapm_bias_fops);
1618 	if (!d)
1619 		dev_warn(dapm->dev,
1620 			 "ASoC: Failed to create bias level debugfs file\n");
1621 }
1622 
1623 static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w)
1624 {
1625 	struct snd_soc_dapm_context *dapm = w->dapm;
1626 	struct dentry *d;
1627 
1628 	if (!dapm->debugfs_dapm || !w->name)
1629 		return;
1630 
1631 	d = debugfs_create_file(w->name, 0444,
1632 				dapm->debugfs_dapm, w,
1633 				&dapm_widget_power_fops);
1634 	if (!d)
1635 		dev_warn(w->dapm->dev,
1636 			"ASoC: Failed to create %s debugfs file\n",
1637 			w->name);
1638 }
1639 
1640 static void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm)
1641 {
1642 	debugfs_remove_recursive(dapm->debugfs_dapm);
1643 }
1644 
1645 #else
1646 void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
1647 	struct dentry *parent)
1648 {
1649 }
1650 
1651 static inline void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w)
1652 {
1653 }
1654 
1655 static inline void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm)
1656 {
1657 }
1658 
1659 #endif
1660 
1661 /* test and update the power status of a mux widget */
1662 static int dapm_mux_update_power(struct snd_soc_dapm_widget *widget,
1663 				 struct snd_kcontrol *kcontrol, int change,
1664 				 int mux, struct soc_enum *e)
1665 {
1666 	struct snd_soc_dapm_path *path;
1667 	int found = 0;
1668 
1669 	if (widget->id != snd_soc_dapm_mux &&
1670 	    widget->id != snd_soc_dapm_virt_mux &&
1671 	    widget->id != snd_soc_dapm_value_mux)
1672 		return -ENODEV;
1673 
1674 	if (!change)
1675 		return 0;
1676 
1677 	/* find dapm widget path assoc with kcontrol */
1678 	list_for_each_entry(path, &widget->dapm->card->paths, list) {
1679 		if (path->kcontrol != kcontrol)
1680 			continue;
1681 
1682 		if (!path->name || !e->texts[mux])
1683 			continue;
1684 
1685 		found = 1;
1686 		/* we now need to match the string in the enum to the path */
1687 		if (!(strcmp(path->name, e->texts[mux]))) {
1688 			path->connect = 1; /* new connection */
1689 			dapm_mark_dirty(path->source, "mux connection");
1690 		} else {
1691 			if (path->connect)
1692 				dapm_mark_dirty(path->source,
1693 						"mux disconnection");
1694 			path->connect = 0; /* old connection must be powered down */
1695 		}
1696 	}
1697 
1698 	if (found) {
1699 		dapm_mark_dirty(widget, "mux change");
1700 		dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP);
1701 	}
1702 
1703 	return 0;
1704 }
1705 
1706 /* test and update the power status of a mixer or switch widget */
1707 static int dapm_mixer_update_power(struct snd_soc_dapm_widget *widget,
1708 				   struct snd_kcontrol *kcontrol, int connect)
1709 {
1710 	struct snd_soc_dapm_path *path;
1711 	int found = 0;
1712 
1713 	if (widget->id != snd_soc_dapm_mixer &&
1714 	    widget->id != snd_soc_dapm_mixer_named_ctl &&
1715 	    widget->id != snd_soc_dapm_switch)
1716 		return -ENODEV;
1717 
1718 	/* find dapm widget path assoc with kcontrol */
1719 	list_for_each_entry(path, &widget->dapm->card->paths, list) {
1720 		if (path->kcontrol != kcontrol)
1721 			continue;
1722 
1723 		/* found, now check type */
1724 		found = 1;
1725 		path->connect = connect;
1726 		dapm_mark_dirty(path->source, "mixer connection");
1727 	}
1728 
1729 	if (found) {
1730 		dapm_mark_dirty(widget, "mixer update");
1731 		dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP);
1732 	}
1733 
1734 	return 0;
1735 }
1736 
1737 /* show dapm widget status in sys fs */
1738 static ssize_t dapm_widget_show(struct device *dev,
1739 	struct device_attribute *attr, char *buf)
1740 {
1741 	struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
1742 	struct snd_soc_codec *codec =rtd->codec;
1743 	struct snd_soc_dapm_widget *w;
1744 	int count = 0;
1745 	char *state = "not set";
1746 
1747 	list_for_each_entry(w, &codec->card->widgets, list) {
1748 		if (w->dapm != &codec->dapm)
1749 			continue;
1750 
1751 		/* only display widgets that burnm power */
1752 		switch (w->id) {
1753 		case snd_soc_dapm_hp:
1754 		case snd_soc_dapm_mic:
1755 		case snd_soc_dapm_spk:
1756 		case snd_soc_dapm_line:
1757 		case snd_soc_dapm_micbias:
1758 		case snd_soc_dapm_dac:
1759 		case snd_soc_dapm_adc:
1760 		case snd_soc_dapm_pga:
1761 		case snd_soc_dapm_out_drv:
1762 		case snd_soc_dapm_mixer:
1763 		case snd_soc_dapm_mixer_named_ctl:
1764 		case snd_soc_dapm_supply:
1765 			if (w->name)
1766 				count += sprintf(buf + count, "%s: %s\n",
1767 					w->name, w->power ? "On":"Off");
1768 		break;
1769 		default:
1770 		break;
1771 		}
1772 	}
1773 
1774 	switch (codec->dapm.bias_level) {
1775 	case SND_SOC_BIAS_ON:
1776 		state = "On";
1777 		break;
1778 	case SND_SOC_BIAS_PREPARE:
1779 		state = "Prepare";
1780 		break;
1781 	case SND_SOC_BIAS_STANDBY:
1782 		state = "Standby";
1783 		break;
1784 	case SND_SOC_BIAS_OFF:
1785 		state = "Off";
1786 		break;
1787 	}
1788 	count += sprintf(buf + count, "PM State: %s\n", state);
1789 
1790 	return count;
1791 }
1792 
1793 static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL);
1794 
1795 int snd_soc_dapm_sys_add(struct device *dev)
1796 {
1797 	return device_create_file(dev, &dev_attr_dapm_widget);
1798 }
1799 
1800 static void snd_soc_dapm_sys_remove(struct device *dev)
1801 {
1802 	device_remove_file(dev, &dev_attr_dapm_widget);
1803 }
1804 
1805 /* free all dapm widgets and resources */
1806 static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
1807 {
1808 	struct snd_soc_dapm_widget *w, *next_w;
1809 	struct snd_soc_dapm_path *p, *next_p;
1810 
1811 	list_for_each_entry_safe(w, next_w, &dapm->card->widgets, list) {
1812 		if (w->dapm != dapm)
1813 			continue;
1814 		list_del(&w->list);
1815 		/*
1816 		 * remove source and sink paths associated to this widget.
1817 		 * While removing the path, remove reference to it from both
1818 		 * source and sink widgets so that path is removed only once.
1819 		 */
1820 		list_for_each_entry_safe(p, next_p, &w->sources, list_sink) {
1821 			list_del(&p->list_sink);
1822 			list_del(&p->list_source);
1823 			list_del(&p->list);
1824 			kfree(p->long_name);
1825 			kfree(p);
1826 		}
1827 		list_for_each_entry_safe(p, next_p, &w->sinks, list_source) {
1828 			list_del(&p->list_sink);
1829 			list_del(&p->list_source);
1830 			list_del(&p->list);
1831 			kfree(p->long_name);
1832 			kfree(p);
1833 		}
1834 		kfree(w->kcontrols);
1835 		kfree(w->name);
1836 		kfree(w);
1837 	}
1838 }
1839 
1840 static struct snd_soc_dapm_widget *dapm_find_widget(
1841 			struct snd_soc_dapm_context *dapm, const char *pin,
1842 			bool search_other_contexts)
1843 {
1844 	struct snd_soc_dapm_widget *w;
1845 	struct snd_soc_dapm_widget *fallback = NULL;
1846 
1847 	list_for_each_entry(w, &dapm->card->widgets, list) {
1848 		if (!strcmp(w->name, pin)) {
1849 			if (w->dapm == dapm)
1850 				return w;
1851 			else
1852 				fallback = w;
1853 		}
1854 	}
1855 
1856 	if (search_other_contexts)
1857 		return fallback;
1858 
1859 	return NULL;
1860 }
1861 
1862 static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
1863 				const char *pin, int status)
1864 {
1865 	struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
1866 
1867 	if (!w) {
1868 		dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
1869 		return -EINVAL;
1870 	}
1871 
1872 	w->connected = status;
1873 	if (status == 0)
1874 		w->force = 0;
1875 	dapm_mark_dirty(w, "pin configuration");
1876 
1877 	return 0;
1878 }
1879 
1880 /**
1881  * snd_soc_dapm_sync - scan and power dapm paths
1882  * @dapm: DAPM context
1883  *
1884  * Walks all dapm audio paths and powers widgets according to their
1885  * stream or path usage.
1886  *
1887  * Returns 0 for success.
1888  */
1889 int snd_soc_dapm_sync(struct snd_soc_dapm_context *dapm)
1890 {
1891 	/*
1892 	 * Suppress early reports (eg, jacks syncing their state) to avoid
1893 	 * silly DAPM runs during card startup.
1894 	 */
1895 	if (!dapm->card || !dapm->card->instantiated)
1896 		return 0;
1897 
1898 	return dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP);
1899 }
1900 EXPORT_SYMBOL_GPL(snd_soc_dapm_sync);
1901 
1902 static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
1903 				  const struct snd_soc_dapm_route *route)
1904 {
1905 	struct snd_soc_dapm_path *path;
1906 	struct snd_soc_dapm_widget *wsource = NULL, *wsink = NULL, *w;
1907 	struct snd_soc_dapm_widget *wtsource = NULL, *wtsink = NULL;
1908 	const char *sink;
1909 	const char *control = route->control;
1910 	const char *source;
1911 	char prefixed_sink[80];
1912 	char prefixed_source[80];
1913 	int ret = 0;
1914 
1915 	if (dapm->codec && dapm->codec->name_prefix) {
1916 		snprintf(prefixed_sink, sizeof(prefixed_sink), "%s %s",
1917 			 dapm->codec->name_prefix, route->sink);
1918 		sink = prefixed_sink;
1919 		snprintf(prefixed_source, sizeof(prefixed_source), "%s %s",
1920 			 dapm->codec->name_prefix, route->source);
1921 		source = prefixed_source;
1922 	} else {
1923 		sink = route->sink;
1924 		source = route->source;
1925 	}
1926 
1927 	/*
1928 	 * find src and dest widgets over all widgets but favor a widget from
1929 	 * current DAPM context
1930 	 */
1931 	list_for_each_entry(w, &dapm->card->widgets, list) {
1932 		if (!wsink && !(strcmp(w->name, sink))) {
1933 			wtsink = w;
1934 			if (w->dapm == dapm)
1935 				wsink = w;
1936 			continue;
1937 		}
1938 		if (!wsource && !(strcmp(w->name, source))) {
1939 			wtsource = w;
1940 			if (w->dapm == dapm)
1941 				wsource = w;
1942 		}
1943 	}
1944 	/* use widget from another DAPM context if not found from this */
1945 	if (!wsink)
1946 		wsink = wtsink;
1947 	if (!wsource)
1948 		wsource = wtsource;
1949 
1950 	if (wsource == NULL || wsink == NULL)
1951 		return -ENODEV;
1952 
1953 	path = kzalloc(sizeof(struct snd_soc_dapm_path), GFP_KERNEL);
1954 	if (!path)
1955 		return -ENOMEM;
1956 
1957 	path->source = wsource;
1958 	path->sink = wsink;
1959 	path->connected = route->connected;
1960 	INIT_LIST_HEAD(&path->list);
1961 	INIT_LIST_HEAD(&path->list_source);
1962 	INIT_LIST_HEAD(&path->list_sink);
1963 
1964 	/* check for external widgets */
1965 	if (wsink->id == snd_soc_dapm_input) {
1966 		if (wsource->id == snd_soc_dapm_micbias ||
1967 			wsource->id == snd_soc_dapm_mic ||
1968 			wsource->id == snd_soc_dapm_line ||
1969 			wsource->id == snd_soc_dapm_output)
1970 			wsink->ext = 1;
1971 	}
1972 	if (wsource->id == snd_soc_dapm_output) {
1973 		if (wsink->id == snd_soc_dapm_spk ||
1974 			wsink->id == snd_soc_dapm_hp ||
1975 			wsink->id == snd_soc_dapm_line ||
1976 			wsink->id == snd_soc_dapm_input)
1977 			wsource->ext = 1;
1978 	}
1979 
1980 	/* connect static paths */
1981 	if (control == NULL) {
1982 		list_add(&path->list, &dapm->card->paths);
1983 		list_add(&path->list_sink, &wsink->sources);
1984 		list_add(&path->list_source, &wsource->sinks);
1985 		path->connect = 1;
1986 		return 0;
1987 	}
1988 
1989 	/* connect dynamic paths */
1990 	switch (wsink->id) {
1991 	case snd_soc_dapm_adc:
1992 	case snd_soc_dapm_dac:
1993 	case snd_soc_dapm_pga:
1994 	case snd_soc_dapm_out_drv:
1995 	case snd_soc_dapm_input:
1996 	case snd_soc_dapm_output:
1997 	case snd_soc_dapm_siggen:
1998 	case snd_soc_dapm_micbias:
1999 	case snd_soc_dapm_vmid:
2000 	case snd_soc_dapm_pre:
2001 	case snd_soc_dapm_post:
2002 	case snd_soc_dapm_supply:
2003 	case snd_soc_dapm_aif_in:
2004 	case snd_soc_dapm_aif_out:
2005 		list_add(&path->list, &dapm->card->paths);
2006 		list_add(&path->list_sink, &wsink->sources);
2007 		list_add(&path->list_source, &wsource->sinks);
2008 		path->connect = 1;
2009 		return 0;
2010 	case snd_soc_dapm_mux:
2011 	case snd_soc_dapm_virt_mux:
2012 	case snd_soc_dapm_value_mux:
2013 		ret = dapm_connect_mux(dapm, wsource, wsink, path, control,
2014 			&wsink->kcontrol_news[0]);
2015 		if (ret != 0)
2016 			goto err;
2017 		break;
2018 	case snd_soc_dapm_switch:
2019 	case snd_soc_dapm_mixer:
2020 	case snd_soc_dapm_mixer_named_ctl:
2021 		ret = dapm_connect_mixer(dapm, wsource, wsink, path, control);
2022 		if (ret != 0)
2023 			goto err;
2024 		break;
2025 	case snd_soc_dapm_hp:
2026 	case snd_soc_dapm_mic:
2027 	case snd_soc_dapm_line:
2028 	case snd_soc_dapm_spk:
2029 		list_add(&path->list, &dapm->card->paths);
2030 		list_add(&path->list_sink, &wsink->sources);
2031 		list_add(&path->list_source, &wsource->sinks);
2032 		path->connect = 0;
2033 		return 0;
2034 	}
2035 	return 0;
2036 
2037 err:
2038 	dev_warn(dapm->dev, "asoc: no dapm match for %s --> %s --> %s\n",
2039 		 source, control, sink);
2040 	kfree(path);
2041 	return ret;
2042 }
2043 
2044 /**
2045  * snd_soc_dapm_add_routes - Add routes between DAPM widgets
2046  * @dapm: DAPM context
2047  * @route: audio routes
2048  * @num: number of routes
2049  *
2050  * Connects 2 dapm widgets together via a named audio path. The sink is
2051  * the widget receiving the audio signal, whilst the source is the sender
2052  * of the audio signal.
2053  *
2054  * Returns 0 for success else error. On error all resources can be freed
2055  * with a call to snd_soc_card_free().
2056  */
2057 int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
2058 			    const struct snd_soc_dapm_route *route, int num)
2059 {
2060 	int i, ret;
2061 
2062 	for (i = 0; i < num; i++) {
2063 		ret = snd_soc_dapm_add_route(dapm, route);
2064 		if (ret < 0) {
2065 			dev_err(dapm->dev, "Failed to add route %s->%s\n",
2066 				route->source, route->sink);
2067 			return ret;
2068 		}
2069 		route++;
2070 	}
2071 
2072 	return 0;
2073 }
2074 EXPORT_SYMBOL_GPL(snd_soc_dapm_add_routes);
2075 
2076 static int snd_soc_dapm_weak_route(struct snd_soc_dapm_context *dapm,
2077 				   const struct snd_soc_dapm_route *route)
2078 {
2079 	struct snd_soc_dapm_widget *source = dapm_find_widget(dapm,
2080 							      route->source,
2081 							      true);
2082 	struct snd_soc_dapm_widget *sink = dapm_find_widget(dapm,
2083 							    route->sink,
2084 							    true);
2085 	struct snd_soc_dapm_path *path;
2086 	int count = 0;
2087 
2088 	if (!source) {
2089 		dev_err(dapm->dev, "Unable to find source %s for weak route\n",
2090 			route->source);
2091 		return -ENODEV;
2092 	}
2093 
2094 	if (!sink) {
2095 		dev_err(dapm->dev, "Unable to find sink %s for weak route\n",
2096 			route->sink);
2097 		return -ENODEV;
2098 	}
2099 
2100 	if (route->control || route->connected)
2101 		dev_warn(dapm->dev, "Ignoring control for weak route %s->%s\n",
2102 			 route->source, route->sink);
2103 
2104 	list_for_each_entry(path, &source->sinks, list_source) {
2105 		if (path->sink == sink) {
2106 			path->weak = 1;
2107 			count++;
2108 		}
2109 	}
2110 
2111 	if (count == 0)
2112 		dev_err(dapm->dev, "No path found for weak route %s->%s\n",
2113 			route->source, route->sink);
2114 	if (count > 1)
2115 		dev_warn(dapm->dev, "%d paths found for weak route %s->%s\n",
2116 			 count, route->source, route->sink);
2117 
2118 	return 0;
2119 }
2120 
2121 /**
2122  * snd_soc_dapm_weak_routes - Mark routes between DAPM widgets as weak
2123  * @dapm: DAPM context
2124  * @route: audio routes
2125  * @num: number of routes
2126  *
2127  * Mark existing routes matching those specified in the passed array
2128  * as being weak, meaning that they are ignored for the purpose of
2129  * power decisions.  The main intended use case is for sidetone paths
2130  * which couple audio between other independent paths if they are both
2131  * active in order to make the combination work better at the user
2132  * level but which aren't intended to be "used".
2133  *
2134  * Note that CODEC drivers should not use this as sidetone type paths
2135  * can frequently also be used as bypass paths.
2136  */
2137 int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm,
2138 			     const struct snd_soc_dapm_route *route, int num)
2139 {
2140 	int i, err;
2141 	int ret = 0;
2142 
2143 	for (i = 0; i < num; i++) {
2144 		err = snd_soc_dapm_weak_route(dapm, route);
2145 		if (err)
2146 			ret = err;
2147 		route++;
2148 	}
2149 
2150 	return ret;
2151 }
2152 EXPORT_SYMBOL_GPL(snd_soc_dapm_weak_routes);
2153 
2154 /**
2155  * snd_soc_dapm_new_widgets - add new dapm widgets
2156  * @dapm: DAPM context
2157  *
2158  * Checks the codec for any new dapm widgets and creates them if found.
2159  *
2160  * Returns 0 for success.
2161  */
2162 int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm)
2163 {
2164 	struct snd_soc_dapm_widget *w;
2165 	unsigned int val;
2166 
2167 	list_for_each_entry(w, &dapm->card->widgets, list)
2168 	{
2169 		if (w->new)
2170 			continue;
2171 
2172 		if (w->num_kcontrols) {
2173 			w->kcontrols = kzalloc(w->num_kcontrols *
2174 						sizeof(struct snd_kcontrol *),
2175 						GFP_KERNEL);
2176 			if (!w->kcontrols)
2177 				return -ENOMEM;
2178 		}
2179 
2180 		switch(w->id) {
2181 		case snd_soc_dapm_switch:
2182 		case snd_soc_dapm_mixer:
2183 		case snd_soc_dapm_mixer_named_ctl:
2184 			dapm_new_mixer(w);
2185 			break;
2186 		case snd_soc_dapm_mux:
2187 		case snd_soc_dapm_virt_mux:
2188 		case snd_soc_dapm_value_mux:
2189 			dapm_new_mux(w);
2190 			break;
2191 		case snd_soc_dapm_pga:
2192 		case snd_soc_dapm_out_drv:
2193 			dapm_new_pga(w);
2194 			break;
2195 		default:
2196 			break;
2197 		}
2198 
2199 		/* Read the initial power state from the device */
2200 		if (w->reg >= 0) {
2201 			val = soc_widget_read(w, w->reg);
2202 			val &= 1 << w->shift;
2203 			if (w->invert)
2204 				val = !val;
2205 
2206 			if (val)
2207 				w->power = 1;
2208 		}
2209 
2210 		w->new = 1;
2211 
2212 		dapm_mark_dirty(w, "new widget");
2213 		dapm_debugfs_add_widget(w);
2214 	}
2215 
2216 	dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP);
2217 	return 0;
2218 }
2219 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
2220 
2221 /**
2222  * snd_soc_dapm_get_volsw - dapm mixer get callback
2223  * @kcontrol: mixer control
2224  * @ucontrol: control element information
2225  *
2226  * Callback to get the value of a dapm mixer control.
2227  *
2228  * Returns 0 for success.
2229  */
2230 int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
2231 	struct snd_ctl_elem_value *ucontrol)
2232 {
2233 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
2234 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
2235 	struct soc_mixer_control *mc =
2236 		(struct soc_mixer_control *)kcontrol->private_value;
2237 	unsigned int reg = mc->reg;
2238 	unsigned int shift = mc->shift;
2239 	unsigned int rshift = mc->rshift;
2240 	int max = mc->max;
2241 	unsigned int invert = mc->invert;
2242 	unsigned int mask = (1 << fls(max)) - 1;
2243 
2244 	ucontrol->value.integer.value[0] =
2245 		(snd_soc_read(widget->codec, reg) >> shift) & mask;
2246 	if (shift != rshift)
2247 		ucontrol->value.integer.value[1] =
2248 			(snd_soc_read(widget->codec, reg) >> rshift) & mask;
2249 	if (invert) {
2250 		ucontrol->value.integer.value[0] =
2251 			max - ucontrol->value.integer.value[0];
2252 		if (shift != rshift)
2253 			ucontrol->value.integer.value[1] =
2254 				max - ucontrol->value.integer.value[1];
2255 	}
2256 
2257 	return 0;
2258 }
2259 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw);
2260 
2261 /**
2262  * snd_soc_dapm_put_volsw - dapm mixer set callback
2263  * @kcontrol: mixer control
2264  * @ucontrol: control element information
2265  *
2266  * Callback to set the value of a dapm mixer control.
2267  *
2268  * Returns 0 for success.
2269  */
2270 int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
2271 	struct snd_ctl_elem_value *ucontrol)
2272 {
2273 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
2274 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
2275 	struct snd_soc_codec *codec = widget->codec;
2276 	struct soc_mixer_control *mc =
2277 		(struct soc_mixer_control *)kcontrol->private_value;
2278 	unsigned int reg = mc->reg;
2279 	unsigned int shift = mc->shift;
2280 	int max = mc->max;
2281 	unsigned int mask = (1 << fls(max)) - 1;
2282 	unsigned int invert = mc->invert;
2283 	unsigned int val;
2284 	int connect, change;
2285 	struct snd_soc_dapm_update update;
2286 	int wi;
2287 
2288 	val = (ucontrol->value.integer.value[0] & mask);
2289 
2290 	if (invert)
2291 		val = max - val;
2292 	mask = mask << shift;
2293 	val = val << shift;
2294 
2295 	if (val)
2296 		/* new connection */
2297 		connect = invert ? 0 : 1;
2298 	else
2299 		/* old connection must be powered down */
2300 		connect = invert ? 1 : 0;
2301 
2302 	mutex_lock(&codec->mutex);
2303 
2304 	change = snd_soc_test_bits(widget->codec, reg, mask, val);
2305 	if (change) {
2306 		for (wi = 0; wi < wlist->num_widgets; wi++) {
2307 			widget = wlist->widgets[wi];
2308 
2309 			widget->value = val;
2310 
2311 			update.kcontrol = kcontrol;
2312 			update.widget = widget;
2313 			update.reg = reg;
2314 			update.mask = mask;
2315 			update.val = val;
2316 			widget->dapm->update = &update;
2317 
2318 			dapm_mixer_update_power(widget, kcontrol, connect);
2319 
2320 			widget->dapm->update = NULL;
2321 		}
2322 	}
2323 
2324 	mutex_unlock(&codec->mutex);
2325 	return 0;
2326 }
2327 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
2328 
2329 /**
2330  * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback
2331  * @kcontrol: mixer control
2332  * @ucontrol: control element information
2333  *
2334  * Callback to get the value of a dapm enumerated double mixer control.
2335  *
2336  * Returns 0 for success.
2337  */
2338 int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
2339 	struct snd_ctl_elem_value *ucontrol)
2340 {
2341 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
2342 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
2343 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
2344 	unsigned int val, bitmask;
2345 
2346 	for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
2347 		;
2348 	val = snd_soc_read(widget->codec, e->reg);
2349 	ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1);
2350 	if (e->shift_l != e->shift_r)
2351 		ucontrol->value.enumerated.item[1] =
2352 			(val >> e->shift_r) & (bitmask - 1);
2353 
2354 	return 0;
2355 }
2356 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double);
2357 
2358 /**
2359  * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback
2360  * @kcontrol: mixer control
2361  * @ucontrol: control element information
2362  *
2363  * Callback to set the value of a dapm enumerated double mixer control.
2364  *
2365  * Returns 0 for success.
2366  */
2367 int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
2368 	struct snd_ctl_elem_value *ucontrol)
2369 {
2370 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
2371 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
2372 	struct snd_soc_codec *codec = widget->codec;
2373 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
2374 	unsigned int val, mux, change;
2375 	unsigned int mask, bitmask;
2376 	struct snd_soc_dapm_update update;
2377 	int wi;
2378 
2379 	for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
2380 		;
2381 	if (ucontrol->value.enumerated.item[0] > e->max - 1)
2382 		return -EINVAL;
2383 	mux = ucontrol->value.enumerated.item[0];
2384 	val = mux << e->shift_l;
2385 	mask = (bitmask - 1) << e->shift_l;
2386 	if (e->shift_l != e->shift_r) {
2387 		if (ucontrol->value.enumerated.item[1] > e->max - 1)
2388 			return -EINVAL;
2389 		val |= ucontrol->value.enumerated.item[1] << e->shift_r;
2390 		mask |= (bitmask - 1) << e->shift_r;
2391 	}
2392 
2393 	mutex_lock(&codec->mutex);
2394 
2395 	change = snd_soc_test_bits(widget->codec, e->reg, mask, val);
2396 	if (change) {
2397 		for (wi = 0; wi < wlist->num_widgets; wi++) {
2398 			widget = wlist->widgets[wi];
2399 
2400 			widget->value = val;
2401 
2402 			update.kcontrol = kcontrol;
2403 			update.widget = widget;
2404 			update.reg = e->reg;
2405 			update.mask = mask;
2406 			update.val = val;
2407 			widget->dapm->update = &update;
2408 
2409 			dapm_mux_update_power(widget, kcontrol, change, mux, e);
2410 
2411 			widget->dapm->update = NULL;
2412 		}
2413 	}
2414 
2415 	mutex_unlock(&codec->mutex);
2416 	return change;
2417 }
2418 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double);
2419 
2420 /**
2421  * snd_soc_dapm_get_enum_virt - Get virtual DAPM mux
2422  * @kcontrol: mixer control
2423  * @ucontrol: control element information
2424  *
2425  * Returns 0 for success.
2426  */
2427 int snd_soc_dapm_get_enum_virt(struct snd_kcontrol *kcontrol,
2428 			       struct snd_ctl_elem_value *ucontrol)
2429 {
2430 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
2431 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
2432 
2433 	ucontrol->value.enumerated.item[0] = widget->value;
2434 
2435 	return 0;
2436 }
2437 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_virt);
2438 
2439 /**
2440  * snd_soc_dapm_put_enum_virt - Set virtual DAPM mux
2441  * @kcontrol: mixer control
2442  * @ucontrol: control element information
2443  *
2444  * Returns 0 for success.
2445  */
2446 int snd_soc_dapm_put_enum_virt(struct snd_kcontrol *kcontrol,
2447 			       struct snd_ctl_elem_value *ucontrol)
2448 {
2449 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
2450 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
2451 	struct snd_soc_codec *codec = widget->codec;
2452 	struct soc_enum *e =
2453 		(struct soc_enum *)kcontrol->private_value;
2454 	int change;
2455 	int ret = 0;
2456 	int wi;
2457 
2458 	if (ucontrol->value.enumerated.item[0] >= e->max)
2459 		return -EINVAL;
2460 
2461 	mutex_lock(&codec->mutex);
2462 
2463 	change = widget->value != ucontrol->value.enumerated.item[0];
2464 	if (change) {
2465 		for (wi = 0; wi < wlist->num_widgets; wi++) {
2466 			widget = wlist->widgets[wi];
2467 
2468 			widget->value = ucontrol->value.enumerated.item[0];
2469 
2470 			dapm_mux_update_power(widget, kcontrol, change,
2471 					      widget->value, e);
2472 		}
2473 	}
2474 
2475 	mutex_unlock(&codec->mutex);
2476 	return ret;
2477 }
2478 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_virt);
2479 
2480 /**
2481  * snd_soc_dapm_get_value_enum_double - dapm semi enumerated double mixer get
2482  *					callback
2483  * @kcontrol: mixer control
2484  * @ucontrol: control element information
2485  *
2486  * Callback to get the value of a dapm semi enumerated double mixer control.
2487  *
2488  * Semi enumerated mixer: the enumerated items are referred as values. Can be
2489  * used for handling bitfield coded enumeration for example.
2490  *
2491  * Returns 0 for success.
2492  */
2493 int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol,
2494 	struct snd_ctl_elem_value *ucontrol)
2495 {
2496 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
2497 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
2498 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
2499 	unsigned int reg_val, val, mux;
2500 
2501 	reg_val = snd_soc_read(widget->codec, e->reg);
2502 	val = (reg_val >> e->shift_l) & e->mask;
2503 	for (mux = 0; mux < e->max; mux++) {
2504 		if (val == e->values[mux])
2505 			break;
2506 	}
2507 	ucontrol->value.enumerated.item[0] = mux;
2508 	if (e->shift_l != e->shift_r) {
2509 		val = (reg_val >> e->shift_r) & e->mask;
2510 		for (mux = 0; mux < e->max; mux++) {
2511 			if (val == e->values[mux])
2512 				break;
2513 		}
2514 		ucontrol->value.enumerated.item[1] = mux;
2515 	}
2516 
2517 	return 0;
2518 }
2519 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_value_enum_double);
2520 
2521 /**
2522  * snd_soc_dapm_put_value_enum_double - dapm semi enumerated double mixer set
2523  *					callback
2524  * @kcontrol: mixer control
2525  * @ucontrol: control element information
2526  *
2527  * Callback to set the value of a dapm semi enumerated double mixer control.
2528  *
2529  * Semi enumerated mixer: the enumerated items are referred as values. Can be
2530  * used for handling bitfield coded enumeration for example.
2531  *
2532  * Returns 0 for success.
2533  */
2534 int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
2535 	struct snd_ctl_elem_value *ucontrol)
2536 {
2537 	struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
2538 	struct snd_soc_dapm_widget *widget = wlist->widgets[0];
2539 	struct snd_soc_codec *codec = widget->codec;
2540 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
2541 	unsigned int val, mux, change;
2542 	unsigned int mask;
2543 	struct snd_soc_dapm_update update;
2544 	int wi;
2545 
2546 	if (ucontrol->value.enumerated.item[0] > e->max - 1)
2547 		return -EINVAL;
2548 	mux = ucontrol->value.enumerated.item[0];
2549 	val = e->values[ucontrol->value.enumerated.item[0]] << e->shift_l;
2550 	mask = e->mask << e->shift_l;
2551 	if (e->shift_l != e->shift_r) {
2552 		if (ucontrol->value.enumerated.item[1] > e->max - 1)
2553 			return -EINVAL;
2554 		val |= e->values[ucontrol->value.enumerated.item[1]] << e->shift_r;
2555 		mask |= e->mask << e->shift_r;
2556 	}
2557 
2558 	mutex_lock(&codec->mutex);
2559 
2560 	change = snd_soc_test_bits(widget->codec, e->reg, mask, val);
2561 	if (change) {
2562 		for (wi = 0; wi < wlist->num_widgets; wi++) {
2563 			widget = wlist->widgets[wi];
2564 
2565 			widget->value = val;
2566 
2567 			update.kcontrol = kcontrol;
2568 			update.widget = widget;
2569 			update.reg = e->reg;
2570 			update.mask = mask;
2571 			update.val = val;
2572 			widget->dapm->update = &update;
2573 
2574 			dapm_mux_update_power(widget, kcontrol, change, mux, e);
2575 
2576 			widget->dapm->update = NULL;
2577 		}
2578 	}
2579 
2580 	mutex_unlock(&codec->mutex);
2581 	return change;
2582 }
2583 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_value_enum_double);
2584 
2585 /**
2586  * snd_soc_dapm_info_pin_switch - Info for a pin switch
2587  *
2588  * @kcontrol: mixer control
2589  * @uinfo: control element information
2590  *
2591  * Callback to provide information about a pin switch control.
2592  */
2593 int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol,
2594 				 struct snd_ctl_elem_info *uinfo)
2595 {
2596 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
2597 	uinfo->count = 1;
2598 	uinfo->value.integer.min = 0;
2599 	uinfo->value.integer.max = 1;
2600 
2601 	return 0;
2602 }
2603 EXPORT_SYMBOL_GPL(snd_soc_dapm_info_pin_switch);
2604 
2605 /**
2606  * snd_soc_dapm_get_pin_switch - Get information for a pin switch
2607  *
2608  * @kcontrol: mixer control
2609  * @ucontrol: Value
2610  */
2611 int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,
2612 				struct snd_ctl_elem_value *ucontrol)
2613 {
2614 	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
2615 	const char *pin = (const char *)kcontrol->private_value;
2616 
2617 	mutex_lock(&codec->mutex);
2618 
2619 	ucontrol->value.integer.value[0] =
2620 		snd_soc_dapm_get_pin_status(&codec->dapm, pin);
2621 
2622 	mutex_unlock(&codec->mutex);
2623 
2624 	return 0;
2625 }
2626 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_switch);
2627 
2628 /**
2629  * snd_soc_dapm_put_pin_switch - Set information for a pin switch
2630  *
2631  * @kcontrol: mixer control
2632  * @ucontrol: Value
2633  */
2634 int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
2635 				struct snd_ctl_elem_value *ucontrol)
2636 {
2637 	struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
2638 	const char *pin = (const char *)kcontrol->private_value;
2639 
2640 	mutex_lock(&codec->mutex);
2641 
2642 	if (ucontrol->value.integer.value[0])
2643 		snd_soc_dapm_enable_pin(&codec->dapm, pin);
2644 	else
2645 		snd_soc_dapm_disable_pin(&codec->dapm, pin);
2646 
2647 	snd_soc_dapm_sync(&codec->dapm);
2648 
2649 	mutex_unlock(&codec->mutex);
2650 
2651 	return 0;
2652 }
2653 EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
2654 
2655 /**
2656  * snd_soc_dapm_new_control - create new dapm control
2657  * @dapm: DAPM context
2658  * @widget: widget template
2659  *
2660  * Creates a new dapm control based upon the template.
2661  *
2662  * Returns 0 for success else error.
2663  */
2664 int snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
2665 	const struct snd_soc_dapm_widget *widget)
2666 {
2667 	struct snd_soc_dapm_widget *w;
2668 	size_t name_len;
2669 
2670 	if ((w = dapm_cnew_widget(widget)) == NULL)
2671 		return -ENOMEM;
2672 
2673 	name_len = strlen(widget->name) + 1;
2674 	if (dapm->codec && dapm->codec->name_prefix)
2675 		name_len += 1 + strlen(dapm->codec->name_prefix);
2676 	w->name = kmalloc(name_len, GFP_KERNEL);
2677 	if (w->name == NULL) {
2678 		kfree(w);
2679 		return -ENOMEM;
2680 	}
2681 	if (dapm->codec && dapm->codec->name_prefix)
2682 		snprintf(w->name, name_len, "%s %s",
2683 			dapm->codec->name_prefix, widget->name);
2684 	else
2685 		snprintf(w->name, name_len, "%s", widget->name);
2686 
2687 	switch (w->id) {
2688 	case snd_soc_dapm_switch:
2689 	case snd_soc_dapm_mixer:
2690 	case snd_soc_dapm_mixer_named_ctl:
2691 		w->power_check = dapm_generic_check_power;
2692 		break;
2693 	case snd_soc_dapm_mux:
2694 	case snd_soc_dapm_virt_mux:
2695 	case snd_soc_dapm_value_mux:
2696 		w->power_check = dapm_generic_check_power;
2697 		break;
2698 	case snd_soc_dapm_adc:
2699 	case snd_soc_dapm_aif_out:
2700 		w->power_check = dapm_adc_check_power;
2701 		break;
2702 	case snd_soc_dapm_dac:
2703 	case snd_soc_dapm_aif_in:
2704 		w->power_check = dapm_dac_check_power;
2705 		break;
2706 	case snd_soc_dapm_pga:
2707 	case snd_soc_dapm_out_drv:
2708 	case snd_soc_dapm_input:
2709 	case snd_soc_dapm_output:
2710 	case snd_soc_dapm_micbias:
2711 	case snd_soc_dapm_spk:
2712 	case snd_soc_dapm_hp:
2713 	case snd_soc_dapm_mic:
2714 	case snd_soc_dapm_line:
2715 		w->power_check = dapm_generic_check_power;
2716 		break;
2717 	case snd_soc_dapm_supply:
2718 		w->power_check = dapm_supply_check_power;
2719 		break;
2720 	default:
2721 		w->power_check = dapm_always_on_check_power;
2722 		break;
2723 	}
2724 
2725 	dapm->n_widgets++;
2726 	w->dapm = dapm;
2727 	w->codec = dapm->codec;
2728 	w->platform = dapm->platform;
2729 	INIT_LIST_HEAD(&w->sources);
2730 	INIT_LIST_HEAD(&w->sinks);
2731 	INIT_LIST_HEAD(&w->list);
2732 	INIT_LIST_HEAD(&w->dirty);
2733 	list_add(&w->list, &dapm->card->widgets);
2734 
2735 	/* machine layer set ups unconnected pins and insertions */
2736 	w->connected = 1;
2737 	return 0;
2738 }
2739 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_control);
2740 
2741 /**
2742  * snd_soc_dapm_new_controls - create new dapm controls
2743  * @dapm: DAPM context
2744  * @widget: widget array
2745  * @num: number of widgets
2746  *
2747  * Creates new DAPM controls based upon the templates.
2748  *
2749  * Returns 0 for success else error.
2750  */
2751 int snd_soc_dapm_new_controls(struct snd_soc_dapm_context *dapm,
2752 	const struct snd_soc_dapm_widget *widget,
2753 	int num)
2754 {
2755 	int i, ret;
2756 
2757 	for (i = 0; i < num; i++) {
2758 		ret = snd_soc_dapm_new_control(dapm, widget);
2759 		if (ret < 0) {
2760 			dev_err(dapm->dev,
2761 				"ASoC: Failed to create DAPM control %s: %d\n",
2762 				widget->name, ret);
2763 			return ret;
2764 		}
2765 		widget++;
2766 	}
2767 	return 0;
2768 }
2769 EXPORT_SYMBOL_GPL(snd_soc_dapm_new_controls);
2770 
2771 static void soc_dapm_stream_event(struct snd_soc_dapm_context *dapm,
2772 	const char *stream, int event)
2773 {
2774 	struct snd_soc_dapm_widget *w;
2775 
2776 	list_for_each_entry(w, &dapm->card->widgets, list)
2777 	{
2778 		if (!w->sname || w->dapm != dapm)
2779 			continue;
2780 		dev_vdbg(w->dapm->dev, "widget %s\n %s stream %s event %d\n",
2781 			w->name, w->sname, stream, event);
2782 		if (strstr(w->sname, stream)) {
2783 			dapm_mark_dirty(w, "stream event");
2784 			switch(event) {
2785 			case SND_SOC_DAPM_STREAM_START:
2786 				w->active = 1;
2787 				break;
2788 			case SND_SOC_DAPM_STREAM_STOP:
2789 				w->active = 0;
2790 				break;
2791 			case SND_SOC_DAPM_STREAM_SUSPEND:
2792 			case SND_SOC_DAPM_STREAM_RESUME:
2793 			case SND_SOC_DAPM_STREAM_PAUSE_PUSH:
2794 			case SND_SOC_DAPM_STREAM_PAUSE_RELEASE:
2795 				break;
2796 			}
2797 		}
2798 	}
2799 
2800 	dapm_power_widgets(dapm, event);
2801 
2802 	/* do we need to notify any clients that DAPM stream is complete */
2803 	if (dapm->stream_event)
2804 		dapm->stream_event(dapm, event);
2805 }
2806 
2807 /**
2808  * snd_soc_dapm_stream_event - send a stream event to the dapm core
2809  * @rtd: PCM runtime data
2810  * @stream: stream name
2811  * @event: stream event
2812  *
2813  * Sends a stream event to the dapm core. The core then makes any
2814  * necessary widget power changes.
2815  *
2816  * Returns 0 for success else error.
2817  */
2818 int snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd,
2819 	const char *stream, int event)
2820 {
2821 	struct snd_soc_codec *codec = rtd->codec;
2822 
2823 	if (stream == NULL)
2824 		return 0;
2825 
2826 	mutex_lock(&codec->mutex);
2827 	soc_dapm_stream_event(&codec->dapm, stream, event);
2828 	mutex_unlock(&codec->mutex);
2829 	return 0;
2830 }
2831 
2832 /**
2833  * snd_soc_dapm_enable_pin - enable pin.
2834  * @dapm: DAPM context
2835  * @pin: pin name
2836  *
2837  * Enables input/output pin and its parents or children widgets iff there is
2838  * a valid audio route and active audio stream.
2839  * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
2840  * do any widget power switching.
2841  */
2842 int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm, const char *pin)
2843 {
2844 	return snd_soc_dapm_set_pin(dapm, pin, 1);
2845 }
2846 EXPORT_SYMBOL_GPL(snd_soc_dapm_enable_pin);
2847 
2848 /**
2849  * snd_soc_dapm_force_enable_pin - force a pin to be enabled
2850  * @dapm: DAPM context
2851  * @pin: pin name
2852  *
2853  * Enables input/output pin regardless of any other state.  This is
2854  * intended for use with microphone bias supplies used in microphone
2855  * jack detection.
2856  *
2857  * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
2858  * do any widget power switching.
2859  */
2860 int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
2861 				  const char *pin)
2862 {
2863 	struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
2864 
2865 	if (!w) {
2866 		dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
2867 		return -EINVAL;
2868 	}
2869 
2870 	dev_dbg(w->dapm->dev, "dapm: force enable pin %s\n", pin);
2871 	w->connected = 1;
2872 	w->force = 1;
2873 	dapm_mark_dirty(w, "force enable");
2874 
2875 	return 0;
2876 }
2877 EXPORT_SYMBOL_GPL(snd_soc_dapm_force_enable_pin);
2878 
2879 /**
2880  * snd_soc_dapm_disable_pin - disable pin.
2881  * @dapm: DAPM context
2882  * @pin: pin name
2883  *
2884  * Disables input/output pin and its parents or children widgets.
2885  * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
2886  * do any widget power switching.
2887  */
2888 int snd_soc_dapm_disable_pin(struct snd_soc_dapm_context *dapm,
2889 			     const char *pin)
2890 {
2891 	return snd_soc_dapm_set_pin(dapm, pin, 0);
2892 }
2893 EXPORT_SYMBOL_GPL(snd_soc_dapm_disable_pin);
2894 
2895 /**
2896  * snd_soc_dapm_nc_pin - permanently disable pin.
2897  * @dapm: DAPM context
2898  * @pin: pin name
2899  *
2900  * Marks the specified pin as being not connected, disabling it along
2901  * any parent or child widgets.  At present this is identical to
2902  * snd_soc_dapm_disable_pin() but in future it will be extended to do
2903  * additional things such as disabling controls which only affect
2904  * paths through the pin.
2905  *
2906  * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
2907  * do any widget power switching.
2908  */
2909 int snd_soc_dapm_nc_pin(struct snd_soc_dapm_context *dapm, const char *pin)
2910 {
2911 	return snd_soc_dapm_set_pin(dapm, pin, 0);
2912 }
2913 EXPORT_SYMBOL_GPL(snd_soc_dapm_nc_pin);
2914 
2915 /**
2916  * snd_soc_dapm_get_pin_status - get audio pin status
2917  * @dapm: DAPM context
2918  * @pin: audio signal pin endpoint (or start point)
2919  *
2920  * Get audio pin status - connected or disconnected.
2921  *
2922  * Returns 1 for connected otherwise 0.
2923  */
2924 int snd_soc_dapm_get_pin_status(struct snd_soc_dapm_context *dapm,
2925 				const char *pin)
2926 {
2927 	struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
2928 
2929 	if (w)
2930 		return w->connected;
2931 
2932 	return 0;
2933 }
2934 EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status);
2935 
2936 /**
2937  * snd_soc_dapm_ignore_suspend - ignore suspend status for DAPM endpoint
2938  * @dapm: DAPM context
2939  * @pin: audio signal pin endpoint (or start point)
2940  *
2941  * Mark the given endpoint or pin as ignoring suspend.  When the
2942  * system is disabled a path between two endpoints flagged as ignoring
2943  * suspend will not be disabled.  The path must already be enabled via
2944  * normal means at suspend time, it will not be turned on if it was not
2945  * already enabled.
2946  */
2947 int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
2948 				const char *pin)
2949 {
2950 	struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, false);
2951 
2952 	if (!w) {
2953 		dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
2954 		return -EINVAL;
2955 	}
2956 
2957 	w->ignore_suspend = 1;
2958 
2959 	return 0;
2960 }
2961 EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
2962 
2963 static bool snd_soc_dapm_widget_in_card_paths(struct snd_soc_card *card,
2964 					      struct snd_soc_dapm_widget *w)
2965 {
2966 	struct snd_soc_dapm_path *p;
2967 
2968 	list_for_each_entry(p, &card->paths, list) {
2969 		if ((p->source == w) || (p->sink == w)) {
2970 			dev_dbg(card->dev,
2971 			    "... Path %s(id:%d dapm:%p) - %s(id:%d dapm:%p)\n",
2972 			    p->source->name, p->source->id, p->source->dapm,
2973 			    p->sink->name, p->sink->id, p->sink->dapm);
2974 
2975 			/* Connected to something other than the codec */
2976 			if (p->source->dapm != p->sink->dapm)
2977 				return true;
2978 			/*
2979 			 * Loopback connection from codec external pin to
2980 			 * codec external pin
2981 			 */
2982 			if (p->sink->id == snd_soc_dapm_input) {
2983 				switch (p->source->id) {
2984 				case snd_soc_dapm_output:
2985 				case snd_soc_dapm_micbias:
2986 					return true;
2987 				default:
2988 					break;
2989 				}
2990 			}
2991 		}
2992 	}
2993 
2994 	return false;
2995 }
2996 
2997 /**
2998  * snd_soc_dapm_auto_nc_codec_pins - call snd_soc_dapm_nc_pin for unused pins
2999  * @codec: The codec whose pins should be processed
3000  *
3001  * Automatically call snd_soc_dapm_nc_pin() for any external pins in the codec
3002  * which are unused. Pins are used if they are connected externally to the
3003  * codec, whether that be to some other device, or a loop-back connection to
3004  * the codec itself.
3005  */
3006 void snd_soc_dapm_auto_nc_codec_pins(struct snd_soc_codec *codec)
3007 {
3008 	struct snd_soc_card *card = codec->card;
3009 	struct snd_soc_dapm_context *dapm = &codec->dapm;
3010 	struct snd_soc_dapm_widget *w;
3011 
3012 	dev_dbg(codec->dev, "Auto NC: DAPMs: card:%p codec:%p\n",
3013 		&card->dapm, &codec->dapm);
3014 
3015 	list_for_each_entry(w, &card->widgets, list) {
3016 		if (w->dapm != dapm)
3017 			continue;
3018 		switch (w->id) {
3019 		case snd_soc_dapm_input:
3020 		case snd_soc_dapm_output:
3021 		case snd_soc_dapm_micbias:
3022 			dev_dbg(codec->dev, "Auto NC: Checking widget %s\n",
3023 				w->name);
3024 			if (!snd_soc_dapm_widget_in_card_paths(card, w)) {
3025 				dev_dbg(codec->dev,
3026 					"... Not in map; disabling\n");
3027 				snd_soc_dapm_nc_pin(dapm, w->name);
3028 			}
3029 			break;
3030 		default:
3031 			break;
3032 		}
3033 	}
3034 }
3035 
3036 /**
3037  * snd_soc_dapm_free - free dapm resources
3038  * @dapm: DAPM context
3039  *
3040  * Free all dapm widgets and resources.
3041  */
3042 void snd_soc_dapm_free(struct snd_soc_dapm_context *dapm)
3043 {
3044 	snd_soc_dapm_sys_remove(dapm->dev);
3045 	dapm_debugfs_cleanup(dapm);
3046 	dapm_free_widgets(dapm);
3047 	list_del(&dapm->list);
3048 }
3049 EXPORT_SYMBOL_GPL(snd_soc_dapm_free);
3050 
3051 static void soc_dapm_shutdown_codec(struct snd_soc_dapm_context *dapm)
3052 {
3053 	struct snd_soc_dapm_widget *w;
3054 	LIST_HEAD(down_list);
3055 	int powerdown = 0;
3056 
3057 	list_for_each_entry(w, &dapm->card->widgets, list) {
3058 		if (w->dapm != dapm)
3059 			continue;
3060 		if (w->power) {
3061 			dapm_seq_insert(w, &down_list, false);
3062 			w->power = 0;
3063 			powerdown = 1;
3064 		}
3065 	}
3066 
3067 	/* If there were no widgets to power down we're already in
3068 	 * standby.
3069 	 */
3070 	if (powerdown) {
3071 		snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_PREPARE);
3072 		dapm_seq_run(dapm, &down_list, 0, false);
3073 		snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_STANDBY);
3074 	}
3075 }
3076 
3077 /*
3078  * snd_soc_dapm_shutdown - callback for system shutdown
3079  */
3080 void snd_soc_dapm_shutdown(struct snd_soc_card *card)
3081 {
3082 	struct snd_soc_codec *codec;
3083 
3084 	list_for_each_entry(codec, &card->codec_dev_list, list) {
3085 		soc_dapm_shutdown_codec(&codec->dapm);
3086 		snd_soc_dapm_set_bias_level(&codec->dapm, SND_SOC_BIAS_OFF);
3087 	}
3088 }
3089 
3090 /* Module information */
3091 MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk");
3092 MODULE_DESCRIPTION("Dynamic Audio Power Management core for ALSA SoC");
3093 MODULE_LICENSE("GPL");
3094