* [PATCH v2 1/2] ALSA: hda/tas2781: Assign total_sz at the end of the function
2026-10-13 13:02 [PATCH v2 0/2] ALSA: hda/tas2781: Skip invalid TAS2563 UEFI calibration data Gergo Koteles
@ 2026-10-13 13:02 ` Gergo Koteles
2026-10-13 13:02 ` [PATCH v2 2/2] ALSA: hda/tas2781: Skip invalid TAS2563 UEFI calibration data Gergo Koteles
2026-10-13 21:09 ` [PATCH v2 0/2] " Philipp Oster
2 siblings, 0 replies; 4+ messages in thread
From: Gergo Koteles @ 2026-10-13 13:02 UTC (permalink / raw)
To: Shenghao Ding, Kevin Lu, Baojun Xu, Sen Wang, Jaroslav Kysela,
Takashi Iwai, Philipp Oster, Georg Wenzel
Cc: linux-sound, linux-kernel, alsa-devel, Gergo Koteles, stable
In the tas2563_save_calibration() function, cd->total_sz is assigned in
several error paths.
Move the assignment to the end of the function.
Fixes: b6016332b889 ("ALSA: hda/tas2781: clear cali_data.total_sz when calibration read fails")
Cc: <stable@vger.kernel.org> # 6.18
Signed-off-by: Gergo Koteles <soyer@irl.hu>
---
Changes in v2:
- Zero total_sz at the beginning of the function as it may run multiple
times (Sashiko)
---
sound/hda/codecs/side-codecs/tas2781_hda_i2c.c | 14 ++++----------
1 file changed, 4 insertions(+), 10 deletions(-)
diff --git a/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c b/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c
index 5e5f46c9fb6b..cff8fab8133a 100644
--- a/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c
+++ b/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c
@@ -335,10 +335,11 @@ static int tas2563_save_calibration(struct tas2781_hda *h)
}
cd->cali_dat_sz_per_dev = TAS2563_CAL_DATA_SIZE * TASDEV_CALIB_N;
+ cd->total_sz = 0;
/* extra byte for each device is the device number */
- cd->total_sz = (cd->cali_dat_sz_per_dev + 1) * p->ndev;
- data = cd->data = devm_kzalloc(p->dev, cd->total_sz,
+ data = cd->data = devm_kzalloc(p->dev,
+ (cd->cali_dat_sz_per_dev + 1) * p->ndev,
GFP_KERNEL);
if (!data)
return -ENOMEM;
@@ -352,7 +353,6 @@ static int tas2563_save_calibration(struct tas2781_hda *h)
if (ret < 0 || ret >= sizeof(var8) - 1) {
dev_err(p->dev, "%s: Read %s failed\n",
__func__, var8);
- cd->total_sz = 0;
return -EINVAL;
}
/*
@@ -370,7 +370,6 @@ static int tas2563_save_calibration(struct tas2781_hda *h)
dev_warn(p->dev,
"Dev %d: Caldat[%d] read failed %ld\n",
i, j, status);
- cd->total_sz = 0;
return -EINVAL;
}
bedata = cpu_to_be32(*(uint32_t *)&data[offset]);
@@ -379,12 +378,7 @@ static int tas2563_save_calibration(struct tas2781_hda *h)
}
}
- if (cd->total_sz != offset) {
- dev_err(p->dev, "%s: tot_size(%lu) and offset(%u) mismatch\n",
- __func__, cd->total_sz, offset);
- cd->total_sz = 0;
- return -EINVAL;
- }
+ cd->total_sz = offset;
r->r0_reg = TAS2563_CAL_R0;
r->invr0_reg = TAS2563_CAL_INVR0;
--
2.56.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH v2 2/2] ALSA: hda/tas2781: Skip invalid TAS2563 UEFI calibration data
2026-10-13 13:02 [PATCH v2 0/2] ALSA: hda/tas2781: Skip invalid TAS2563 UEFI calibration data Gergo Koteles
2026-10-13 13:02 ` [PATCH v2 1/2] ALSA: hda/tas2781: Assign total_sz at the end of the function Gergo Koteles
@ 2026-10-13 13:02 ` Gergo Koteles
2026-10-13 21:09 ` [PATCH v2 0/2] " Philipp Oster
2 siblings, 0 replies; 4+ messages in thread
From: Gergo Koteles @ 2026-10-13 13:02 UTC (permalink / raw)
To: Shenghao Ding, Kevin Lu, Baojun Xu, Sen Wang, Jaroslav Kysela,
Takashi Iwai, Philipp Oster, Georg Wenzel
Cc: linux-sound, linux-kernel, alsa-devel, Gergo Koteles, stable
Some Lenovo 14ARB7 laptops do not have proper calibration data.
Skip these zero calibration values and fall back to the calibration data
provided by the DSP firmware.
Tested-by: Georg Wenzel <g.wenzel@gmail.com>
Fixes: c3ca4458cc2f ("ALSA: hda/tas2781: add TAS2563 support for 14ARB7")
Cc: <stable@vger.kernel.org> # 6.18
Signed-off-by: Gergo Koteles <soyer@irl.hu>
---
Changes is v2:
- none
---
sound/hda/codecs/side-codecs/tas2781_hda_i2c.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c b/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c
index cff8fab8133a..44855f593daf 100644
--- a/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c
+++ b/sound/hda/codecs/side-codecs/tas2781_hda_i2c.c
@@ -372,6 +372,11 @@ static int tas2563_save_calibration(struct tas2781_hda *h)
i, j, status);
return -EINVAL;
}
+ if (*(uint32_t *)&data[offset] == 0) {
+ dev_warn(p->dev,
+ "Dev %d: Caldat[%d] is zero\n", i, j);
+ return -EINVAL;
+ }
bedata = cpu_to_be32(*(uint32_t *)&data[offset]);
memcpy(&data[offset], &bedata, sizeof(bedata));
offset += TAS2563_CAL_DATA_SIZE;
--
2.56.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v2 0/2] ALSA: hda/tas2781: Skip invalid TAS2563 UEFI calibration data
2026-10-13 13:02 [PATCH v2 0/2] ALSA: hda/tas2781: Skip invalid TAS2563 UEFI calibration data Gergo Koteles
2026-10-13 13:02 ` [PATCH v2 1/2] ALSA: hda/tas2781: Assign total_sz at the end of the function Gergo Koteles
2026-10-13 13:02 ` [PATCH v2 2/2] ALSA: hda/tas2781: Skip invalid TAS2563 UEFI calibration data Gergo Koteles
@ 2026-10-13 21:09 ` Philipp Oster
2 siblings, 0 replies; 4+ messages in thread
From: Philipp Oster @ 2026-10-13 21:09 UTC (permalink / raw)
To: Gergo Koteles, Shenghao Ding, Kevin Lu, Baojun Xu, Sen Wang,
Jaroslav Kysela, Takashi Iwai, Georg Wenzel
Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org,
alsa-devel@alsa-project.org
Hi Gergo,
thanks for extending this to the zero-calibration case.
I tested the v2 series on my Lenovo Yoga 7 14ARB7 (82QF). Here the UEFI
calibration variables are missing altogether, so tas2563_save_calibration()
bails out at "Dev 0: Caldat[0] read failed" before the new zero check is
reached -- the case my earlier patch was about. With both patches applied
on top of v7.2.9, the warning is logged as expected, no calibration data
is applied, and all four speakers, including the woofers, play normally
after a reboot.
Tested-by: Philipp Oster <philippdev5396@outlook.de>
Thanks,
Philipp
^ permalink raw reply [flat|nested] 4+ messages in thread