diff options
author | Charles Keepax <ckeepax@opensource.wolfsonmicro.com> | 2016-09-27 11:35:45 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-09-27 12:07:33 -0400 |
commit | 8c7788f34e11f4c52d6a8a1340a8bd61476acabb (patch) | |
tree | 267f5b67aa7c143dc5c10c08d39e9ee589e5cc9c | |
parent | d605bd024e085ba7fe0fbedf1707d339ea9cc0af (diff) |
ASoC: arizona: Add output power up/down delays for speaker path
The later Arizona parts do run write sequences to power up and down the
speaker path as such a delay needs to be inserted into the DAPM sequence
to allow this to run. This patch adds appropriate delays into the
existing coalesced delay scheme.
Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/codecs/arizona.c | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index 7a99f77bbe84..85584ecf95bb 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c | |||
@@ -109,7 +109,7 @@ static int arizona_spk_ev(struct snd_soc_dapm_widget *w, | |||
109 | break; | 109 | break; |
110 | } | 110 | } |
111 | 111 | ||
112 | return 0; | 112 | return arizona_out_ev(w, kcontrol, event); |
113 | } | 113 | } |
114 | 114 | ||
115 | static irqreturn_t arizona_thermal_warn(int irq, void *data) | 115 | static irqreturn_t arizona_thermal_warn(int irq, void *data) |
@@ -159,12 +159,14 @@ static irqreturn_t arizona_thermal_shutdown(int irq, void *data) | |||
159 | static const struct snd_soc_dapm_widget arizona_spkl = | 159 | static const struct snd_soc_dapm_widget arizona_spkl = |
160 | SND_SOC_DAPM_PGA_E("OUT4L", SND_SOC_NOPM, | 160 | SND_SOC_DAPM_PGA_E("OUT4L", SND_SOC_NOPM, |
161 | ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev, | 161 | ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev, |
162 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU); | 162 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | |
163 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD); | ||
163 | 164 | ||
164 | static const struct snd_soc_dapm_widget arizona_spkr = | 165 | static const struct snd_soc_dapm_widget arizona_spkr = |
165 | SND_SOC_DAPM_PGA_E("OUT4R", SND_SOC_NOPM, | 166 | SND_SOC_DAPM_PGA_E("OUT4R", SND_SOC_NOPM, |
166 | ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev, | 167 | ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev, |
167 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU); | 168 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | |
169 | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD); | ||
168 | 170 | ||
169 | int arizona_init_spk(struct snd_soc_codec *codec) | 171 | int arizona_init_spk(struct snd_soc_codec *codec) |
170 | { | 172 | { |
@@ -864,6 +866,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w, | |||
864 | { | 866 | { |
865 | struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); | 867 | struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); |
866 | struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); | 868 | struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); |
869 | struct arizona *arizona = priv->arizona; | ||
867 | 870 | ||
868 | switch (event) { | 871 | switch (event) { |
869 | case SND_SOC_DAPM_PRE_PMU: | 872 | case SND_SOC_DAPM_PRE_PMU: |
@@ -877,6 +880,18 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w, | |||
877 | priv->out_up_pending++; | 880 | priv->out_up_pending++; |
878 | priv->out_up_delay += 17; | 881 | priv->out_up_delay += 17; |
879 | break; | 882 | break; |
883 | case ARIZONA_OUT4L_ENA_SHIFT: | ||
884 | case ARIZONA_OUT4R_ENA_SHIFT: | ||
885 | priv->out_up_pending++; | ||
886 | switch (arizona->type) { | ||
887 | case WM5102: | ||
888 | case WM8997: | ||
889 | break; | ||
890 | default: | ||
891 | priv->out_up_delay += 10; | ||
892 | break; | ||
893 | } | ||
894 | break; | ||
880 | default: | 895 | default: |
881 | break; | 896 | break; |
882 | } | 897 | } |
@@ -889,8 +904,10 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w, | |||
889 | case ARIZONA_OUT2R_ENA_SHIFT: | 904 | case ARIZONA_OUT2R_ENA_SHIFT: |
890 | case ARIZONA_OUT3L_ENA_SHIFT: | 905 | case ARIZONA_OUT3L_ENA_SHIFT: |
891 | case ARIZONA_OUT3R_ENA_SHIFT: | 906 | case ARIZONA_OUT3R_ENA_SHIFT: |
907 | case ARIZONA_OUT4L_ENA_SHIFT: | ||
908 | case ARIZONA_OUT4R_ENA_SHIFT: | ||
892 | priv->out_up_pending--; | 909 | priv->out_up_pending--; |
893 | if (!priv->out_up_pending) { | 910 | if (!priv->out_up_pending && priv->out_up_delay) { |
894 | dev_dbg(codec->dev, "Power up delay: %d\n", | 911 | dev_dbg(codec->dev, "Power up delay: %d\n", |
895 | priv->out_up_delay); | 912 | priv->out_up_delay); |
896 | msleep(priv->out_up_delay); | 913 | msleep(priv->out_up_delay); |
@@ -913,6 +930,21 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w, | |||
913 | priv->out_down_pending++; | 930 | priv->out_down_pending++; |
914 | priv->out_down_delay++; | 931 | priv->out_down_delay++; |
915 | break; | 932 | break; |
933 | case ARIZONA_OUT4L_ENA_SHIFT: | ||
934 | case ARIZONA_OUT4R_ENA_SHIFT: | ||
935 | priv->out_down_pending++; | ||
936 | switch (arizona->type) { | ||
937 | case WM5102: | ||
938 | case WM8997: | ||
939 | break; | ||
940 | case WM8998: | ||
941 | case WM1814: | ||
942 | priv->out_down_delay += 5; | ||
943 | break; | ||
944 | default: | ||
945 | priv->out_down_delay++; | ||
946 | break; | ||
947 | } | ||
916 | default: | 948 | default: |
917 | break; | 949 | break; |
918 | } | 950 | } |
@@ -925,8 +957,10 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w, | |||
925 | case ARIZONA_OUT2R_ENA_SHIFT: | 957 | case ARIZONA_OUT2R_ENA_SHIFT: |
926 | case ARIZONA_OUT3L_ENA_SHIFT: | 958 | case ARIZONA_OUT3L_ENA_SHIFT: |
927 | case ARIZONA_OUT3R_ENA_SHIFT: | 959 | case ARIZONA_OUT3R_ENA_SHIFT: |
960 | case ARIZONA_OUT4L_ENA_SHIFT: | ||
961 | case ARIZONA_OUT4R_ENA_SHIFT: | ||
928 | priv->out_down_pending--; | 962 | priv->out_down_pending--; |
929 | if (!priv->out_down_pending) { | 963 | if (!priv->out_down_pending && priv->out_down_delay) { |
930 | dev_dbg(codec->dev, "Power down delay: %d\n", | 964 | dev_dbg(codec->dev, "Power down delay: %d\n", |
931 | priv->out_down_delay); | 965 | priv->out_down_delay); |
932 | msleep(priv->out_down_delay); | 966 | msleep(priv->out_down_delay); |