aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>2016-09-27 11:35:45 -0400
committerMark Brown <broonie@kernel.org>2016-09-27 12:07:33 -0400
commit8c7788f34e11f4c52d6a8a1340a8bd61476acabb (patch)
tree267f5b67aa7c143dc5c10c08d39e9ee589e5cc9c
parentd605bd024e085ba7fe0fbedf1707d339ea9cc0af (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.c44
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
115static irqreturn_t arizona_thermal_warn(int irq, void *data) 115static irqreturn_t arizona_thermal_warn(int irq, void *data)
@@ -159,12 +159,14 @@ static irqreturn_t arizona_thermal_shutdown(int irq, void *data)
159static const struct snd_soc_dapm_widget arizona_spkl = 159static 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
164static const struct snd_soc_dapm_widget arizona_spkr = 165static 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
169int arizona_init_spk(struct snd_soc_codec *codec) 171int 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);