]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: rt5682: Support the ALC5682I-VE codec
authorDerek Fang <derek.fang@realtek.com>
Wed, 25 Dec 2024 09:43:07 +0000 (17:43 +0800)
committerMark Brown <broonie@kernel.org>
Tue, 7 Jan 2025 16:16:00 +0000 (16:16 +0000)
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: Derek Fang <derek.fang@realtek.com>
Link: https://patch.msgid.link/20241225094307.3678837-1-derek.fang@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5682-i2c.c
sound/soc/codecs/rt5682.c
sound/soc/codecs/rt5682.h

index ff9e14fad0cdaa388423b7c2d4af54f1745cf344..a8820435d1e027d805f401fd19d550b2f770ad12 100644 (file)
@@ -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);
 
index aa163ec4086223ea5296501265d572297bbec143..b4d72fc4a44d4363fd4e985342498497f4fa193e 100644 (file)
@@ -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,7 +3141,10 @@ 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);
-       regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x7005);
+       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);
        regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_2, 0x0321);
@@ -3168,7 +3173,10 @@ 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);
-       regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x2005);
+       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);
 
index b2d9e87af2595a91cdd2864e4a7c669724d87cea..de43a5d99403b926c21b2415af9022b42bf9ae8b 100644 (file)
@@ -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];