Skip to content

Commit 523d242

Browse files
Zhu Ningbroonie
authored andcommitted
ASoC: codecs: ES8326: improving crosstalk performance
We change the crosstalk parameter in es8326_resume function to improve crosstalk performance. Adding crosstalk kcontrol to enhance the flexibility of crosstalk debugging in machine. Adding ES8326_DAC_CROSSTALK macro to declare the crosstalk register. Signed-off-by: Zhu Ning <zhuning0077@gmail.com> Link: https://msgid.link/r/20240120101240.12496-2-zhuning0077@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 6613476 commit 523d242

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

sound/soc/codecs/es8326.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
48124
static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(dac_vol_tlv, -9550, 50, 0);
49125
static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(adc_vol_tlv, -9550, 50, 0);
50126
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[] = {
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

107187
static 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 */

sound/soc/codecs/es8326.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
#define ES8326_DAC_VOL 0x50
7373
#define ES8326_DRC_RECOVERY 0x53
7474
#define ES8326_DRC_WINSIZE 0x54
75+
#define ES8326_DAC_CROSSTALK 0x55
7576
#define ES8326_HPJACK_TIMER 0x56
7677
#define ES8326_HPDET_TYPE 0x57
7778
#define ES8326_INT_SOURCE 0x58

0 commit comments

Comments
 (0)