aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-dapm.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r--sound/soc/soc-dapm.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 499730ab5638..25e54230cc6a 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -712,7 +712,15 @@ static int dapm_supply_check_power(struct snd_soc_dapm_widget *w)
712 !path->connected(path->source, path->sink)) 712 !path->connected(path->source, path->sink))
713 continue; 713 continue;
714 714
715 if (path->sink && path->sink->power_check && 715 if (!path->sink)
716 continue;
717
718 if (path->sink->force) {
719 power = 1;
720 break;
721 }
722
723 if (path->sink->power_check &&
716 path->sink->power_check(path->sink)) { 724 path->sink->power_check(path->sink)) {
717 power = 1; 725 power = 1;
718 break; 726 break;
@@ -1627,6 +1635,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_add_routes);
1627int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm) 1635int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm)
1628{ 1636{
1629 struct snd_soc_dapm_widget *w; 1637 struct snd_soc_dapm_widget *w;
1638 unsigned int val;
1630 1639
1631 list_for_each_entry(w, &dapm->card->widgets, list) 1640 list_for_each_entry(w, &dapm->card->widgets, list)
1632 { 1641 {
@@ -1675,6 +1684,18 @@ int snd_soc_dapm_new_widgets(struct snd_soc_dapm_context *dapm)
1675 case snd_soc_dapm_post: 1684 case snd_soc_dapm_post:
1676 break; 1685 break;
1677 } 1686 }
1687
1688 /* Read the initial power state from the device */
1689 if (w->reg >= 0) {
1690 val = snd_soc_read(w->codec, w->reg);
1691 val &= 1 << w->shift;
1692 if (w->invert)
1693 val = !val;
1694
1695 if (val)
1696 w->power = 1;
1697 }
1698
1678 w->new = 1; 1699 w->new = 1;
1679 } 1700 }
1680 1701
@@ -1742,7 +1763,7 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
1742 int max = mc->max; 1763 int max = mc->max;
1743 unsigned int mask = (1 << fls(max)) - 1; 1764 unsigned int mask = (1 << fls(max)) - 1;
1744 unsigned int invert = mc->invert; 1765 unsigned int invert = mc->invert;
1745 unsigned int val, val_mask; 1766 unsigned int val;
1746 int connect, change; 1767 int connect, change;
1747 struct snd_soc_dapm_update update; 1768 struct snd_soc_dapm_update update;
1748 1769
@@ -1750,13 +1771,13 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
1750 1771
1751 if (invert) 1772 if (invert)
1752 val = max - val; 1773 val = max - val;
1753 val_mask = mask << shift; 1774 mask = mask << shift;
1754 val = val << shift; 1775 val = val << shift;
1755 1776
1756 mutex_lock(&widget->codec->mutex); 1777 mutex_lock(&widget->codec->mutex);
1757 widget->value = val; 1778 widget->value = val;
1758 1779
1759 change = snd_soc_test_bits(widget->codec, reg, val_mask, val); 1780 change = snd_soc_test_bits(widget->codec, reg, mask, val);
1760 if (change) { 1781 if (change) {
1761 if (val) 1782 if (val)
1762 /* new connection */ 1783 /* new connection */