]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: hda/tas2781: Fix incorrect bit update for non-book-zero or book 0 pages >1
authorShenghao Ding <shenghao-ding@ti.com>
Wed, 29 Apr 2026 05:42:06 +0000 (13:42 +0800)
committerTakashi Iwai <tiwai@suse.de>
Wed, 29 Apr 2026 05:51:17 +0000 (07:51 +0200)
In TAS2781 SPI mode, when accessing non-book-zero or page numbers greater
than 1 in book 0, an additional byte must be read. The first byte in such
cases is a dummy byte and should be ignored.

Fixes: 9fa6a693ad8d ("ALSA: hda/tas2781: Remove tas2781_spi_fwlib.c and leverage SND_SOC_TAS2781_FMWLIB")
Signed-off-by: Shenghao Ding <shenghao-ding@ti.com>
Link: https://patch.msgid.link/20260429054206.429-1-shenghao-ding@ti.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/hda/codecs/side-codecs/tas2781_hda_spi.c

index 560f2385212dd5155d2b7c41e21a05c4285f0895..0e4f3553f273817c9d70197e79617a5f7a497541 100644 (file)
@@ -132,10 +132,18 @@ static int tasdevice_spi_dev_update_bits(struct tasdevice_priv *tas_priv,
        int ret, val;
 
        /*
-        * In our TAS2781 SPI mode, read/write was masked in last bit of
-        * address, it cause regmap_update_bits() not work as expected.
+        * In TAS2781 SPI mode, when accessing non-book-zero or page numbers
+        * greater than 1 in book 0, an additional byte must be read. The
+        * first byte in such cases is a dummy byte and should be ignored.
         */
-       ret = tasdevice_dev_read(tas_priv, chn, reg, &val);
+       if ((TASDEVICE_BOOK_ID(reg) > 0) || (TASDEVICE_PAGE_ID(reg) > 1)) {
+               unsigned char buf[2];
+
+               ret = tasdevice_dev_bulk_read(tas_priv, chn, reg, buf, 2);
+               val = buf[1];
+       } else {
+               ret = tasdevice_dev_read(tas_priv, chn, reg, &val);
+       }
        if (ret < 0) {
                dev_err(tas_priv->dev, "%s, E=%d\n", __func__, ret);
                return ret;