]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: hda/tas2781: Skip UEFI calibration on ASUS ROG Xbox Ally X
authorMatthew Schwartz <matthew.schwartz@linux.dev>
Thu, 8 Jan 2026 09:36:50 +0000 (01:36 -0800)
committerTakashi Iwai <tiwai@suse.de>
Thu, 8 Jan 2026 13:05:27 +0000 (14:05 +0100)
There is currently an issue with UEFI calibration data parsing for some
TAS devices, like the ASUS ROG Xbox Ally X (RC73XA), that causes audio
quality issues such as gaps in playback. Until the issue is root caused
and fixed, add a quirk to skip using the UEFI calibration data and fall
back to using the calibration data provided by the DSP firmware, which
restores full speaker functionality on affected devices.

Cc: stable@vger.kernel.org # 6.18
Link: https://lore.kernel.org/all/160aef32646c4d5498cbfd624fd683cc@ti.com/
Closes: https://lore.kernel.org/all/0ba100d0-9b6f-4a3b-bffa-61abe1b46cd5@linux.dev/
Suggested-by: Baojun Xu <baojun.xu@ti.com>
Signed-off-by: Matthew Schwartz <matthew.schwartz@linux.dev>
Reviewed-by: Antheas Kapenekakis <lkml@antheas.dev>
Link: https://patch.msgid.link/20260108093650.1142176-1-matthew.schwartz@linux.dev
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/hda/codecs/side-codecs/tas2781_hda_i2c.c

index f7a7f216d5865f92bb69f6ad6a29deea12c7a42c..0e4bda3a544ea4a82a11e04fc40e7df30d3c9d19 100644 (file)
@@ -60,6 +60,7 @@ struct tas2781_hda_i2c_priv {
        int (*save_calibration)(struct tas2781_hda *h);
 
        int hda_chip_id;
+       bool skip_calibration;
 };
 
 static int tas2781_get_i2c_res(struct acpi_resource *ares, void *data)
@@ -491,7 +492,8 @@ static void tasdevice_dspfw_init(void *context)
        /* If calibrated data occurs error, dsp will still works with default
         * calibrated data inside algo.
         */
-       hda_priv->save_calibration(tas_hda);
+       if (!hda_priv->skip_calibration)
+               hda_priv->save_calibration(tas_hda);
 }
 
 static void tasdev_fw_ready(const struct firmware *fmw, void *context)
@@ -548,6 +550,7 @@ static int tas2781_hda_bind(struct device *dev, struct device *master,
        void *master_data)
 {
        struct tas2781_hda *tas_hda = dev_get_drvdata(dev);
+       struct tas2781_hda_i2c_priv *hda_priv = tas_hda->hda_priv;
        struct hda_component_parent *parent = master_data;
        struct hda_component *comp;
        struct hda_codec *codec;
@@ -573,6 +576,14 @@ static int tas2781_hda_bind(struct device *dev, struct device *master,
                break;
        }
 
+       /*
+        * Using ASUS ROG Xbox Ally X (RC73XA) UEFI calibration data
+        * causes audio dropouts during playback, use fallback data
+        * from DSP firmware as a workaround.
+        */
+       if (codec->core.subsystem_id == 0x10431384)
+               hda_priv->skip_calibration = true;
+
        pm_runtime_get_sync(dev);
 
        comp->dev = dev;