@@ -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+
248313static const struct snd_kcontrol_new clsic_snd_controls [] = {
249314SOC_ENUM ("IN1 OSR" , tacna_in_dmic_osr [0 ]),
250315SOC_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
734799SND_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 ),
738803SND_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 ),
742807SND_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 ),
746811SND_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 ),
750815SND_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 ),
754819SND_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 ),
758823SND_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 ),
762827SND_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