]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ALSA: ctxfi: Don't enumerate SPDIF1 at DAIO initialization
authorTakashi Iwai <tiwai@suse.de>
Tue, 31 Mar 2026 08:12:17 +0000 (10:12 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 31 Mar 2026 08:13:10 +0000 (10:13 +0200)
The recent refactoring of xfi driver changed the assignment of
atc->daios[] at atc_get_resources(); now it loops over all enum
DAIOTYP entries while it looped formerly only a part of them.
The problem is that the last entry, SPDIF1, is a special type that
is used only for hw20k1 CTSB073X model (as a replacement of SPDIFIO),
and there is no corresponding definition for hw20k2.  Due to the lack
of the info, it caused a kernel crash on hw20k2, which was already
worked around by the commit b045ab3dff97 ("ALSA: ctxfi: Fix missing
SPDIFI1 index handling").

This patch addresses the root cause of the regression above properly,
simply by skipping the incorrect SPDIF1 type in the parser loop.

For making the change clearer, the code is slightly arranged, too.

Fixes: a2dbaeb5c61e ("ALSA: ctxfi: Refactor resource alloc for sparse mappings")
Cc: <stable@vger.kernel.org>
Link: https://bugzilla.suse.com/show_bug.cgi?id=1259925
Link: https://patch.msgid.link/20260331081227.216134-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/ctxfi/ctatc.c

index f122e396bc55acc00d61c67d8256c8dcb0c9fd9d..da2667cb2489ed1469ce618a22780c26266113a4 100644 (file)
@@ -1427,10 +1427,14 @@ static int atc_get_resources(struct ct_atc *atc)
        daio_mgr = (struct daio_mgr *)atc->rsc_mgrs[DAIO];
        da_desc.msr = atc->msr;
        for (i = 0; i < NUM_DAIOTYP; i++) {
-               if (((i == MIC) && !cap.dedicated_mic) || ((i == RCA) && !cap.dedicated_rca))
+               if (((i == MIC) && !cap.dedicated_mic) ||
+                   ((i == RCA) && !cap.dedicated_rca) ||
+                   i == SPDIFI1)
                        continue;
-               da_desc.type = (atc->model != CTSB073X) ? i :
-                            ((i == SPDIFIO) ? SPDIFI1 : i);
+               if (atc->model == CTSB073X && i == SPDIFIO)
+                       da_desc.type = SPDIFI1;
+               else
+                       da_desc.type = i;
                da_desc.output = (i < LINEIM) || (i == RCA);
                err = daio_mgr->get_daio(daio_mgr, &da_desc,
                                        (struct daio **)&atc->daios[i]);