]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: rt1320-sdw: Add an approach to get new hardware advance gain
authorJack Yu <jack.yu@realtek.com>
Fri, 10 Apr 2026 06:42:25 +0000 (14:42 +0800)
committerMark Brown <broonie@kernel.org>
Fri, 10 Apr 2026 11:41:03 +0000 (12:41 +0100)
Add an approach to get new hardware advance gain,
and if there is no advance gain with this approach,
we can still get advance gain with original method.

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

index 168d2f39172356db25ca45a33321a6e358e10aab..b0aeeab26bd99b5bf82f475d95ab15bdacbcf6c4 100644 (file)
@@ -1013,13 +1013,34 @@ static void rt1320_set_advancemode(struct rt1320_sdw_priv *rt1320)
        struct device *dev = &rt1320->sdw_slave->dev;
        struct rt1320_datafixpoint r0_data[2];
        unsigned short l_advancegain, r_advancegain;
+       FwPara_Get_HwSwGain audDriverDataHwSwGain = {0};
+       unsigned int HwAdvGain = 0;
        int ret;
 
+        /* Get new hardware advance gain by ID 1300 */
+       ret = rt1320_fw_param_protocol(rt1320, RT1320_GET_PARAM, 1300,
+               &audDriverDataHwSwGain, sizeof(audDriverDataHwSwGain));
+       if (ret == 0) {
+               HwAdvGain = audDriverDataHwSwGain.HwAdvGain;
+               dev_dbg(dev, "%s, HwAdvGain=%d\n", __func__, HwAdvGain);
+               dev_dbg(dev, "%s, HwBasGain=%d\n", __func__, audDriverDataHwSwGain.HwBasGain);
+               dev_dbg(dev, "%s, SwAdvGain=%d\n", __func__, audDriverDataHwSwGain.SwAdvGain);
+               dev_dbg(dev, "%s, SwBasGain=%d\n", __func__, audDriverDataHwSwGain.SwBasGain);
+       } else {
+               dev_dbg(dev, "%s: param 1300 not supported, ret=%d\n", __func__, ret);
+       }
+
        /* Get advance gain/r0 */
        rt1320_fw_param_protocol(rt1320, RT1320_GET_PARAM, 6, &r0_data[0], sizeof(struct rt1320_datafixpoint));
        rt1320_fw_param_protocol(rt1320, RT1320_GET_PARAM, 7, &r0_data[1], sizeof(struct rt1320_datafixpoint));
-       l_advancegain = r0_data[0].advancegain;
-       r_advancegain = r0_data[1].advancegain;
+
+       if (HwAdvGain != 0) {
+               l_advancegain = HwAdvGain & 0xffff;
+               r_advancegain = (HwAdvGain >> 16) & 0xffff;
+       } else {
+               l_advancegain = r0_data[0].advancegain;
+               r_advancegain = r0_data[1].advancegain;
+       }
        dev_dbg(dev, "%s, LR advanceGain=0x%x 0x%x\n", __func__, l_advancegain, r_advancegain);
 
        /* set R0 and enable protection by SetParameter id 6, 7 */
index 4a1d3fc4c8eecdf018e8ab3fb4d40ff40f252091..a7b573883dd04f8a80b25f334c58c545b07f688b 100644 (file)
@@ -121,6 +121,19 @@ struct rt1320_datafixpoint {
        int invrs;
 };
 
+typedef struct FwPara_HwSwGain {
+       unsigned int SwAdvGain;
+       unsigned int SwBasGain;
+       unsigned int HwAdvGain;
+       unsigned int HwBasGain;
+       unsigned int reserve0;
+       unsigned int reserve1;
+       unsigned int reserve2;
+       unsigned int reserve3;
+       unsigned int reserve4;
+       unsigned int reserve5;
+} __attribute__((packed)) FwPara_Get_HwSwGain;
+
 struct rt1320_paramcmd {
        unsigned char moudleid;
        unsigned char commandtype;