]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ASoC: rt5645: fix issue of random interrupt from push-button
authorJack Yu <jack.yu@realtek.com>
Wed, 26 Jun 2024 08:25:34 +0000 (08:25 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 26 Jun 2024 15:34:48 +0000 (16:34 +0100)
Modify register setting sequence of enabling inline command
to fix issue of random interrupt from push-button.

Signed-off-by: Jack Yu <jack.yu@realtek.com>
Link: https://patch.msgid.link/9a7a3a66cbcb426487ca6f558f45e922@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5645.c
sound/soc/codecs/rt5645.h

index cdb7ff7020e931ceb8e29aa6baf7e515db62ae4b..51187b1e0ed2f70fec9ed0907779d2e2bd859620 100644 (file)
@@ -81,7 +81,7 @@ static const struct reg_sequence init_list[] = {
 static const struct reg_sequence rt5650_init_list[] = {
        {0xf6,  0x0100},
        {RT5645_PWR_ANLG1, 0x02},
-       {RT5645_IL_CMD3, 0x0018},
+       {RT5645_IL_CMD3, 0x6728},
 };
 
 static const struct reg_default rt5645_reg[] = {
@@ -3130,20 +3130,32 @@ static void rt5645_enable_push_button_irq(struct snd_soc_component *component,
        bool enable)
 {
        struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
+       int ret;
 
        if (enable) {
                snd_soc_dapm_force_enable_pin(dapm, "ADC L power");
                snd_soc_dapm_force_enable_pin(dapm, "ADC R power");
                snd_soc_dapm_sync(dapm);
 
+               snd_soc_component_update_bits(component, RT5650_4BTN_IL_CMD2,
+                       RT5645_EN_4BTN_IL_MASK | RT5645_RST_4BTN_IL_MASK,
+                       RT5645_EN_4BTN_IL_EN | RT5645_RST_4BTN_IL_RST);
+               usleep_range(10000, 15000);
+               snd_soc_component_update_bits(component, RT5650_4BTN_IL_CMD2,
+                       RT5645_EN_4BTN_IL_MASK | RT5645_RST_4BTN_IL_MASK,
+                       RT5645_EN_4BTN_IL_EN | RT5645_RST_4BTN_IL_NORM);
+               msleep(50);
+               ret = snd_soc_component_read(component, RT5645_INT_IRQ_ST);
+               pr_debug("%s read %x = %x\n", __func__, RT5645_INT_IRQ_ST,
+                       snd_soc_component_read(component, RT5645_INT_IRQ_ST));
+               snd_soc_component_write(component, RT5645_INT_IRQ_ST, ret);
+               ret = snd_soc_component_read(component, RT5650_4BTN_IL_CMD1);
+               pr_debug("%s read %x = %x\n", __func__, RT5650_4BTN_IL_CMD1,
+                       snd_soc_component_read(component, RT5650_4BTN_IL_CMD1));
+               snd_soc_component_write(component, RT5650_4BTN_IL_CMD1, ret);
                snd_soc_component_update_bits(component, RT5650_4BTN_IL_CMD1, 0x3, 0x3);
                snd_soc_component_update_bits(component,
                                        RT5645_INT_IRQ_ST, 0x8, 0x8);
-               snd_soc_component_update_bits(component,
-                                       RT5650_4BTN_IL_CMD2, 0x8000, 0x8000);
-               snd_soc_component_read(component, RT5650_4BTN_IL_CMD1);
-               pr_debug("%s read %x = %x\n", __func__, RT5650_4BTN_IL_CMD1,
-                       snd_soc_component_read(component, RT5650_4BTN_IL_CMD1));
        } else {
                snd_soc_component_update_bits(component, RT5650_4BTN_IL_CMD2, 0x8000, 0x0);
                snd_soc_component_update_bits(component, RT5645_INT_IRQ_ST, 0x8, 0x0);
index 90816b2c5489fa8141113d171a7eae9310606dfc..bef74b29fd541b5478c44034c2dd6df30a82c2ff 100644 (file)
 #define RT5645_ZCD_HP_DIS                      (0x0 << 15)
 #define RT5645_ZCD_HP_EN                       (0x1 << 15)
 
+/* Buttons Inline Command Function 2 (0xe0) */
+#define RT5645_EN_4BTN_IL_MASK                 (0x1 << 15)
+#define RT5645_EN_4BTN_IL_EN                   (0x1 << 15)
+#define RT5645_RST_4BTN_IL_MASK                        (0x1 << 14)
+#define RT5645_RST_4BTN_IL_RST                 (0x0 << 14)
+#define RT5645_RST_4BTN_IL_NORM                        (0x1 << 14)
 
 /* Codec Private Register definition */
 /* DAC ADC Digital Volume (0x00) */