mirror of
https://github.com/torvalds/linux.git
synced 2026-09-19 17:18:02 +02:00
tas2563_save_calibration() assigns cali_data.total_sz before it reads the per-device calibration data from EFI, but its error paths return without clearing it again. cali_data.cali_reg_array is left all zero, because the function returns before the register addresses are assigned. On the first playback tasdev_load_calibrated_data() does if (!data || !cali_data->total_sz) return; which passes, since total_sz is still non-zero. It then issues five 4-byte bulk writes to p->r0_reg, p->r0_low_reg, p->invr0_reg, p->pow_reg and p->tlimit_reg, all of which are 0. Register 0 decodes to book 0 / page 0 / register 0x00, so the auto-incrementing block write zeroes registers 0x00 to 0x03. Register 0x03 is PB_CFG1, which holds AMP_LEVEL, so the amplifier gain is set to its minimum and the speaker stays silent. This is reproducible on a Lenovo Yoga 7 14ARB7 (two TAS2563 on I2C, ACPI INT8866) whose factory calibration was never written to UEFI, so the EFI read fails with EFI_NOT_FOUND. The two woofers driven by the amplifiers are silent while the tweeters driven directly by the ALC287 play. Reading the amplifier registers over i2c shows PWR_CTL = 0x00 (active) and the TDM slots correctly programmed by the RCA profile, but PB_CFG1 = 0x00. With this change PB_CFG1 keeps its power-on default of 0x20 and both woofers play. tas2781_save_calibration() in tas2781_hda.c already clears total_sz on failure; do the same for the TAS2563 variant. Signed-off-by: Philipp Oster <philippdev5396@outlook.de> Link: https://patch.msgid.link/20260720-tas2781-calfix-v1-1-3a5fa6ad90bc@outlook.de Signed-off-by: Takashi Iwai <tiwai@suse.de> |
||
|---|---|---|
| .. | ||
| cirrus_scodec_test.c | ||
| cirrus_scodec.c | ||
| cirrus_scodec.h | ||
| cs35l41_hda_i2c.c | ||
| cs35l41_hda_property.c | ||
| cs35l41_hda_property.h | ||
| cs35l41_hda_spi.c | ||
| cs35l41_hda.c | ||
| cs35l41_hda.h | ||
| cs35l56_hda_i2c.c | ||
| cs35l56_hda_spi.c | ||
| cs35l56_hda.c | ||
| cs35l56_hda.h | ||
| hda_component.c | ||
| hda_component.h | ||
| Kconfig | ||
| Makefile | ||
| tas2781_hda_i2c.c | ||
| tas2781_hda_spi.c | ||
| tas2781_hda.c | ||
| tas2781_hda.h | ||