ASoC: rt5645: improve the depop sequences of CBJ detection
authorShuming Fan <shumingf@realtek.com>
Fri, 18 Aug 2023 02:37:32 +0000 (02:37 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 18 Aug 2023 12:55:05 +0000 (13:55 +0100)
This patch will improve the depop function of CBJ detection before the headphone playback
when the system resumes.
We also want to complete the CBJ detection in the system-level resume function.
It could avoid triggering the detection at the playing state of headphones.

Signed-off-by: Shuming Fan <shumingf@realtek.com>
Link: https://lore.kernel.org/r/20230818023732.2153170-1-shumingf@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5645.c

index e49aa28..038d93e 100644 (file)
@@ -80,6 +80,7 @@ static const struct reg_sequence init_list[] = {
 
 static const struct reg_sequence rt5650_init_list[] = {
        {0xf6,  0x0100},
+       {RT5645_PWR_ANLG1, 0x02},
 };
 
 static const struct reg_default rt5645_reg[] = {
@@ -1696,6 +1697,9 @@ static void hp_amp_power(struct snd_soc_component *component, int on)
                                regmap_write(rt5645->regmap, RT5645_PR_BASE +
                                        RT5645_MAMP_INT_REG2, 0xfc00);
                                snd_soc_component_write(component, RT5645_DEPOP_M2, 0x1140);
+                               snd_soc_component_update_bits(component, RT5645_PWR_ANLG1,
+                                       RT5645_PWR_HP_L | RT5645_PWR_HP_R,
+                                       RT5645_PWR_HP_L | RT5645_PWR_HP_R);
                                msleep(90);
                        } else {
                                /* depop parameters */
@@ -1743,7 +1747,8 @@ static void hp_amp_power(struct snd_soc_component *component, int on)
                                snd_soc_component_write(component, RT5645_DEPOP_M2, 0x1140);
                                msleep(100);
                                snd_soc_component_write(component, RT5645_DEPOP_M1, 0x0001);
-
+                               snd_soc_component_update_bits(component, RT5645_PWR_ANLG1,
+                                       RT5645_PWR_HP_L | RT5645_PWR_HP_R, 0);
                        } else {
                                snd_soc_component_update_bits(component, RT5645_DEPOP_M1,
                                        RT5645_HP_SG_MASK |
@@ -3150,7 +3155,7 @@ static int rt5645_jack_detect(struct snd_soc_component *component, int jack_inse
        unsigned int val;
 
        if (jack_insert) {
-               regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0e06);
+               regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0206);
 
                /* for jack type detect */
                snd_soc_dapm_force_enable_pin(dapm, "LDO2");
@@ -3195,6 +3200,8 @@ static int rt5645_jack_detect(struct snd_soc_component *component, int jack_inse
                if (rt5645->pdata.level_trigger_irq)
                        regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
                                RT5645_JD_1_1_MASK, RT5645_JD_1_1_NOR);
+
+               regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0e06);
        } else { /* jack out */
                rt5645->jack_type = 0;
 
@@ -4003,13 +4010,13 @@ static int rt5645_i2c_probe(struct i2c_client *i2c)
 
        regmap_write(rt5645->regmap, RT5645_AD_DA_MIXER, 0x8080);
 
-       ret = regmap_register_patch(rt5645->regmap, init_list,
+       ret = regmap_multi_reg_write(rt5645->regmap, init_list,
                                    ARRAY_SIZE(init_list));
        if (ret != 0)
                dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
 
        if (rt5645->codec_type == CODEC_TYPE_RT5650) {
-               ret = regmap_register_patch(rt5645->regmap, rt5650_init_list,
+               ret = regmap_multi_reg_write(rt5645->regmap, rt5650_init_list,
                                    ARRAY_SIZE(rt5650_init_list));
                if (ret != 0)
                        dev_warn(&i2c->dev, "Apply rt5650 patch failed: %d\n",
@@ -4220,8 +4227,7 @@ static int __maybe_unused rt5645_sys_resume(struct device *dev)
 
        if (rt5645->hp_jack) {
                rt5645->jack_type = 0;
-               queue_delayed_work(system_power_efficient_wq,
-                       &rt5645->jack_detect_work, msecs_to_jiffies(0));
+               rt5645_jack_detect_work(&rt5645->jack_detect_work.work);
        }
        return 0;
 }