ASoC: rt1320-sdw: Add an approach to get new hardware advance gain

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>
This commit is contained in:
Jack Yu
2026-04-10 14:42:25 +08:00
committed by Mark Brown
parent 558f5228e1
commit 2603ea46ce
2 changed files with 36 additions and 2 deletions
+23 -2
View 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 */
+13
View 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;