Skip to content

Commit 4518295

Browse files
simontrimmerLucas Tanure
authored andcommitted
ASoC: clsic-codec: IN_VU is in a different place
Change-Id: Idbc1fce9f9adce0491e1c2aa9582416556fa5e55 Signed-off-by: Simon Trimmer <[email protected]>
1 parent e479afb commit 4518295

File tree

1 file changed

+73
-8
lines changed

1 file changed

+73
-8
lines changed

sound/soc/codecs/clsic-codec.c

Lines changed: 73 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,71 @@ int clsic_micbias_ev(struct snd_soc_dapm_widget *w,
245245
}
246246

247247

248+
/* The input controls are in sequential blocks */
249+
#define CLSIC_IN_SEPARATION (TACNA_INPUT2_CONTROL1 - TACNA_INPUT1_CONTROL1)
250+
251+
/*
252+
* The TACNA_IN_VU bit exposed in the multiple TACNA_IN??_CONTROL2 registers is
253+
* mapped to the same bit in the hardware - writing the TACNA_IN_VU bit in any
254+
* of the CONTROL2 registers will cause commits made to all of them to be
255+
* applied.
256+
*
257+
* The function counts the total number of events using the PRE_PMU step and
258+
* then sets the TACNA_IN_VU in the final POST_PMU event.
259+
*/
260+
int clsic_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
261+
int event)
262+
{
263+
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
264+
struct tacna_priv *priv = snd_soc_codec_get_drvdata(codec);
265+
unsigned int reg;
266+
267+
/*
268+
* Use the shift to determine the correct CONTROL2 register
269+
*
270+
* The shift represents a bit in the TACNA_INPUT_CONTROL register, it
271+
* begins at 0 and the order is IN1R, IN1L, IN2R, IN2L, IN3R, IN3L,
272+
* IN4R, IN4L - this can be used to identify whether to use the left or
273+
* right channel as a base and which IN blocks to use.
274+
*/
275+
if (w->shift & 1)
276+
reg = TACNA_IN1L_CONTROL2 +
277+
((w->shift / 2) * CLSIC_IN_SEPARATION);
278+
else
279+
reg = TACNA_IN1R_CONTROL2 +
280+
((w->shift / 2) * CLSIC_IN_SEPARATION);
281+
282+
switch (event) {
283+
case SND_SOC_DAPM_PRE_PMU:
284+
priv->in_up_pending++;
285+
break;
286+
case SND_SOC_DAPM_POST_PMU:
287+
priv->in_up_pending--;
288+
289+
/*
290+
* Always clear the mute bit, set the IN_VU bit if there are no
291+
* other other pending in_ev PMU events.
292+
*/
293+
if (!priv->in_up_pending)
294+
snd_soc_update_bits(codec, reg,
295+
TACNA_IN1L_MUTE | TACNA_IN_VU,
296+
TACNA_IN_VU);
297+
else
298+
snd_soc_update_bits(codec, reg, TACNA_IN1L_MUTE, 0);
299+
300+
break;
301+
case SND_SOC_DAPM_PRE_PMD:
302+
snd_soc_update_bits(codec, reg,
303+
TACNA_IN1L_MUTE | TACNA_IN_VU,
304+
TACNA_IN1L_MUTE | TACNA_IN_VU);
305+
break;
306+
default:
307+
break;
308+
}
309+
310+
return 0;
311+
}
312+
248313
static const struct snd_kcontrol_new clsic_snd_controls[] = {
249314
SOC_ENUM("IN1 OSR", tacna_in_dmic_osr[0]),
250315
SOC_ENUM("IN2 OSR", tacna_in_dmic_osr[1]),
@@ -732,35 +797,35 @@ SND_SOC_DAPM_PGA("Tone Generator 2", TACNA_TONE_GENERATOR1,
732797
TACNA_TONE2_EN_SHIFT, 0, NULL, 0),
733798

734799
SND_SOC_DAPM_PGA_E("IN1L PGA", TACNA_INPUT_CONTROL, TACNA_IN1L_EN_SHIFT,
735-
0, NULL, 0, tacna_in_ev,
800+
0, NULL, 0, clsic_in_ev,
736801
SND_SOC_DAPM_PRE_PMD |
737802
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
738803
SND_SOC_DAPM_PGA_E("IN1R PGA", TACNA_INPUT_CONTROL, TACNA_IN1R_EN_SHIFT,
739-
0, NULL, 0, tacna_in_ev,
804+
0, NULL, 0, clsic_in_ev,
740805
SND_SOC_DAPM_PRE_PMD |
741806
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
742807
SND_SOC_DAPM_PGA_E("IN2L PGA", TACNA_INPUT_CONTROL, TACNA_IN2L_EN_SHIFT,
743-
0, NULL, 0, tacna_in_ev,
808+
0, NULL, 0, clsic_in_ev,
744809
SND_SOC_DAPM_PRE_PMD |
745810
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
746811
SND_SOC_DAPM_PGA_E("IN2R PGA", TACNA_INPUT_CONTROL, TACNA_IN2R_EN_SHIFT,
747-
0, NULL, 0, tacna_in_ev,
812+
0, NULL, 0, clsic_in_ev,
748813
SND_SOC_DAPM_PRE_PMD |
749814
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
750815
SND_SOC_DAPM_PGA_E("IN3L PGA", TACNA_INPUT_CONTROL, TACNA_IN3L_EN_SHIFT,
751-
0, NULL, 0, tacna_in_ev,
816+
0, NULL, 0, clsic_in_ev,
752817
SND_SOC_DAPM_PRE_PMD |
753818
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
754819
SND_SOC_DAPM_PGA_E("IN3R PGA", TACNA_INPUT_CONTROL, TACNA_IN3R_EN_SHIFT,
755-
0, NULL, 0, tacna_in_ev,
820+
0, NULL, 0, clsic_in_ev,
756821
SND_SOC_DAPM_PRE_PMD |
757822
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
758823
SND_SOC_DAPM_PGA_E("IN4L PGA", TACNA_INPUT_CONTROL, TACNA_IN4L_EN_SHIFT,
759-
0, NULL, 0, tacna_in_ev,
824+
0, NULL, 0, clsic_in_ev,
760825
SND_SOC_DAPM_PRE_PMD |
761826
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
762827
SND_SOC_DAPM_PGA_E("IN4R PGA", TACNA_INPUT_CONTROL, TACNA_IN4R_EN_SHIFT,
763-
0, NULL, 0, tacna_in_ev,
828+
0, NULL, 0, clsic_in_ev,
764829
SND_SOC_DAPM_PRE_PMD |
765830
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
766831

0 commit comments

Comments
 (0)