diff options
-rw-r--r-- | sound/soc/soc-dapm.c | 79 |
1 files changed, 41 insertions, 38 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 2c87061c2a6b..17698ef58dfb 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -586,45 +586,48 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) | |||
586 | power_change = (w->power == power) ? 0: 1; | 586 | power_change = (w->power == power) ? 0: 1; |
587 | w->power = power; | 587 | w->power = power; |
588 | 588 | ||
589 | if (!power_change) | ||
590 | continue; | ||
591 | |||
589 | /* call any power change event handlers */ | 592 | /* call any power change event handlers */ |
590 | if (power_change) { | 593 | if (w->event) |
591 | if (w->event) { | 594 | pr_debug("power %s event for %s flags %x\n", |
592 | pr_debug("power %s event for %s flags %x\n", | 595 | w->power ? "on" : "off", |
593 | w->power ? "on" : "off", w->name, w->event_flags); | 596 | w->name, w->event_flags); |
594 | if (power) { | 597 | |
595 | /* power up event */ | 598 | /* power up pre event */ |
596 | if (w->event_flags & SND_SOC_DAPM_PRE_PMU) { | 599 | if (power && w->event && |
597 | ret = w->event(w, | 600 | (w->event_flags & SND_SOC_DAPM_PRE_PMU)) { |
598 | NULL, SND_SOC_DAPM_PRE_PMU); | 601 | ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMU); |
599 | if (ret < 0) | 602 | if (ret < 0) |
600 | return ret; | 603 | return ret; |
601 | } | 604 | } |
602 | dapm_update_bits(w); | 605 | |
603 | if (w->event_flags & SND_SOC_DAPM_POST_PMU){ | 606 | /* power down pre event */ |
604 | ret = w->event(w, | 607 | if (!power && w->event && |
605 | NULL, SND_SOC_DAPM_POST_PMU); | 608 | (w->event_flags & SND_SOC_DAPM_PRE_PMD)) { |
606 | if (ret < 0) | 609 | ret = w->event(w, NULL, SND_SOC_DAPM_PRE_PMD); |
607 | return ret; | 610 | if (ret < 0) |
608 | } | 611 | return ret; |
609 | } else { | 612 | } |
610 | /* power down event */ | 613 | |
611 | if (w->event_flags & SND_SOC_DAPM_PRE_PMD) { | 614 | dapm_update_bits(w); |
612 | ret = w->event(w, | 615 | |
613 | NULL, SND_SOC_DAPM_PRE_PMD); | 616 | /* power up post event */ |
614 | if (ret < 0) | 617 | if (power && w->event && |
615 | return ret; | 618 | (w->event_flags & SND_SOC_DAPM_POST_PMU)) { |
616 | } | 619 | ret = w->event(w, |
617 | dapm_update_bits(w); | 620 | NULL, SND_SOC_DAPM_POST_PMU); |
618 | if (w->event_flags & SND_SOC_DAPM_POST_PMD) { | 621 | if (ret < 0) |
619 | ret = w->event(w, | 622 | return ret; |
620 | NULL, SND_SOC_DAPM_POST_PMD); | 623 | } |
621 | if (ret < 0) | 624 | |
622 | return ret; | 625 | /* power down post event */ |
623 | } | 626 | if (!power && w->event && |
624 | } | 627 | (w->event_flags & SND_SOC_DAPM_POST_PMD)) { |
625 | } else | 628 | ret = w->event(w, NULL, SND_SOC_DAPM_POST_PMD); |
626 | /* no event handler */ | 629 | if (ret < 0) |
627 | dapm_update_bits(w); | 630 | return ret; |
628 | } | 631 | } |
629 | } | 632 | } |
630 | } | 633 | } |