]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: ctxfi: Precompute SRC allocation loop bound
authorHarin Lee <me@harin.net>
Wed, 1 Apr 2026 09:01:59 +0000 (18:01 +0900)
committerTakashi Iwai <tiwai@suse.de>
Wed, 1 Apr 2026 12:43:54 +0000 (14:43 +0200)
Replace the capability checks in the SRC and SRCIMP allocation loops
with a precomputed loop bound. Cards with a dedicated mic input
(SB1270, OK0010) allocate all NUM_ATC_SRCS entries, otherwise stop
at 4.

Signed-off-by: Harin Lee <me@harin.net>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20260401090159.2404387-4-me@harin.net
sound/pci/ctxfi/ctatc.c

index 7c2f896d531d747959f401aac1335f98a5b34f9d..516c0a12ed9fbe1a96d44639a56fd28ab261c6eb 100644 (file)
@@ -1409,9 +1409,11 @@ static int atc_get_resources(struct ct_atc *atc)
        struct sum_desc sum_dsc = {0};
        struct sum_mgr *sum_mgr;
        struct capabilities cap;
+       int atc_srcs_limit;
        int err, i;
 
        cap = atc->capabilities(atc);
+       atc_srcs_limit = cap.dedicated_mic ? NUM_ATC_SRCS : 4;
 
        atc->daios = kcalloc(NUM_DAIOTYP, sizeof(void *), GFP_KERNEL);
        if (!atc->daios)
@@ -1453,9 +1455,7 @@ static int atc_get_resources(struct ct_atc *atc)
        src_dsc.multi = 1;
        src_dsc.msr = atc->msr;
        src_dsc.mode = ARCRW;
-       for (i = 0; i < NUM_ATC_SRCS; i++) {
-               if (((i > 3) && !cap.dedicated_mic))
-                       continue;
+       for (i = 0; i < atc_srcs_limit; i++) {
                err = src_mgr->get_src(src_mgr, &src_dsc,
                                        (struct src **)&atc->srcs[i]);
                if (err)
@@ -1464,9 +1464,7 @@ static int atc_get_resources(struct ct_atc *atc)
 
        srcimp_mgr = atc->rsc_mgrs[SRCIMP];
        srcimp_dsc.msr = 8;
-       for (i = 0; i < NUM_ATC_SRCS; i++) {
-               if (((i > 3) && !cap.dedicated_mic))
-                       continue;
+       for (i = 0; i < atc_srcs_limit; i++) {
                err = srcimp_mgr->get_srcimp(srcimp_mgr, &srcimp_dsc,
                                        (struct srcimp **)&atc->srcimps[i]);
                if (err)