ASoC: rt715: Add software reset in io init
authorJack Yu <jack.yu@realtek.com>
Thu, 10 Aug 2023 09:27:45 +0000 (09:27 +0000)
committerMark Brown <broonie@kernel.org>
Thu, 10 Aug 2023 14:44:40 +0000 (15:44 +0100)
Add software reset before setting preset registers to make sure
all the registers are the default value before preset.

Signed-off-by: Jack Yu <jack.yu@realtek.com>
Link: https://lore.kernel.org/r/4f405c7deb9642e1a8599c5f103b5759@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt715.c
sound/soc/codecs/rt715.h

index 79416bb..c95f481 100644 (file)
@@ -52,6 +52,60 @@ static int rt715_index_write(struct regmap *regmap, unsigned int reg,
        return ret;
 }
 
+static int rt715_index_write_nid(struct regmap *regmap,
+               unsigned int nid, unsigned int reg, unsigned int value)
+{
+       int ret;
+       unsigned int addr = ((RT715_PRIV_INDEX_W_H_2 | nid) << 8) | reg;
+
+       ret = regmap_write(regmap, addr, value);
+       if (ret < 0)
+               pr_err("Failed to set private value: %06x <= %04x ret=%d\n",
+                       addr, value, ret);
+
+       return ret;
+}
+
+static int rt715_index_read_nid(struct regmap *regmap,
+               unsigned int nid, unsigned int reg, unsigned int *value)
+{
+       int ret;
+       unsigned int addr = ((RT715_PRIV_INDEX_W_H_2 | nid) << 8) | reg;
+
+       *value = 0;
+       ret = regmap_read(regmap, addr, value);
+       if (ret < 0)
+               pr_err("Failed to get private value: %06x => %04x ret=%d\n",
+                       addr, *value, ret);
+
+       return ret;
+}
+
+static int rt715_index_update_bits(struct regmap *regmap, unsigned int nid,
+                       unsigned int reg, unsigned int mask, unsigned int val)
+{
+       unsigned int tmp, orig;
+       int ret;
+
+       ret = rt715_index_read_nid(regmap, nid, reg, &orig);
+       if (ret < 0)
+               return ret;
+
+       tmp = orig & ~mask;
+       tmp |= val & mask;
+
+       return rt715_index_write_nid(regmap, nid, reg, tmp);
+}
+
+static void rt715_reset(struct regmap *regmap)
+{
+       regmap_write(regmap, RT715_FUNC_RESET, 0);
+       rt715_index_update_bits(regmap, RT715_VENDOR_REGISTERS,
+               RT715_VD_CLEAR_CTRL, RT715_CLEAR_HIDDEN_REG,
+               RT715_CLEAR_HIDDEN_REG);
+}
+
+
 static void rt715_get_gain(struct rt715_priv *rt715, unsigned int addr_h,
                                unsigned int addr_l, unsigned int val_h,
                                unsigned int *r_val, unsigned int *l_val)
@@ -1040,6 +1094,8 @@ int rt715_io_init(struct device *dev, struct sdw_slave *slave)
 
        pm_runtime_get_noresume(&slave->dev);
 
+       rt715_reset(rt715->regmap);
+
        /* Mute nid=08h/09h */
        regmap_write(rt715->regmap, RT715_SET_GAIN_LINE_ADC_H, 0xb080);
        regmap_write(rt715->regmap, RT715_SET_GAIN_MIX_ADC_H, 0xb080);
index 12a0ae6..6e37bf6 100644 (file)
@@ -48,6 +48,7 @@ struct rt715_priv {
 #define RT715_INLINE_CMD                               0x55
 
 /* Index (NID:20h) */
+#define RT715_VD_CLEAR_CTRL                            0x01
 #define RT715_SDW_INPUT_SEL                            0x39
 #define RT715_EXT_DMIC_CLK_CTRL2                       0x54
 
@@ -71,6 +72,8 @@ struct rt715_priv {
 #define RT715_READ_HDA_0                               0x2015
 #define RT715_PRIV_INDEX_W_H                           0x7520
 #define RT715_PRIV_INDEX_W_L                           0x85a0
+#define RT715_PRIV_INDEX_W_H_2                         0x7500
+#define RT715_PRIV_INDEX_W_L_2                         0x8580
 #define RT715_PRIV_DATA_W_H                            0x7420
 #define RT715_PRIV_DATA_W_L                            0x84a0
 #define RT715_PRIV_INDEX_R_H                           0x9d20
@@ -198,6 +201,10 @@ struct rt715_priv {
 #define RT715_SET_DMIC4_CONFIG_DEFAULT4\
        (RT715_VERB_SET_CONFIG_DEFAULT4 | RT715_DMIC4)
 
+/* vendor register clear ctrl-1    (0x01)(NID:20h) */
+#define RT715_CLEAR_HIDDEN_REG (0x1 << 15)
+
+
 #define RT715_MUTE_SFT                                 7
 #define RT715_DIR_IN_SFT                               6
 #define RT715_DIR_OUT_SFT                              7