ALSA: hda: cs35l41: Move boost config to initialization code
authorLucas Tanure <tanureal@opensource.cirrus.com>
Wed, 13 Apr 2022 08:37:22 +0000 (09:37 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 13 Apr 2022 08:42:34 +0000 (10:42 +0200)
Having CS35L41_PWR_CTRL2 on cs35l41_hda_config overwrites the boost
configuration for internal boost.
So move it to the initialization part and use regmap_update_bits to
only change the correct bits.

Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20220413083728.10730-11-tanureal@opensource.cirrus.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/cs35l41.h
sound/pci/hda/cs35l41_hda.c

index 64d98cbd5c0eb9e91b89a46890332c0e97fb0503..7d892c97b1e8456bbcbc4e77a18541e4ceac5926 100644 (file)
 #define CS35L41_GLOBAL_EN_SHIFT                0
 #define CS35L41_BST_EN_MASK            0x0030
 #define CS35L41_BST_EN_SHIFT           4
+#define CS35L41_BST_DIS_FET_OFF                0x00
 #define CS35L41_BST_EN_DEFAULT         0x2
 #define CS35L41_AMP_EN_SHIFT           0
 #define CS35L41_AMP_EN_MASK            1
index 0709d09f4e1364337417944c4da77a06815ffee5..6e82ab9517f0ebce773926044344e3a6386e74c7 100644 (file)
@@ -25,7 +25,6 @@ static const struct reg_sequence cs35l41_hda_config[] = {
        { CS35L41_DAC_PCM1_SRC,         0x00000008 }, // DACPCM1_SRC = ASPRX1
        { CS35L41_AMP_DIG_VOL_CTRL,     0x00000000 }, // AMP_VOL_PCM  0.0 dB
        { CS35L41_AMP_GAIN_CTRL,        0x00000084 }, // AMP_GAIN_PCM 4.5 dB
-       { CS35L41_PWR_CTRL2,            0x00000001 }, // AMP_EN = 1
 };
 
 static const struct reg_sequence cs35l41_hda_mute[] = {
@@ -34,7 +33,6 @@ static const struct reg_sequence cs35l41_hda_mute[] = {
 };
 
 static const struct reg_sequence cs35l41_hda_start_bst[] = {
-       { CS35L41_PWR_CTRL2,            0x00000021 }, // BST_EN = 10, AMP_EN = 1
        { CS35L41_PWR_CTRL1,            0x00000001, 3000}, // set GLOBAL_EN = 1
 };
 
@@ -94,7 +92,6 @@ static const struct reg_sequence cs35l41_active_to_safe[] = {
        { 0x00000040,                   0x00000055 },
        { 0x00000040,                   0x000000AA },
        { 0x00007438,                   0x00585941 },
-       { CS35L41_PWR_CTRL2,            0x00000000 }, // AMP_EN = 0
        { CS35L41_PWR_CTRL1,            0x00000000 },
        { 0x0000742C,                   0x00000009, 2000 },
        { 0x00007438,                   0x00580941 },
@@ -144,6 +141,8 @@ static void cs35l41_hda_playback_hook(struct device *dev, int action)
        case HDA_GEN_PCM_ACT_OPEN:
                ret = regmap_multi_reg_write(reg, cs35l41_hda_config,
                                             ARRAY_SIZE(cs35l41_hda_config));
+               regmap_update_bits(reg, CS35L41_PWR_CTRL2,
+                                  CS35L41_AMP_EN_MASK, 1 << CS35L41_AMP_EN_SHIFT);
                break;
        case HDA_GEN_PCM_ACT_PREPARE:
                if (reg_seq->prepare)
@@ -155,6 +154,8 @@ static void cs35l41_hda_playback_hook(struct device *dev, int action)
                        ret = regmap_multi_reg_write(reg, reg_seq->cleanup, reg_seq->num_cleanup);
                break;
        case HDA_GEN_PCM_ACT_CLOSE:
+               regmap_update_bits(reg, CS35L41_PWR_CTRL2,
+                                  CS35L41_AMP_EN_MASK, 0 << CS35L41_AMP_EN_SHIFT);
                if (reg_seq->close)
                        ret = regmap_multi_reg_write(reg, reg_seq->close, reg_seq->num_close);
                break;
@@ -232,8 +233,10 @@ static int cs35l41_hda_apply_properties(struct cs35l41_hda *cs35l41)
                        cs35l41->reg_seq = &cs35l41_hda_reg_seq_ext_bst;
                else
                        cs35l41->reg_seq = &cs35l41_hda_reg_seq_no_bst;
-               ret = regmap_multi_reg_write(cs35l41->regmap, cs35l41_reset_to_safe,
-                                            ARRAY_SIZE(cs35l41_reset_to_safe));
+               regmap_multi_reg_write(cs35l41->regmap, cs35l41_reset_to_safe,
+                                      ARRAY_SIZE(cs35l41_reset_to_safe));
+               ret = regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, CS35L41_BST_EN_MASK,
+                                         CS35L41_BST_DIS_FET_OFF << CS35L41_BST_EN_SHIFT);
                if (ret)
                        return ret;
                break;