From patchwork Wed Sep 2 05:19:11 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Chiu X-Patchwork-Id: 2296363 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ubuntu.com (client-ip=185.125.189.65; helo=lists.ubuntu.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=patchwork.ozlabs.org) Received: from lists.ubuntu.com (lists.ubuntu.com [185.125.189.65]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZWHt10Yqz1ybC for ; Wed, 02 Sep 2026 15:19:38 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=lists.ubuntu.com) by lists.ubuntu.com with esmtp (Exim 4.86_2) (envelope-from ) id 1x1dNg-0006b9-JP; Wed, 02 Sep 2026 05:19:28 +0000 Received: from smtp-relay-internal-0.internal ([10.131.114.225] helo=smtp-relay-internal-0.canonical.com) by lists.ubuntu.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1x1dNe-0006XD-NQ for kernel-team@lists.ubuntu.com; Wed, 02 Sep 2026 05:19:26 +0000 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 921053F167 for ; Wed, 2 Sep 2026 05:19:26 +0000 (UTC) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2d54187d8b0so16711175ad.0 for ; Tue, 01 Sep 2026 22:19:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788326365; x=1788931165; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=TmfwIIMbB1PITlCEVaSFq36rLRoqBeu8jaUdvLEq3ls=; b=TsgV9hjuDmvvq6AclsRgeaJx0VL2Qk8NkKGl+baAnwlNhAESswskfYrAVktG0u95NN HtxGKr6+wTgIWsvtHjA985D58fXBHCQFc9FsEsm1QfLpRAicep4tTygBBlRQcR5FZRiq eSNjmwUoO27zIc6K9qoMesTuhsrdEle4EABYeJiH4NeXGy8EAbbKAZQ6eBHkXBnA3yA4 4kZmzfHrdQvgz7LLyAfBeEnxQfeuX4Mb3OMZnYTDWeQ4KzIZHy7qGW7L2EQ9PoZqilCM Qw4VhfklTLDojiZp8IxjmMf2sVHFDgOMPnh6XFrBU/LU9srT4zluQITD0Qe1yhmN7pVR vBCA== X-Gm-Message-State: AFuF++k3shqcE578X7Lr4PMnRarv4YNSduQdEDpOMN5qWUoo+5JCY9gk QNxUwSKw1RcHg1jZFHSlgUf/y3IBhb5fSbPEl5FApcNUNyPSYzRVxW/7ZXXPUB3WX23a6dUega0 GA/EXUZY3aeAX7cr0EJCMqs5vLUZ8z2BUrGYNFxpX/ivFdB/gz7Vv3wWrxu93H74aq1lG2JVKta 7oTuswLu3CMMHW2g== X-Gm-Gg: AYBFou2nVI/zPmPP44xI0Ah0LVPFqNtJYbkRdG0HuLrrUOKxx0t9EGQpbYi+zFDjMdO Wm+w0iLXp4aMPdUNMe7vpCxnJ22yoG/NUf7DFcv3F9qG/niqoUNuYv/mxi2tqdEK04GYh+klGrb 6TWIfPP6IXzWP/mM37KKyInQq0fZGJrZxNiSs+1qH01+QsKtx2sMFq1qDD9XMsn+uVCmsspvYE4 xN1hX/jvQJjs+EnCKRRPbFzCpps2aKD7gJN6WdcErIOGVqWVYgiCYnzQa9joFMT0YzWQF6Ch3Sh KV53t+V9/FBCYVhnujLSl5+Q7VartfpX6xPyJhObi/HptCYw2EBeMnLWwuWUl1X6v+l7lRNNbhN FF08BUVzvW+h5LGgLEzXqrOWBuemUUkByXRPwB2SFwQ== X-Received: by 2002:a17:903:3846:b0:2d6:f961:994f with SMTP id d9443c01a7336-2daec62cc08mr34974305ad.8.1788326365026; Tue, 01 Sep 2026 22:19:25 -0700 (PDT) X-Received: by 2002:a17:903:3846:b0:2d6:f961:994f with SMTP id d9443c01a7336-2daec62cc08mr34973905ad.8.1788326364604; Tue, 01 Sep 2026 22:19:24 -0700 (PDT) Received: from localhost.. (118-163-61-247.hinet-ip.hinet.net. [118.163.61.247]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2dadd4a794bsm6882215ad.64.2026.09.01.22.19.23 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Sep 2026 22:19:24 -0700 (PDT) To: kernel-team@lists.ubuntu.com Subject: [SRU][R][PATCH v3 7/7] ASoC: SDCA: Move kcontrol search out of IRQ Date: Wed, 2 Sep 2026 13:19:11 +0800 Message-ID: <20260902051911.3542655-8-chris.chiu@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902051911.3542655-1-chris.chiu@canonical.com> References: <20260902051911.3542655-1-chris.chiu@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Chris Chiu via kernel-team From: Chris Chiu Reply-To: Chris Chiu Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Charles Keepax BugLink: https://bugs.launchpad.net/bugs/2163215 Now that the IRQs are always registered after all the ALSA controls are created it is possible to search for the control at the point the IRQ is requested. Move the control search out of the IRQ handler and do it at IRQ request time. This also fixes a potential issue when the card was torn down and reprobed without destroying the codec device, the kctl pointer stored by the IRQ handler would not be updated to the new control on the second probe. Signed-off-by: Charles Keepax Link: https://patch.msgid.link/20260721143636.361814-8-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown (cherry picked from commit bf1b7821f85383a8804441f8fd5165be148f3ec8) Signed-off-by: Chris Chiu --- include/sound/sdca_jack.h | 1 + sound/soc/sdca/sdca_interrupts.c | 12 +++++++++ sound/soc/sdca/sdca_jack.c | 43 +++++++++++++++++++------------- 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/include/sound/sdca_jack.h b/include/sound/sdca_jack.h index 8624c51eea26..bdde096141c3 100644 --- a/include/sound/sdca_jack.h +++ b/include/sound/sdca_jack.h @@ -25,6 +25,7 @@ struct jack_state { }; int sdca_jack_alloc_state(struct sdca_interrupt *interrupt); +int sdca_jack_init_state(struct sdca_interrupt *interrupt); void sdca_jack_free_state(struct sdca_interrupt *interrupt); int sdca_jack_process(struct sdca_interrupt *interrupt); diff --git a/sound/soc/sdca/sdca_interrupts.c b/sound/soc/sdca/sdca_interrupts.c index 79a17d827f99..15da7c2aea50 100644 --- a/sound/soc/sdca/sdca_interrupts.c +++ b/sound/soc/sdca/sdca_interrupts.c @@ -512,6 +512,8 @@ int sdca_irq_populate(struct sdca_function_data *function, for (i = 0; i < SDCA_MAX_INTERRUPTS; i++) { struct sdca_interrupt *interrupt = &info->irqs[i]; + struct sdca_control *control = interrupt->control; + struct sdca_entity *entity = interrupt->entity; int irq; if (interrupt->function != function || interrupt->irq) @@ -519,6 +521,16 @@ int sdca_irq_populate(struct sdca_function_data *function, interrupt->component = component; + switch (SDCA_CTL_TYPE(entity->type, control->sel)) { + case SDCA_CTL_TYPE_S(GE, DETECTED_MODE): + ret = sdca_jack_init_state(interrupt); + if (ret) + return ret; + break; + default: + break; + } + irq = interrupt->control->interrupt_position; ret = sdca_irq_request_locked(dev, info, irq, interrupt->name, interrupt->handler, interrupt); diff --git a/sound/soc/sdca/sdca_jack.c b/sound/soc/sdca/sdca_jack.c index 4497134cd32f..8d4f89dc416e 100644 --- a/sound/soc/sdca/sdca_jack.c +++ b/sound/soc/sdca/sdca_jack.c @@ -47,23 +47,6 @@ int sdca_jack_process(struct sdca_interrupt *interrupt) guard(rwsem_write)(rwsem); - if (!kctl) { - const char *name __free(kfree) = kasprintf(GFP_KERNEL, "%s %s", - interrupt->entity->label, - SDCA_CTL_SELECTED_MODE_NAME); - - if (!name) - return -ENOMEM; - - kctl = snd_soc_component_get_kcontrol(component, name); - if (!kctl) { - dev_err(dev, "control not found: %s\n", name); - return -ENODEV; - } - - state->kctl = kctl; - } - reg = SDW_SDCA_CTL(interrupt->function->desc->adr, interrupt->entity->id, interrupt->control->sel, 0); @@ -148,6 +131,32 @@ void sdca_jack_free_state(struct sdca_interrupt *interrupt) } EXPORT_SYMBOL_NS_GPL(sdca_jack_free_state, "SND_SOC_SDCA"); +/** + * sdca_jack_init_state - Initialise transient state for a jack interrupt + * @interrupt: SDCA interrupt structure. + * + * Return: Zero on success or a negative error code. + */ +int sdca_jack_init_state(struct sdca_interrupt *interrupt) +{ + struct jack_state *jack_state = interrupt->priv; + const char *name __free(kfree) = kasprintf(GFP_KERNEL, "%s %s", + interrupt->entity->label, + SDCA_CTL_SELECTED_MODE_NAME); + + if (!name) + return -ENOMEM; + + jack_state->kctl = snd_soc_component_get_kcontrol(interrupt->component, name); + if (!jack_state->kctl) { + dev_err(interrupt->dev, "control not found: %s\n", name); + return -ENODEV; + } + + return 0; +} +EXPORT_SYMBOL_NS_GPL(sdca_jack_init_state, "SND_SOC_SDCA"); + static int type_get_mask(enum sdca_terminal_type type) { switch (type) {