mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
ASoC: codecs: ES8326: Changing initialisation and broadcasting
New chip versions require new initialisation and playback processes. Changing the initialisation and playback process for better results. The old chip versions are going to work well with the new sequences. We've tested this with version_v0 and version_v3 chips under the new sequence and they both pass. Signed-off-by: Zhu Ning <zhuning0077@gmail.com> Link: https://lore.kernel.org/r/20231101072702.91316-3-zhuning0077@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
ee09084fbf
commit
fc702b2c04
@ -132,6 +132,11 @@ static const struct snd_soc_dapm_widget es8326_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_PGA("LHPMIX", ES8326_DAC2HPMIX, 7, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("RHPMIX", ES8326_DAC2HPMIX, 3, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_REG(snd_soc_dapm_supply, "HPOR Supply", ES8326_HP_CAL,
|
||||
4, 7, 0, 0),
|
||||
SND_SOC_DAPM_REG(snd_soc_dapm_supply, "HPOL Supply", ES8326_HP_CAL,
|
||||
0, 7, 0, 0),
|
||||
|
||||
SND_SOC_DAPM_OUTPUT("HPOL"),
|
||||
SND_SOC_DAPM_OUTPUT("HPOR"),
|
||||
};
|
||||
@ -156,6 +161,9 @@ static const struct snd_soc_dapm_route es8326_dapm_routes[] = {
|
||||
{"LHPMIX", NULL, "Left DAC"},
|
||||
{"RHPMIX", NULL, "Right DAC"},
|
||||
|
||||
{"HPOR", NULL, "HPOR Supply"},
|
||||
{"HPOL", NULL, "HPOL Supply"},
|
||||
|
||||
{"HPOL", NULL, "LHPMIX"},
|
||||
{"HPOR", NULL, "RHPMIX"},
|
||||
};
|
||||
@ -307,7 +315,6 @@ static inline int get_coeff(int mclk, int rate, int array,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
static int es8326_set_dai_sysclk(struct snd_soc_dai *codec_dai,
|
||||
int clk_id, unsigned int freq, int dir)
|
||||
{
|
||||
@ -449,8 +456,8 @@ static int es8326_mute(struct snd_soc_dai *dai, int mute, int direction)
|
||||
regmap_write(es8326->regmap, ES8326_HPR_OFFSET_INI, offset_r);
|
||||
es8326->calibrated = true;
|
||||
}
|
||||
regmap_write(es8326->regmap, ES8326_HP_DRIVER, 0xa0);
|
||||
regmap_write(es8326->regmap, ES8326_HP_VOL, 0x80);
|
||||
regmap_write(es8326->regmap, ES8326_HP_DRIVER, 0xa1);
|
||||
regmap_write(es8326->regmap, ES8326_HP_VOL, 0x91);
|
||||
regmap_write(es8326->regmap, ES8326_HP_CAL, ES8326_HP_ON);
|
||||
regmap_update_bits(es8326->regmap, ES8326_DAC_MUTE,
|
||||
ES8326_MUTE_MASK, ~(ES8326_MUTE));
|
||||
@ -470,8 +477,6 @@ static int es8326_set_bias_level(struct snd_soc_component *codec,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
regmap_write(es8326->regmap, ES8326_RESET, 0x9f);
|
||||
msleep(20);
|
||||
regmap_update_bits(es8326->regmap, ES8326_DAC_DSM, 0x01, 0x00);
|
||||
regmap_write(es8326->regmap, ES8326_INTOUT_IO, es8326->interrupt_clk);
|
||||
regmap_write(es8326->regmap, ES8326_SDINOUT1_IO,
|
||||
@ -480,19 +485,21 @@ static int es8326_set_bias_level(struct snd_soc_component *codec,
|
||||
regmap_write(es8326->regmap, ES8326_PGA_PDN, 0x40);
|
||||
regmap_write(es8326->regmap, ES8326_ANA_PDN, 0x00);
|
||||
regmap_update_bits(es8326->regmap, ES8326_CLK_CTL, 0x20, 0x20);
|
||||
regmap_write(es8326->regmap, ES8326_RESET, ES8326_CSM_ON);
|
||||
|
||||
regmap_update_bits(es8326->regmap, ES8326_RESET,
|
||||
ES8326_CSM_ON, ES8326_CSM_ON);
|
||||
break;
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
break;
|
||||
case SND_SOC_BIAS_STANDBY:
|
||||
break;
|
||||
case SND_SOC_BIAS_OFF:
|
||||
clk_disable_unprepare(es8326->mclk);
|
||||
regmap_write(es8326->regmap, ES8326_ANA_PDN, 0x3b);
|
||||
regmap_write(es8326->regmap, ES8326_VMIDSEL, 0x00);
|
||||
regmap_update_bits(es8326->regmap, ES8326_CLK_CTL, 0x20, 0x00);
|
||||
regmap_write(es8326->regmap, ES8326_SDINOUT1_IO, ES8326_IO_INPUT);
|
||||
break;
|
||||
case SND_SOC_BIAS_OFF:
|
||||
clk_disable_unprepare(es8326->mclk);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -762,13 +769,15 @@ static int es8326_calibrate(struct snd_soc_component *component)
|
||||
regmap_write(es8326->regmap, ES8326_CLK_DIV1, 0x01);
|
||||
regmap_write(es8326->regmap, ES8326_CLK_DLL, 0x30);
|
||||
regmap_write(es8326->regmap, ES8326_CLK_MUX, 0xed);
|
||||
regmap_write(es8326->regmap, ES8326_CLK_DAC_SEL, 0x08);
|
||||
regmap_write(es8326->regmap, ES8326_CLK_TRI, 0xc1);
|
||||
regmap_write(es8326->regmap, ES8326_DAC_MUTE, 0x03);
|
||||
regmap_write(es8326->regmap, ES8326_ANA_VSEL, 0x7f);
|
||||
regmap_write(es8326->regmap, ES8326_VMIDLOW, 0x33);
|
||||
regmap_write(es8326->regmap, ES8326_VMIDLOW, 0x03);
|
||||
regmap_write(es8326->regmap, ES8326_DAC2HPMIX, 0x88);
|
||||
regmap_write(es8326->regmap, ES8326_HP_VOL, 0x80);
|
||||
usleep_range(15000, 20000);
|
||||
regmap_write(es8326->regmap, ES8326_HP_OFFSET_CAL, 0x8c);
|
||||
usleep_range(15000, 20000);
|
||||
regmap_write(es8326->regmap, ES8326_RESET, 0xc0);
|
||||
usleep_range(15000, 20000);
|
||||
|
||||
@ -806,27 +815,27 @@ static int es8326_resume(struct snd_soc_component *component)
|
||||
regmap_write(es8326->regmap, ES8326_RESET, 0x1f);
|
||||
regmap_write(es8326->regmap, ES8326_VMIDSEL, 0x0E);
|
||||
usleep_range(10000, 15000);
|
||||
regmap_write(es8326->regmap, ES8326_HPJACK_TIMER, 0x88);
|
||||
regmap_write(es8326->regmap, ES8326_HPJACK_TIMER, 0xe9);
|
||||
regmap_write(es8326->regmap, ES8326_ANA_MICBIAS, 0x4b);
|
||||
/* set headphone default type and detect pin */
|
||||
regmap_write(es8326->regmap, ES8326_HPDET_TYPE, 0x81);
|
||||
regmap_write(es8326->regmap, ES8326_HPDET_TYPE, 0x83);
|
||||
regmap_write(es8326->regmap, ES8326_CLK_RESAMPLE, 0x05);
|
||||
regmap_write(es8326->regmap, ES8326_HP_MISC, 0x30);
|
||||
|
||||
/* set internal oscillator as clock source of headpone cp */
|
||||
regmap_write(es8326->regmap, ES8326_CLK_DIV_CPC, 0x84);
|
||||
regmap_write(es8326->regmap, ES8326_CLK_DIV_CPC, 0x89);
|
||||
regmap_write(es8326->regmap, ES8326_CLK_CTL, ES8326_CLK_ON);
|
||||
/* clock manager reset release */
|
||||
regmap_write(es8326->regmap, ES8326_RESET, 0x17);
|
||||
/* set headphone detection as half scan mode */
|
||||
regmap_write(es8326->regmap, ES8326_HP_MISC, 0x08);
|
||||
regmap_write(es8326->regmap, ES8326_HP_MISC, 0x30);
|
||||
regmap_write(es8326->regmap, ES8326_PULLUP_CTL, 0x00);
|
||||
|
||||
/* enable headphone driver */
|
||||
regmap_write(es8326->regmap, ES8326_HP_DRIVER, 0xa7);
|
||||
usleep_range(2000, 5000);
|
||||
regmap_write(es8326->regmap, ES8326_HP_DRIVER_REF, 0xab);
|
||||
usleep_range(2000, 5000);
|
||||
regmap_write(es8326->regmap, ES8326_HP_DRIVER_REF, 0xbb);
|
||||
usleep_range(2000, 5000);
|
||||
regmap_write(es8326->regmap, ES8326_HP_DRIVER_REF, 0xa3);
|
||||
regmap_write(es8326->regmap, ES8326_HP_DRIVER_REF, 0xb3);
|
||||
regmap_write(es8326->regmap, ES8326_HP_DRIVER, 0xa1);
|
||||
|
||||
regmap_write(es8326->regmap, ES8326_CLK_INV, 0x00);
|
||||
@ -840,9 +849,6 @@ static int es8326_resume(struct snd_soc_component *component)
|
||||
/* set ADC and DAC in low power mode */
|
||||
regmap_write(es8326->regmap, ES8326_ANA_LP, 0xf0);
|
||||
|
||||
/* force micbias on */
|
||||
regmap_write(es8326->regmap, ES8326_ANA_MICBIAS, 0x4f);
|
||||
regmap_write(es8326->regmap, ES8326_SYS_BIAS, 0x08);
|
||||
regmap_write(es8326->regmap, ES8326_ANA_VSEL, 0x7F);
|
||||
/* select vdda as micbias source */
|
||||
regmap_write(es8326->regmap, ES8326_VMIDLOW, 0x23);
|
||||
@ -870,6 +876,7 @@ static int es8326_resume(struct snd_soc_component *component)
|
||||
((es8326->version == ES8326_VERSION_B) ?
|
||||
(ES8326_HP_DET_SRC_PIN9 | es8326->jack_pol) :
|
||||
(ES8326_HP_DET_SRC_PIN9 | es8326->jack_pol | 0x04)));
|
||||
regmap_write(es8326->regmap, ES8326_HP_VOL, 0x11);
|
||||
|
||||
es8326->jack_remove_retry = 0;
|
||||
es8326->hp = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user