Unverified Commit 5d085b25 authored by Derek Fang's avatar Derek Fang Committed by Mark Brown
Browse files

ASoC: rt5682: Support the ALC5682I-VE codec



The ALC5682I-VD and ALC5682I-VE use the same I2C
codec driver with different calibration settings.
This patch aims to handle their differences.

Signed-off-by: default avatarDerek Fang <derek.fang@realtek.com>

Link: https://patch.msgid.link/20241225094307.3678837-1-derek.fang@realtek.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent fffe003f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -186,6 +186,12 @@ static int rt5682_i2c_probe(struct i2c_client *i2c)
		return -ENODEV;
	}

	regmap_read(rt5682->regmap, RT5682_INT_DEVICE_ID, &val);
	if (val == 0x6956) {
		dev_dbg(&i2c->dev, "ALC5682I-VE device\n");
		rt5682->ve_ic = true;
	}

	mutex_init(&rt5682->calibrate_mutex);
	rt5682_calibrate(rt5682);

+10 −2
Original line number Diff line number Diff line
@@ -395,6 +395,7 @@ bool rt5682_volatile_register(struct device *dev, unsigned int reg)
	case RT5682_4BTN_IL_CMD_1:
	case RT5682_AJD1_CTRL:
	case RT5682_HP_CALIB_CTRL_1:
	case RT5682_INT_DEVICE_ID:
	case RT5682_DEVICE_ID:
	case RT5682_I2C_MODE:
	case RT5682_HP_CALIB_CTRL_10:
@@ -419,6 +420,7 @@ bool rt5682_readable_register(struct device *dev, unsigned int reg)
{
	switch (reg) {
	case RT5682_RESET:
	case RT5682_INT_DEVICE_ID:
	case RT5682_VERSION_ID:
	case RT5682_VENDOR_ID:
	case RT5682_DEVICE_ID:
@@ -3139,6 +3141,9 @@ void rt5682_calibrate(struct rt5682_priv *rt5682)
	regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0100);
	regmap_write(rt5682->regmap, RT5682_HP_IMP_SENS_CTRL_19, 0x3800);
	regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x3000);
	if (rt5682->ve_ic)
		regmap_write(rt5682->regmap, RT5682_CHOP_ADC, 0x7005);
	else
		regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x7005);
	regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0x686c);
	regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0d0d);
@@ -3168,6 +3173,9 @@ void rt5682_calibrate(struct rt5682_priv *rt5682)
	regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x0000);
	regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0000);
	regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x2000);
	if (rt5682->ve_ic)
		regmap_write(rt5682->regmap, RT5682_CHOP_ADC, 0x2005);
	else
		regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x2005);
	regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0xc0c4);
	regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0c0c);
+2 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@

/* Info */
#define RT5682_RESET				0x0000
#define RT5682_INT_DEVICE_ID			0x00f9
#define RT5682_VERSION_ID			0x00fd
#define RT5682_VENDOR_ID			0x00fe
#define RT5682_DEVICE_ID			0x00ff
@@ -1446,6 +1447,7 @@ struct rt5682_priv {
	bool hw_init;
	bool first_hw_init;
	bool is_sdw;
	bool ve_ic;

#ifdef CONFIG_COMMON_CLK
	struct clk_hw dai_clks_hw[RT5682_DAI_NUM_CLKS];