]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: hda/tas2781: Support L"SmartAmpCalibrationData" to save calibrated data
authorShenghao Ding <shenghao-ding@ti.com>
Tue, 5 Aug 2025 07:09:45 +0000 (15:09 +0800)
committerTakashi Iwai <tiwai@suse.de>
Wed, 6 Aug 2025 06:05:47 +0000 (08:05 +0200)
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>
sound/hda/codecs/side-codecs/tas2781_hda.c
sound/hda/codecs/side-codecs/tas2781_hda.h

index 34217ce9f28e86988b7b5a8ca4c3749cd0ec80be..f46d2e06c64f34616e23777d265601241e3b2206 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "tas2781_hda.h"
 
+#define CALIBRATION_DATA_AREA_NUM 2
+
 const efi_guid_t tasdev_fct_efi_guid[] = {
        /* DELL */
        EFI_GUID(0xcc92382d, 0x6337, 0x41cb, 0xa8, 0x8b, 0x8e, 0xce, 0x74,
@@ -160,36 +162,51 @@ int tas2781_save_calibration(struct tas2781_hda *hda)
         * manufactory.
         */
        efi_guid_t efi_guid = tasdev_fct_efi_guid[LENOVO];
-       static efi_char16_t efi_name[] = TASDEVICE_CALIBRATION_DATA_NAME;
+       /*
+        * Some devices save the calibrated data into L"CALI_DATA",
+        * and others into L"SmartAmpCalibrationData".
+        */
+       static efi_char16_t *efi_name[CALIBRATION_DATA_AREA_NUM] = {
+               L"CALI_DATA",
+               L"SmartAmpCalibrationData",
+       };
        struct tasdevice_priv *p = hda->priv;
        struct calidata *cali_data = &p->cali_data;
        unsigned long total_sz = 0;
        unsigned int attr, size;
        unsigned char *data;
        efi_status_t status;
+       int i;
 
        if (hda->catlog_id < LENOVO)
                efi_guid = tasdev_fct_efi_guid[hda->catlog_id];
 
        cali_data->cali_dat_sz_per_dev = 20;
        size = p->ndev * (cali_data->cali_dat_sz_per_dev + 1);
-       /* Get real size of UEFI variable */
-       status = efi.get_variable(efi_name, &efi_guid, &attr, &total_sz, NULL);
-       cali_data->total_sz = total_sz > size ? total_sz : size;
-       if (status == EFI_BUFFER_TOO_SMALL) {
-               /* Allocate data buffer of data_size bytes */
-               data = p->cali_data.data = devm_kzalloc(p->dev,
-                       p->cali_data.total_sz, GFP_KERNEL);
-               if (!data) {
-                       p->cali_data.total_sz = 0;
-                       return -ENOMEM;
+       for (i = 0; i < CALIBRATION_DATA_AREA_NUM; i++) {
+               /* Get real size of UEFI variable */
+               status = efi.get_variable(efi_name[i], &efi_guid, &attr,
+                       &total_sz, NULL);
+               cali_data->total_sz = total_sz > size ? total_sz : size;
+               if (status == EFI_BUFFER_TOO_SMALL) {
+                       /* Allocate data buffer of data_size bytes */
+                       data = cali_data->data = devm_kzalloc(p->dev,
+                               cali_data->total_sz, GFP_KERNEL);
+                       if (!data) {
+                               status = -ENOMEM;
+                               continue;
+                       }
+                       /* Get variable contents into buffer */
+                       status = efi.get_variable(efi_name[i], &efi_guid,
+                               &attr, &cali_data->total_sz, data);
                }
-               /* Get variable contents into buffer */
-               status = efi.get_variable(efi_name, &efi_guid, &attr,
-                       &p->cali_data.total_sz, data);
+               /* Check whether get the calibrated data */
+               if (status == EFI_SUCCESS)
+                       break;
        }
+
        if (status != EFI_SUCCESS) {
-               p->cali_data.total_sz = 0;
+               cali_data->total_sz = 0;
                return status;
        }
 
index 575a701c8dfb894fa3ea2eb5610ddc3c29ac6784..66188909a0bb6fe3d546fc7206b2abc2f97b573c 100644 (file)
@@ -11,7 +11,7 @@
 
 /* Flag of calibration registers address. */
 #define TASDEV_UEFI_CALI_REG_ADDR_FLG  BIT(7)
-#define TASDEVICE_CALIBRATION_DATA_NAME        L"CALI_DATA"
+
 #define TASDEV_CALIB_N                 5
 
 /*