@@ -45,6 +45,82 @@ struct es8326_priv {
4545 int jack_remove_retry ;
4646};
4747
48+ static int es8326_crosstalk1_get (struct snd_kcontrol * kcontrol ,
49+ struct snd_ctl_elem_value * ucontrol )
50+ {
51+ struct snd_soc_component * component = snd_kcontrol_chip (kcontrol );
52+ struct es8326_priv * es8326 = snd_soc_component_get_drvdata (component );
53+ unsigned int crosstalk_h , crosstalk_l ;
54+ unsigned int crosstalk ;
55+
56+ regmap_read (es8326 -> regmap , ES8326_DAC_RAMPRATE , & crosstalk_h );
57+ regmap_read (es8326 -> regmap , ES8326_DAC_CROSSTALK , & crosstalk_l );
58+ crosstalk_h &= 0x20 ;
59+ crosstalk_l &= 0xf0 ;
60+ crosstalk = crosstalk_h >> 1 | crosstalk_l >> 4 ;
61+ ucontrol -> value .integer .value [0 ] = crosstalk ;
62+
63+ return 0 ;
64+ }
65+
66+ static int es8326_crosstalk1_set (struct snd_kcontrol * kcontrol ,
67+ struct snd_ctl_elem_value * ucontrol )
68+ {
69+ struct snd_soc_component * component = snd_kcontrol_chip (kcontrol );
70+ struct es8326_priv * es8326 = snd_soc_component_get_drvdata (component );
71+ unsigned int crosstalk_h , crosstalk_l ;
72+ unsigned int crosstalk ;
73+
74+ crosstalk = ucontrol -> value .integer .value [0 ];
75+ regmap_read (es8326 -> regmap , ES8326_DAC_CROSSTALK , & crosstalk_l );
76+ crosstalk_h = (crosstalk & 0x10 ) << 1 ;
77+ crosstalk_l &= 0x0f ;
78+ crosstalk_l |= (crosstalk & 0x0f ) << 4 ;
79+ regmap_update_bits (es8326 -> regmap , ES8326_DAC_RAMPRATE ,
80+ 0x20 , crosstalk_h );
81+ regmap_write (es8326 -> regmap , ES8326_DAC_CROSSTALK , crosstalk_l );
82+
83+ return 0 ;
84+ }
85+
86+ static int es8326_crosstalk2_get (struct snd_kcontrol * kcontrol ,
87+ struct snd_ctl_elem_value * ucontrol )
88+ {
89+ struct snd_soc_component * component = snd_kcontrol_chip (kcontrol );
90+ struct es8326_priv * es8326 = snd_soc_component_get_drvdata (component );
91+ unsigned int crosstalk_h , crosstalk_l ;
92+ unsigned int crosstalk ;
93+
94+ regmap_read (es8326 -> regmap , ES8326_DAC_RAMPRATE , & crosstalk_h );
95+ regmap_read (es8326 -> regmap , ES8326_DAC_CROSSTALK , & crosstalk_l );
96+ crosstalk_h &= 0x10 ;
97+ crosstalk_l &= 0x0f ;
98+ crosstalk = crosstalk_h | crosstalk_l ;
99+ ucontrol -> value .integer .value [0 ] = crosstalk ;
100+
101+ return 0 ;
102+ }
103+
104+ static int es8326_crosstalk2_set (struct snd_kcontrol * kcontrol ,
105+ struct snd_ctl_elem_value * ucontrol )
106+ {
107+ struct snd_soc_component * component = snd_kcontrol_chip (kcontrol );
108+ struct es8326_priv * es8326 = snd_soc_component_get_drvdata (component );
109+ unsigned int crosstalk_h , crosstalk_l ;
110+ unsigned int crosstalk ;
111+
112+ crosstalk = ucontrol -> value .integer .value [0 ];
113+ regmap_read (es8326 -> regmap , ES8326_DAC_CROSSTALK , & crosstalk_l );
114+ crosstalk_h = crosstalk & 0x10 ;
115+ crosstalk_l &= 0xf0 ;
116+ crosstalk_l |= crosstalk & 0x0f ;
117+ regmap_update_bits (es8326 -> regmap , ES8326_DAC_RAMPRATE ,
118+ 0x10 , crosstalk_h );
119+ regmap_write (es8326 -> regmap , ES8326_DAC_CROSSTALK , crosstalk_l );
120+
121+ return 0 ;
122+ }
123+
48124static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE (dac_vol_tlv , -9550 , 50 , 0 ) ;
49125static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE (adc_vol_tlv , -9550 , 50 , 0 ) ;
50126static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE (adc_analog_pga_tlv , 0 , 300 , 0 ) ;
@@ -102,6 +178,10 @@ static const struct snd_kcontrol_new es8326_snd_controls[] = {
102178 SOC_SINGLE_TLV ("ALC Capture Target Level" , ES8326_ALC_LEVEL ,
103179 0 , 0x0f , 0 , drc_target_tlv ),
104180
181+ SOC_SINGLE_EXT ("CROSSTALK1" , SND_SOC_NOPM , 0 , 31 , 0 ,
182+ es8326_crosstalk1_get , es8326_crosstalk1_set ),
183+ SOC_SINGLE_EXT ("CROSSTALK2" , SND_SOC_NOPM , 0 , 31 , 0 ,
184+ es8326_crosstalk2_get , es8326_crosstalk2_set ),
105185};
106186
107187static const struct snd_soc_dapm_widget es8326_dapm_widgets [] = {
@@ -844,6 +924,8 @@ static int es8326_resume(struct snd_soc_component *component)
844924 regmap_write (es8326 -> regmap , ES8326_CLK_CAL_TIME , 0x00 );
845925 /* calibrate for B version */
846926 es8326_calibrate (component );
927+ regmap_write (es8326 -> regmap , ES8326_DAC_CROSSTALK , 0xaa );
928+ regmap_write (es8326 -> regmap , ES8326_DAC_RAMPRATE , 0x00 );
847929 /* turn off headphone out */
848930 regmap_write (es8326 -> regmap , ES8326_HP_CAL , 0x00 );
849931 /* set ADC and DAC in low power mode */
0 commit comments