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

ALSA: hda/tas2781: Support L"SmartAmpCalibrationData" to save calibrated data

Some devices save the calibrated data into L"CALI_DATA", and others into
L"SmartAmpCalibrationData". Driver code will support both.

Signed-off-by: Shenghao Ding <shenghao-ding@ti.com>
Link: https://patch.msgid.link/20250805070945.524-1-shenghao-ding@ti.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by

Shenghao Ding and committed by
Takashi Iwai
cac5f2af 8cbe5649

+33 -16
+32 -15
sound/hda/codecs/side-codecs/tas2781_hda.c
··· 18 18 19 19 #include "tas2781_hda.h" 20 20 21 + #define CALIBRATION_DATA_AREA_NUM 2 22 + 21 23 const efi_guid_t tasdev_fct_efi_guid[] = { 22 24 /* DELL */ 23 25 EFI_GUID(0xcc92382d, 0x6337, 0x41cb, 0xa8, 0x8b, 0x8e, 0xce, 0x74, ··· 162 160 * manufactory. 163 161 */ 164 162 efi_guid_t efi_guid = tasdev_fct_efi_guid[LENOVO]; 165 - static efi_char16_t efi_name[] = TASDEVICE_CALIBRATION_DATA_NAME; 163 + /* 164 + * Some devices save the calibrated data into L"CALI_DATA", 165 + * and others into L"SmartAmpCalibrationData". 166 + */ 167 + static efi_char16_t *efi_name[CALIBRATION_DATA_AREA_NUM] = { 168 + L"CALI_DATA", 169 + L"SmartAmpCalibrationData", 170 + }; 166 171 struct tasdevice_priv *p = hda->priv; 167 172 struct calidata *cali_data = &p->cali_data; 168 173 unsigned long total_sz = 0; 169 174 unsigned int attr, size; 170 175 unsigned char *data; 171 176 efi_status_t status; 177 + int i; 172 178 173 179 if (hda->catlog_id < LENOVO) 174 180 efi_guid = tasdev_fct_efi_guid[hda->catlog_id]; 175 181 176 182 cali_data->cali_dat_sz_per_dev = 20; 177 183 size = p->ndev * (cali_data->cali_dat_sz_per_dev + 1); 178 - /* Get real size of UEFI variable */ 179 - status = efi.get_variable(efi_name, &efi_guid, &attr, &total_sz, NULL); 180 - cali_data->total_sz = total_sz > size ? total_sz : size; 181 - if (status == EFI_BUFFER_TOO_SMALL) { 182 - /* Allocate data buffer of data_size bytes */ 183 - data = p->cali_data.data = devm_kzalloc(p->dev, 184 - p->cali_data.total_sz, GFP_KERNEL); 185 - if (!data) { 186 - p->cali_data.total_sz = 0; 187 - return -ENOMEM; 184 + for (i = 0; i < CALIBRATION_DATA_AREA_NUM; i++) { 185 + /* Get real size of UEFI variable */ 186 + status = efi.get_variable(efi_name[i], &efi_guid, &attr, 187 + &total_sz, NULL); 188 + cali_data->total_sz = total_sz > size ? total_sz : size; 189 + if (status == EFI_BUFFER_TOO_SMALL) { 190 + /* Allocate data buffer of data_size bytes */ 191 + data = cali_data->data = devm_kzalloc(p->dev, 192 + cali_data->total_sz, GFP_KERNEL); 193 + if (!data) { 194 + status = -ENOMEM; 195 + continue; 196 + } 197 + /* Get variable contents into buffer */ 198 + status = efi.get_variable(efi_name[i], &efi_guid, 199 + &attr, &cali_data->total_sz, data); 188 200 } 189 - /* Get variable contents into buffer */ 190 - status = efi.get_variable(efi_name, &efi_guid, &attr, 191 - &p->cali_data.total_sz, data); 201 + /* Check whether get the calibrated data */ 202 + if (status == EFI_SUCCESS) 203 + break; 192 204 } 205 + 193 206 if (status != EFI_SUCCESS) { 194 - p->cali_data.total_sz = 0; 207 + cali_data->total_sz = 0; 195 208 return status; 196 209 } 197 210
+1 -1
sound/hda/codecs/side-codecs/tas2781_hda.h
··· 11 11 12 12 /* Flag of calibration registers address. */ 13 13 #define TASDEV_UEFI_CALI_REG_ADDR_FLG BIT(7) 14 - #define TASDEVICE_CALIBRATION_DATA_NAME L"CALI_DATA" 14 + 15 15 #define TASDEV_CALIB_N 5 16 16 17 17 /*