Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Jack Yu and committed by
Mark Brown
2603ea46 558f5228

+36 -2
+23 -2
sound/soc/codecs/rt1320-sdw.c
··· 1013 1013 struct device *dev = &rt1320->sdw_slave->dev; 1014 1014 struct rt1320_datafixpoint r0_data[2]; 1015 1015 unsigned short l_advancegain, r_advancegain; 1016 + FwPara_Get_HwSwGain audDriverDataHwSwGain = {0}; 1017 + unsigned int HwAdvGain = 0; 1016 1018 int ret; 1019 + 1020 + /* Get new hardware advance gain by ID 1300 */ 1021 + ret = rt1320_fw_param_protocol(rt1320, RT1320_GET_PARAM, 1300, 1022 + &audDriverDataHwSwGain, sizeof(audDriverDataHwSwGain)); 1023 + if (ret == 0) { 1024 + HwAdvGain = audDriverDataHwSwGain.HwAdvGain; 1025 + dev_dbg(dev, "%s, HwAdvGain=%d\n", __func__, HwAdvGain); 1026 + dev_dbg(dev, "%s, HwBasGain=%d\n", __func__, audDriverDataHwSwGain.HwBasGain); 1027 + dev_dbg(dev, "%s, SwAdvGain=%d\n", __func__, audDriverDataHwSwGain.SwAdvGain); 1028 + dev_dbg(dev, "%s, SwBasGain=%d\n", __func__, audDriverDataHwSwGain.SwBasGain); 1029 + } else { 1030 + dev_dbg(dev, "%s: param 1300 not supported, ret=%d\n", __func__, ret); 1031 + } 1017 1032 1018 1033 /* Get advance gain/r0 */ 1019 1034 rt1320_fw_param_protocol(rt1320, RT1320_GET_PARAM, 6, &r0_data[0], sizeof(struct rt1320_datafixpoint)); 1020 1035 rt1320_fw_param_protocol(rt1320, RT1320_GET_PARAM, 7, &r0_data[1], sizeof(struct rt1320_datafixpoint)); 1021 - l_advancegain = r0_data[0].advancegain; 1022 - r_advancegain = r0_data[1].advancegain; 1036 + 1037 + if (HwAdvGain != 0) { 1038 + l_advancegain = HwAdvGain & 0xffff; 1039 + r_advancegain = (HwAdvGain >> 16) & 0xffff; 1040 + } else { 1041 + l_advancegain = r0_data[0].advancegain; 1042 + r_advancegain = r0_data[1].advancegain; 1043 + } 1023 1044 dev_dbg(dev, "%s, LR advanceGain=0x%x 0x%x\n", __func__, l_advancegain, r_advancegain); 1024 1045 1025 1046 /* set R0 and enable protection by SetParameter id 6, 7 */
+13
sound/soc/codecs/rt1320-sdw.h
··· 121 121 int invrs; 122 122 }; 123 123 124 + typedef struct FwPara_HwSwGain { 125 + unsigned int SwAdvGain; 126 + unsigned int SwBasGain; 127 + unsigned int HwAdvGain; 128 + unsigned int HwBasGain; 129 + unsigned int reserve0; 130 + unsigned int reserve1; 131 + unsigned int reserve2; 132 + unsigned int reserve3; 133 + unsigned int reserve4; 134 + unsigned int reserve5; 135 + } __attribute__((packed)) FwPara_Get_HwSwGain; 136 + 124 137 struct rt1320_paramcmd { 125 138 unsigned char moudleid; 126 139 unsigned char commandtype;