ALSA: hda/tas2781: Fix calibration data parser issue
authorBaojun Xu <baojun.xu@ti.com>
Mon, 7 Jul 2025 09:05:13 +0000 (17:05 +0800)
committerTakashi Iwai <tiwai@suse.de>
Mon, 7 Jul 2025 09:23:28 +0000 (11:23 +0200)
We will copy calibration data from position behind to front.
We have created a variable (tmp_val) point on top of calibration data
buffer, and tmp_val[1] is max of node number in original calibration
data structure, it will be overwritten after first data copy,
so can't be used as max node number check in for loop.
So we create a new variable to save max of node number (tmp_val[1]),
used to check if max node number was reached in for loop.
And a point need to be increased to point at calibration data in node.
Data saved position also need to be increased one byte.

Fixes: 4fe238513407 ("ALSA: hda/tas2781: Move and unified the calibrated-data getting function for SPI and I2C into the tas2781_hda lib")
Signed-off-by: Baojun Xu <baojun.xu@ti.com>
Link: https://patch.msgid.link/20250707090513.1462-1-baojun.xu@ti.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/tas2781_hda.c

index 5f1d4b3e96885d41b105c98fd216e0a6244c2a0e..34217ce9f28e86988b7b5a8ca4c3749cd0ec80be 100644 (file)
@@ -44,7 +44,7 @@ static void tas2781_apply_calib(struct tasdevice_priv *p)
                TASDEVICE_REG(0, 0x13, 0x70),
                TASDEVICE_REG(0, 0x18, 0x7c),
        };
-       unsigned int crc, oft;
+       unsigned int crc, oft, node_num;
        unsigned char *buf;
        int i, j, k, l;
 
@@ -80,8 +80,9 @@ static void tas2781_apply_calib(struct tasdevice_priv *p)
                        dev_err(p->dev, "%s: CRC error\n", __func__);
                        return;
                }
+               node_num = tmp_val[1];
 
-               for (j = 0, k = 0; j < tmp_val[1]; j++) {
+               for (j = 0, k = 0; j < node_num; j++) {
                        oft = j * 6 + 3;
                        if (tmp_val[oft] == TASDEV_UEFI_CALI_REG_ADDR_FLG) {
                                for (i = 0; i < TASDEV_CALIB_N; i++) {
@@ -99,8 +100,9 @@ static void tas2781_apply_calib(struct tasdevice_priv *p)
                                }
 
                                data[l] = k;
+                               oft++;
                                for (i = 0; i < TASDEV_CALIB_N * 4; i++)
-                                       data[l + i] = data[4 * oft + i];
+                                       data[l + i + 1] = data[4 * oft + i];
                                k++;
                        }
                }