]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: hda/tas2781: Fix device-0 reset issue and handle -EXDEV in block data processing
authorBaojun Xu <baojun.xu@ti.com>
Tue, 9 Jun 2026 10:52:53 +0000 (18:52 +0800)
committerTakashi Iwai <tiwai@suse.de>
Wed, 10 Jun 2026 07:24:23 +0000 (09:24 +0200)
Fix reset for device-0:‌ In older projects (e.g., Merino), the hardware
reset pin for the first SPI device (device-0) is ineffective, causing
initialization failures. Added a software reset sequence for device-0
to ensure proper initialization.

‌Handle -EXDEV correctly:‌ When processing block data, if the data does
not belong to the current SPI device, the driver returned -EXDEV.
This error code is now ignored to allow the driver to continue iterating
through the block data and correctly calculate the total block size.

Signed-off-by: Baojun Xu <baojun.xu@ti.com>
Link: https://patch.msgid.link/20260609105253.19510-1-baojun.xu@ti.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/hda/codecs/side-codecs/tas2781_hda_spi.c
sound/soc/codecs/tas2781-fmwlib.c

index 0efc476abe8eb01aa6510078670025cb02b15fa3..3978d58ad02081097a546cf95a4cb30965020805 100644 (file)
@@ -190,15 +190,15 @@ static void tas2781_spi_reset(struct tasdevice_priv *tas_dev)
                gpiod_set_value_cansleep(tas_dev->reset, 0);
                fsleep(800);
                gpiod_set_value_cansleep(tas_dev->reset, 1);
-       } else {
-               ret = tasdevice_dev_write(tas_dev, tas_dev->index,
-                       TASDEVICE_REG_SWRESET, TASDEVICE_REG_SWRESET_RESET);
-               if (ret < 0) {
-                       dev_err(tas_dev->dev, "dev sw-reset fail, %d\n", ret);
-                       return;
-               }
-               fsleep(1000);
        }
+
+       ret = tasdevice_dev_write(tas_dev, tas_dev->index,
+               TASDEVICE_REG_SWRESET, TASDEVICE_REG_SWRESET_RESET);
+       if (ret < 0) {
+               dev_err(tas_dev->dev, "dev sw-reset fail, %d\n", ret);
+               return;
+       }
+       fsleep(1000);
 }
 
 static int tascodec_spi_init(struct tasdevice_priv *tas_priv,
index 885e0b6fed003ab42b39656fc8bc41d11b477151..bd16d5326a23dddc0a93bc2ac43c7b2c325a4205 100644 (file)
@@ -921,7 +921,8 @@ static int tasdevice_process_block(void *context, unsigned char *data,
                                                data[subblk_offset + 1],
                                                data[subblk_offset + 2]),
                                        data[subblk_offset + 3]);
-                               if (rc < 0) {
+                               if (rc < 0 &&
+                                   !(tas_priv->isspi && rc == -EXDEV)) {
                                        is_err = true;
                                        dev_err(tas_priv->dev,
                                        "process_block: single write error\n");
@@ -953,7 +954,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
                                data[subblk_offset + 1],
                                data[subblk_offset + 2]),
                                &(data[subblk_offset + 4]), len);
-                       if (rc < 0) {
+                       if (rc < 0 && !(tas_priv->isspi && rc == -EXDEV)) {
                                is_err = true;
                                dev_err(tas_priv->dev,
                                        "%s: bulk_write error = %d\n",
@@ -991,7 +992,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
                                data[subblk_offset + 4]),
                                data[subblk_offset + 1],
                                data[subblk_offset + 5]);
-                       if (rc < 0) {
+                       if (rc < 0 && !(tas_priv->isspi && rc == -EXDEV)) {
                                is_err = true;
                                dev_err(tas_priv->dev,
                                        "%s: update_bits error = %d\n",