aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2013-01-10 09:45:58 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-03-21 13:54:18 -0400
commit56447e1324009d7e3cec40e3cc2987843b59a00f (patch)
tree5a06797850248ded279d40655c85c0a1d2ca2f95
parent4f1b07581613bf076b0dacdd9a3fb290d3caa227 (diff)
ASoC: arizona: Factor out speaker widgets from CODEC drivers
Some system designs have been identified which repurpose portions of the speaker driver circuits for other functions which will require that they not be managed using DAPM. Prepare for this by factoring out the creation of the speaker widgets into the core driver, the widgets will be replaced by dummy ones when the additional functions are enabled. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/codecs/arizona.c82
-rw-r--r--sound/soc/codecs/arizona.h5
-rw-r--r--sound/soc/codecs/wm5102.c52
-rw-r--r--sound/soc/codecs/wm5110.c6
4 files changed, 89 insertions, 56 deletions
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
index 2b0803ec8234..009810b8c667 100644
--- a/sound/soc/codecs/arizona.c
+++ b/sound/soc/codecs/arizona.c
@@ -14,6 +14,7 @@
14#include <linux/gcd.h> 14#include <linux/gcd.h>
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/pm_runtime.h> 16#include <linux/pm_runtime.h>
17#include <linux/delay.h>
17#include <sound/pcm.h> 18#include <sound/pcm.h>
18#include <sound/pcm_params.h> 19#include <sound/pcm_params.h>
19#include <sound/tlv.h> 20#include <sound/tlv.h>
@@ -66,6 +67,87 @@
66#define arizona_aif_dbg(_dai, fmt, ...) \ 67#define arizona_aif_dbg(_dai, fmt, ...) \
67 dev_dbg(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__) 68 dev_dbg(_dai->dev, "AIF%d: " fmt, _dai->id, ##__VA_ARGS__)
68 69
70static int arizona_spk_ev(struct snd_soc_dapm_widget *w,
71 struct snd_kcontrol *kcontrol,
72 int event)
73{
74 struct snd_soc_codec *codec = w->codec;
75 struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
76 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
77 bool manual_ena = false;
78
79 switch (arizona->type) {
80 case WM5102:
81 switch (arizona->rev) {
82 case 0:
83 break;
84 default:
85 manual_ena = true;
86 break;
87 }
88 default:
89 break;
90 }
91
92 switch (event) {
93 case SND_SOC_DAPM_PRE_PMU:
94 if (!priv->spk_ena && manual_ena) {
95 snd_soc_write(codec, 0x4f5, 0x25a);
96 priv->spk_ena_pending = true;
97 }
98 break;
99 case SND_SOC_DAPM_POST_PMU:
100 if (priv->spk_ena_pending) {
101 msleep(75);
102 snd_soc_write(codec, 0x4f5, 0xda);
103 priv->spk_ena_pending = false;
104 priv->spk_ena++;
105 }
106 break;
107 case SND_SOC_DAPM_PRE_PMD:
108 if (manual_ena) {
109 priv->spk_ena--;
110 if (!priv->spk_ena)
111 snd_soc_write(codec, 0x4f5, 0x25a);
112 }
113 break;
114 case SND_SOC_DAPM_POST_PMD:
115 if (manual_ena) {
116 if (!priv->spk_ena)
117 snd_soc_write(codec, 0x4f5, 0x0da);
118 }
119 break;
120 }
121
122 return 0;
123}
124
125static const struct snd_soc_dapm_widget arizona_spkl =
126 SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1,
127 ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev,
128 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU);
129
130static const struct snd_soc_dapm_widget arizona_spkr =
131 SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1,
132 ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_spk_ev,
133 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU);
134
135int arizona_init_spk(struct snd_soc_codec *codec)
136{
137 int ret;
138
139 ret = snd_soc_dapm_new_controls(&codec->dapm, &arizona_spkl, 1);
140 if (ret != 0)
141 return ret;
142
143 ret = snd_soc_dapm_new_controls(&codec->dapm, &arizona_spkr, 1);
144 if (ret != 0)
145 return ret;
146
147 return 0;
148}
149EXPORT_SYMBOL_GPL(arizona_init_spk);
150
69const char *arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = { 151const char *arizona_mixer_texts[ARIZONA_NUM_MIXER_INPUTS] = {
70 "None", 152 "None",
71 "Tone Generator 1", 153 "Tone Generator 1",
diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h
index 572f11bc90b4..9399940f700d 100644
--- a/sound/soc/codecs/arizona.h
+++ b/sound/soc/codecs/arizona.h
@@ -76,6 +76,9 @@ struct arizona_priv {
76 76
77 int num_inputs; 77 int num_inputs;
78 unsigned int in_pending; 78 unsigned int in_pending;
79
80 unsigned int spk_ena:2;
81 unsigned int spk_ena_pending:1;
79}; 82};
80 83
81#define ARIZONA_NUM_MIXER_INPUTS 99 84#define ARIZONA_NUM_MIXER_INPUTS 99
@@ -228,6 +231,8 @@ extern int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
228extern int arizona_set_fll(struct arizona_fll *fll, int source, 231extern int arizona_set_fll(struct arizona_fll *fll, int source,
229 unsigned int Fref, unsigned int Fout); 232 unsigned int Fref, unsigned int Fout);
230 233
234extern int arizona_init_spk(struct snd_soc_codec *codec);
235
231extern int arizona_init_dai(struct arizona_priv *priv, int dai); 236extern int arizona_init_dai(struct arizona_priv *priv, int dai);
232 237
233int arizona_set_output_mode(struct snd_soc_codec *codec, int output, 238int arizona_set_output_mode(struct snd_soc_codec *codec, int output,
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c
index 44d4c69d25e5..97757bc5fd0e 100644
--- a/sound/soc/codecs/wm5102.c
+++ b/sound/soc/codecs/wm5102.c
@@ -36,9 +36,6 @@
36struct wm5102_priv { 36struct wm5102_priv {
37 struct arizona_priv core; 37 struct arizona_priv core;
38 struct arizona_fll fll[2]; 38 struct arizona_fll fll[2];
39
40 unsigned int spk_ena:2;
41 unsigned int spk_ena_pending:1;
42}; 39};
43 40
44static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0); 41static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
@@ -817,47 +814,6 @@ ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
817ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE), 814ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
818}; 815};
819 816
820static int wm5102_spk_ev(struct snd_soc_dapm_widget *w,
821 struct snd_kcontrol *kcontrol,
822 int event)
823{
824 struct snd_soc_codec *codec = w->codec;
825 struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
826 struct wm5102_priv *wm5102 = snd_soc_codec_get_drvdata(codec);
827
828 if (arizona->rev < 1)
829 return 0;
830
831 switch (event) {
832 case SND_SOC_DAPM_PRE_PMU:
833 if (!wm5102->spk_ena) {
834 snd_soc_write(codec, 0x4f5, 0x25a);
835 wm5102->spk_ena_pending = true;
836 }
837 break;
838 case SND_SOC_DAPM_POST_PMU:
839 if (wm5102->spk_ena_pending) {
840 msleep(75);
841 snd_soc_write(codec, 0x4f5, 0xda);
842 wm5102->spk_ena_pending = false;
843 wm5102->spk_ena++;
844 }
845 break;
846 case SND_SOC_DAPM_PRE_PMD:
847 wm5102->spk_ena--;
848 if (!wm5102->spk_ena)
849 snd_soc_write(codec, 0x4f5, 0x25a);
850 break;
851 case SND_SOC_DAPM_POST_PMD:
852 if (!wm5102->spk_ena)
853 snd_soc_write(codec, 0x4f5, 0x0da);
854 break;
855 }
856
857 return 0;
858}
859
860
861ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE); 817ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
862ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE); 818ARIZONA_MIXER_ENUMS(EQ2, ARIZONA_EQ2MIX_INPUT_1_SOURCE);
863ARIZONA_MIXER_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE); 819ARIZONA_MIXER_ENUMS(EQ3, ARIZONA_EQ3MIX_INPUT_1_SOURCE);
@@ -1141,12 +1097,6 @@ SND_SOC_DAPM_PGA_E("OUT2R", ARIZONA_OUTPUT_ENABLES_1,
1141SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1, 1097SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
1142 ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, 1098 ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
1143 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), 1099 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1144SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1,
1145 ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev,
1146 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1147SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1,
1148 ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, wm5102_spk_ev,
1149 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1150SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1, 1100SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
1151 ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, 1101 ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
1152 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), 1102 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
@@ -1586,6 +1536,8 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
1586 if (ret != 0) 1536 if (ret != 0)
1587 return ret; 1537 return ret;
1588 1538
1539 arizona_init_spk(codec);
1540
1589 snd_soc_dapm_disable_pin(&codec->dapm, "HAPTICS"); 1541 snd_soc_dapm_disable_pin(&codec->dapm, "HAPTICS");
1590 1542
1591 priv->core.arizona->dapm = &codec->dapm; 1543 priv->core.arizona->dapm = &codec->dapm;
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c
index a64d3b8bc3b4..b6329c8c19df 100644
--- a/sound/soc/codecs/wm5110.c
+++ b/sound/soc/codecs/wm5110.c
@@ -577,12 +577,6 @@ SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
577SND_SOC_DAPM_PGA_E("OUT3R", ARIZONA_OUTPUT_ENABLES_1, 577SND_SOC_DAPM_PGA_E("OUT3R", ARIZONA_OUTPUT_ENABLES_1,
578 ARIZONA_OUT3R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, 578 ARIZONA_OUT3R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
579 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), 579 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
580SND_SOC_DAPM_PGA_E("OUT4L", ARIZONA_OUTPUT_ENABLES_1,
581 ARIZONA_OUT4L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
582 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
583SND_SOC_DAPM_PGA_E("OUT4R", ARIZONA_OUTPUT_ENABLES_1,
584 ARIZONA_OUT4R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
585 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
586SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1, 580SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
587 ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev, 581 ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
588 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), 582 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),