@@ -45,6 +45,82 @@ struct es8326_priv {
45
45
int jack_remove_retry ;
46
46
};
47
47
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
+
48
124
static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE (dac_vol_tlv , -9550 , 50 , 0 ) ;
49
125
static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE (adc_vol_tlv , -9550 , 50 , 0 ) ;
50
126
static 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[] = {
102
178
SOC_SINGLE_TLV ("ALC Capture Target Level" , ES8326_ALC_LEVEL ,
103
179
0 , 0x0f , 0 , drc_target_tlv ),
104
180
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 ),
105
185
};
106
186
107
187
static const struct snd_soc_dapm_widget es8326_dapm_widgets [] = {
@@ -844,6 +924,8 @@ static int es8326_resume(struct snd_soc_component *component)
844
924
regmap_write (es8326 -> regmap , ES8326_CLK_CAL_TIME , 0x00 );
845
925
/* calibrate for B version */
846
926
es8326_calibrate (component );
927
+ regmap_write (es8326 -> regmap , ES8326_DAC_CROSSTALK , 0xaa );
928
+ regmap_write (es8326 -> regmap , ES8326_DAC_RAMPRATE , 0x00 );
847
929
/* turn off headphone out */
848
930
regmap_write (es8326 -> regmap , ES8326_HP_CAL , 0x00 );
849
931
/* set ADC and DAC in low power mode */
0 commit comments