From nobody Wed Jul 15 21:24:08 2026 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B180E2367B8 for ; Sat, 11 Jul 2026 01:11:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732310; cv=none; b=SbbfnUTP7BKIzywky/USW4W0m7foSR4+IEn7PDzhhHiV66ELdFuLJSwDwTDFRPlDnMc6TWRDJ864hRaGyMptDKDMwRHUq9McuIeTwXGlugDHw1vm6KCxSFNB9C263pAIjPm5AZpJbiUTB16cGRxkTBzlJ7voGhGxgD4O2l1WywM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732310; c=relaxed/simple; bh=ANceJ9b98BTOb7cjTXpEWeapQ0x5Y+oW6BrMwWfSbU0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Qyf3j9sQnIPGIzz69thXlRXRmvL3n+PUlhuMnTv+AW1KkP6fnXkUPfHGEcQZclDwRF7lRUQj6vDO527knEnL9rdg1qN95toEmknurZMxEx+drRHJ4q3a7DF7+NxPTv+6OeKdj/e3eWm/XkFFyhc/v8OtTQ9Gr3nHUrWA+VlAMBU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=qK4xxSmJ; arc=none smtp.client-ip=209.85.210.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="qK4xxSmJ" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-845c92bc464so1348511b3a.2 for ; Fri, 10 Jul 2026 18:11:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783732309; x=1784337109; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=WH3fDa/mQ1wFJ8AJw76Ffp4EfrLnbmDhJB4OgmL9g5s=; b=qK4xxSmJeDjt4FklW3PWaE32JGN7SoCzGudBNYuXGytse7PwQEltLFNgFPTZCfHafk B4Ww2F6FgiS6SJ0DFPgi/JMXr+1ppt8nbxt8HkTRT46W9LsDYoC6P+gUmDTLKkpTofBf gbzs9g/Lhpvi5Qa2rEkVyg9QKHznp7PM0hP7xdMSJZWbMGRVWcJ1BrwLwi5qA8UOWZA2 OsKfO97TmiXjPXwnqvKAtT4WsEQtm0Th7pbM7bX9Gr7cRBLLdd/bC4sFww/kBGwhu2ZL CnhxB4lQHOnDJE7VxqO1ubL0xgqwU+WO/vh8cveysLorFzZmpn9SkcHwjUskXHjyg8Ne R39w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783732309; x=1784337109; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=WH3fDa/mQ1wFJ8AJw76Ffp4EfrLnbmDhJB4OgmL9g5s=; b=VSEnt1Y48SpjITCURmgr34qTGf8QS4B1SZLgYt7iEDZxjNlb39AhdKWs5SNwXQIVXr w1h8veaM3ljnpS3tFhCP0KDkaDFzVGsGX2DOjOzFg6Ru4YojhdbQvk8sL2LH1/eXbDhq sVt9wQi8kK63ZlkqXzf75ni00yYzXNBvEmd8E5VbIJH76BFESmoUcxcQmfnf/vOCZF7p yjcuySzpYv66F11XS57ljJrxRpL7NzUAga0pOxgXQ0ApBurVdSxBkM1C40DCnwTRcX/D 50cacy+TjtN4Hz19SVv/SqHYVJQ5ZbAxrz013aV4Zj9TSgMcC3NfZx7D6cbNh46RepmH F8Ig== X-Forwarded-Encrypted: i=1; AHgh+Rrwx/ggM1cgFmqot7SwPVfXI8GhEoFH4yISv1eZwVl5DV3YuSlBA2vI6oXuMARTA7EEcN4+tCJGr0cCq+Y=@vger.kernel.org X-Gm-Message-State: AOJu0YyZPXwGx7K++UeN2zc9J6sxtvad0/9hQBH5X3FAQQsgh3yFELgu 71/Ikq8uD1ouLXh0xmwBqTLE2FmU2X+4ob4aTJ6GepeUxg9ib72hgUi8g8DJ4Q== X-Gm-Gg: AfdE7ckamg8lMInppA+4b19QSVRWmeqgIapIqoWVJhWVMGpkwzZy+jS5Z6Pmn55uGpf PPJFXFWEhXNAFrPjiBSWUSFihKnB3k99L9UZlPZrDfqUWmYgBRqOPdyj+HPUqBNuWDnz+Py3H47 UPJHBxIyRVEUfF2YLgfb9uktTLi7c28/RXserqmSrPGGHDppmrEMWzydXNg3Wcb32UUyjL1y3bb YADugZu0JVcarHQsLeAxmRqrjx3srHdKmlj9+xn9tQlal3gdr5B/2z+Arrtd6WX1OTLEG4udC8X vk9Nk+gO6uVDVAz3twDhTYOLO9PbdsOTUOrozzNsCQCi4yrM4ajhOq2fjc/a8/1+bvU7ae0VhLO sL0osbm6VUgsHM5EZbYrvHwNC41Y5PpxKw3XMn6iVmRqssOCduOgMIUi0E09IrNTlPX7cIp4YdW kHBZpo+Oqj6i1/KH1yvmtABJ/jGOQHaybygs+v4FgrAnd4po/rkwuUNJwQ2xKSV4YSE0WadJGIv 3kasJ+gbcLxPfX8fzR5NRdZ5oF19AgUMhH/ZKbz+5Aqb9nHj1drcnEEmeY5M9j9tPsbzI7uZZL4 X-Received: by 2002:a05:6a00:b47:b0:847:9c99:ea52 with SMTP id d2e1a72fcca58-848896084ebmr1269711b3a.24.1783732308877; Fri, 10 Jul 2026 18:11:48 -0700 (PDT) Received: from [192.168.2.3] ([2403:581e:d87e:0:fc2d:ed31:e80e:412d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-848530c5a12sm3751929b3a.5.2026.07.10.18.11.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 18:11:48 -0700 (PDT) From: James Calligeros Date: Sat, 11 Jul 2026 11:11:19 +1000 Subject: [PATCH v4 1/7] ASoC: apple: mca: increase SERDES reset delay Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260711-apple-audio-redux-v4-1-2994d87c2f24@gmail.com> References: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> In-Reply-To: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> To: =?utf-8?q?Martin_Povi=C5=A1er?= , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: asahi@lists.linux.dev, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, James Calligeros X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1359; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=ANceJ9b98BTOb7cjTXpEWeapQ0x5Y+oW6BrMwWfSbU0=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDFmBM7zq3ZT/2GdU9L5IUT2esvjMqxq9k/Hu62YeM3vU6 reZbVNgx0QWBjEuBksxRZYNTUIes43YbvaLVO6FmcPKBDJEWqSBAQhYGPhyE/NKjXSM9Ey1DfUM jXSMdYwYuDgFYKq7DjH8s0i9L6e8ZVnNV4t5p13+lYk5ihg82Vs2g00u30Kt9OeEKYwMK103XJ6 zIM6xZMYW8xovt+nr7UpYzqmJHEtjfJq9w5OJFwA= X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 The SERDES clusters in this peripheral take a long time to warm up. We tried polling the reset bit until cleared, however this is not a reliable signal of readiness to be configured. Only waiting ~25 us to give the cluster a chance to settle makes it work reliably. Increase the 2 us delay to 25 us and hope we never have to do this again. Fixes: d8b3e396088d ("ASoC: apple: mca: Fix SERDES reset sequence") Signed-off-by: James Calligeros --- sound/soc/apple/mca.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c index 492165c0e1ea..ebe116f32661 100644 --- a/sound/soc/apple/mca.c +++ b/sound/soc/apple/mca.c @@ -210,10 +210,10 @@ static void mca_fe_early_trigger(struct snd_pcm_subst= ream *substream, int cmd, SERDES_STATUS_EN | SERDES_STATUS_RST, SERDES_STATUS_RST); /* - * Experiments suggest that it takes at most ~1 us - * for the bit to clear, so wait 2 us for good measure. + * The SERDES cluster needs a bit of time to reset itself + * and settle before we start poking it. This is... slow... */ - udelay(2); + udelay(25); WARN_ON(readl_relaxed(cl->base + serdes_unit + REG_SERDES_STATUS) & SERDES_STATUS_RST); mca_modify(cl, serdes_conf, SERDES_CONF_SYNC_SEL, --=20 2.55.0 From nobody Wed Jul 15 21:24:08 2026 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B7801221D89 for ; Sat, 11 Jul 2026 01:11:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732316; cv=none; b=capTG+grc48Edqvdaw5VtmMT8JEHihJLeVxerNN+lKZK+SgdDbBbaVKAHtKRMuiq5PcAI6Jr4gObMZ/ffq3abSpaoydXFFFYmMETlRNkyOpEK6ANhKHwMcI5GLdZ8T8HUgbbI2rgUr9cvMKRVJKEH2L/10+Kg8iYVvuV1vxL9+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732316; c=relaxed/simple; bh=fzB4hBsyB/ZNFCUZEx9jbpCf/t78o9fj5k3ty/VCCds=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ssIX3hYYe7o0DpoMNTJ/TGhTt1sdJIFIsPcx+to8lM7wjBJu/gIwq5jHpFllo8+8PKDoh4XUsrnQeuE0aU2DUN6dEfUkcVEFDZp6bGyr8j+Nzl2NqbQ9JCTQB84ab4Kq94qCY4Q/keoh49ARmghv/uhsQy1v+jgzMcBvP18H0Pc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Pfkl5Prn; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Pfkl5Prn" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-84867f07d63so1682571b3a.2 for ; Fri, 10 Jul 2026 18:11:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783732314; x=1784337114; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=9OmZuNm0i6GJNLZMl4qH6fj6FYGbdFW+PYBbGIIysyE=; b=Pfkl5PrnO+3shUqyYUm3nBvqRK7DSlJk84Z6+sJ4MnGaojRf83fkFZIWINfhJM3XJx UOrc1B+Hjk8+XoZd8gf6TGXsXv1R/8faNZbjOt1+Imo1IdodTpySHwN79vU3m8uJTQV+ NVK082/8SG9p9N42P/ZxrCH0+AMetl40tEAj6MwMDw21JTI6ArPhH33YJwzaRBbe7Zba xZuHH2rSMSJF9L5zGd088mqiPZfuXAyzgQlL07GrBova4V/OFUk+bVDjrNqhY4LcAeX4 hFab3Jmb0BPJXhfnFe20DFVMrc3ZFem2CkVxwjYYrLXG+c8XATDkJ0kOmI1XmibumbrK XlWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783732314; x=1784337114; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=9OmZuNm0i6GJNLZMl4qH6fj6FYGbdFW+PYBbGIIysyE=; b=DpbJa9mps3sJ+Oc2ALMSh+NcclpzU9pYQoYu74orCZ23c7Eom3gBbbWUU9c1q0mMdS 3QpaqPmCGneSU1QoR+PYX9v6Hhz2dU1YfoZQ9ktmjY8yAyHAe/I9EEBMMGGsp2SxUuAz BhwjLk+AbE/e/pTbHp00CqaylzaObF/38j0dHYKiSqvTG2IEx+Oq7nPjusqdGOaeX7oA n8s3AgN3+aqjAH74pchW6Q/PplzA7vJQE99EC/cqdQGlcvOGQSR0v/6MvmKbUo5m5sGN 5+wH/elvThaftSXzspQr8zn9N/gd4wDfWJNykRFVj6OfyHSO+MBJFfg/3BhB37fyNFaG KNkg== X-Forwarded-Encrypted: i=1; AHgh+RpC8vurXCkTJY6k8Pxxg59xfc/Fp1B5iZSNfC6BdGSuM9NUeSB/t57Q4nxaTeWUY4gSHhIUedovNjj5Ztk=@vger.kernel.org X-Gm-Message-State: AOJu0YwhJwbf6vRAiI0011uyfS7YfEfAYjz1WiJqs+RjFV7ADw8vEwLO YX8xto4XvgFtVqNCCTyVQiKYdd3hUOPhWjS0c9DcYR3ZaqFNYCYPr6q/1+BHAw== X-Gm-Gg: AfdE7cmqPBv1yOlJ4j/kLyIdHlOYOi0lcbbCFJDxs5H0IxA3BTd2xz6haWMqn2snnkf lEs6iCRwGXPR+aIeY0NWC8QGJ2O04OH02J7L4Jk7RAdFdgH/t59ZaX87lL9dGTT4LY5O3kkrsRR U2X0Ggfyokn0yHVbnTv1XNiNDzjXn8fibexKSnEEq+Uk7bPJxWx0mBU6hnr5KRtJsjGLTIE4PG4 hiJSrUl08fuC7B8AniiH7fU9Om0NPkf+S6K0oGlhR1ENkYAlZQJr6KoaKP/cYzRZ9pS15HaPJgI 6Agx2TYTcfFMeshzAS06LWCOS2dW+IaqInSmlIu7P1b0uysBXnJFgsWc1qfG8LHJBE4uabt5XCx RPf7muvlnumxd/wql2sUBbwbbp3Sgkgkx2dcREN59K0U9IIHg1ZRSEPaHaXiz1SKCQ3WanEwRZc tQgOijPNyHY/rtpmrnT9vAasPUnF4lFXuV5BuqA/mqx7J1tgt+HUR+iIXJAGp8+cCglcBg9dnpp eWdaYNRhledWhK72tzfo8odCiZkgPrmPoH7TtZjPFkrfSrxxgrLme0O7rimLO4S8g== X-Received: by 2002:a05:6a00:e18:b0:848:44d2:72a2 with SMTP id d2e1a72fcca58-8488961a7b7mr1123594b3a.27.1783732313978; Fri, 10 Jul 2026 18:11:53 -0700 (PDT) Received: from [192.168.2.3] ([2403:581e:d87e:0:fc2d:ed31:e80e:412d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-848530c5a12sm3751929b3a.5.2026.07.10.18.11.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 18:11:53 -0700 (PDT) From: James Calligeros Date: Sat, 11 Jul 2026 11:11:20 +1000 Subject: [PATCH v4 2/7] ASoC: apple: mca: Separate data & clock port setup Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260711-apple-audio-redux-v4-2-2994d87c2f24@gmail.com> References: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> In-Reply-To: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> To: =?utf-8?q?Martin_Povi=C5=A1er?= , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: asahi@lists.linux.dev, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, James Calligeros X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6207; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=bWPKqHbY/xPPHWUKnzHa8zHFmKVCCvsO/sA6ZKPo+UY=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDFmBM7x2JM2RdL71/at2cra3QQJribum0+LwaQ5L1tya0 2bhfryxYyILgxgXg6WYIsuGJiGP2UZsN/tFKvfCzGFlAhkiLdLAAAQsDHy5iXmlRjpGeqbahnqG RjrGOkYMXJwCMNWzVjH8Uz6sXeoSetB7ncb3N++n/rwrndfmfrniQeS6j/3V/+dJtjIyLNn+Yuv yao+zux5ZdU6R/dF/b+HdnH0Hn9XYqml+9UnUYwEA X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Martin Povi=C5=A1er Up until now FEs were always the clock providers -- feeding the clocks on any ports (BEs) they are attached to. This will soon change and FEs will be allowed to be clock consumers. Once that happens, the routing of clocks and data will to some degree decouple. In advance of the change, make preparations: * Narrow down semantics of what was formerly the 'port_driver' field to refer to clocks only. * On 'startup' of BEs, separate the clock and data aspects of the port setup. Signed-off-by: Martin Povi=C5=A1er Signed-off-by: James Calligeros --- sound/soc/apple/mca.c | 67 ++++++++++++++++--------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c index ebe116f32661..55cdb4e0f0b4 100644 --- a/sound/soc/apple/mca.c +++ b/sound/soc/apple/mca.c @@ -133,8 +133,8 @@ struct mca_cluster { struct clk *clk_parent; struct dma_chan *dma_chans[SNDRV_PCM_STREAM_LAST + 1]; =20 - bool port_started[SNDRV_PCM_STREAM_LAST + 1]; - int port_driver; /* The cluster driving this cluster's port */ + bool port_clk_started[SNDRV_PCM_STREAM_LAST + 1]; + int port_clk_driver; /* The cluster driving this cluster's port */ =20 bool clocks_in_use[SNDRV_PCM_STREAM_LAST + 1]; struct device_link *pd_link; @@ -157,7 +157,7 @@ struct mca_data { struct reset_control *rstc; struct device_link *pd_link; =20 - /* Mutex for accessing port_driver of foreign clusters */ + /* Mutex for accessing port_clk_driver of foreign clusters */ struct mutex port_mutex; =20 int nclusters; @@ -311,7 +311,7 @@ static bool mca_fe_clocks_in_use(struct mca_cluster *cl) for (i =3D 0; i < mca->nclusters; i++) { be_cl =3D &mca->clusters[i]; =20 - if (be_cl->port_driver !=3D cl->no) + if (be_cl->port_clk_driver !=3D cl->no) continue; =20 for_each_pcm_streams(stream) { @@ -331,10 +331,10 @@ static int mca_be_prepare(struct snd_pcm_substream *s= ubstream, struct mca_cluster *fe_cl; int ret; =20 - if (cl->port_driver < 0) + if (cl->port_clk_driver < 0) return -EINVAL; =20 - fe_cl =3D &mca->clusters[cl->port_driver]; + fe_cl =3D &mca->clusters[cl->port_clk_driver]; =20 /* * Typically the CODECs we are paired with will require clocks @@ -360,7 +360,7 @@ static int mca_be_hw_free(struct snd_pcm_substream *sub= stream, struct mca_data *mca =3D cl->host; struct mca_cluster *fe_cl; =20 - if (cl->port_driver < 0) + if (cl->port_clk_driver < 0) return -EINVAL; =20 /* @@ -368,7 +368,7 @@ static int mca_be_hw_free(struct snd_pcm_substream *sub= stream, * belong to the same PCM, accesses should have been * synchronized at ASoC level. */ - fe_cl =3D &mca->clusters[cl->port_driver]; + fe_cl =3D &mca->clusters[cl->port_clk_driver]; if (!mca_fe_clocks_in_use(fe_cl)) return 0; /* Nothing to do */ =20 @@ -708,12 +708,15 @@ static const struct snd_soc_dai_ops mca_fe_ops =3D { .trigger =3D mca_fe_trigger, }; =20 -static bool mca_be_started(struct mca_cluster *cl) +/* + * Is there a FE attached which will be feeding this port's clocks? + */ +static bool mca_be_clk_started(struct mca_cluster *cl) { int stream; =20 for_each_pcm_streams(stream) - if (cl->port_started[stream]) + if (cl->port_clk_started[stream]) return true; return false; } @@ -744,28 +747,38 @@ static int mca_be_startup(struct snd_pcm_substream *s= ubstream, =20 fe_cl =3D mca_dai_to_cluster(snd_soc_rtd_to_cpu(fe, 0)); =20 - if (mca_be_started(cl)) { + if (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { + writel_relaxed(PORT_DATA_SEL_TXA(fe_cl->no), + cl->base + REG_PORT_DATA_SEL); + mca_modify(cl, REG_PORT_ENABLES, PORT_ENABLES_TX_DATA, + PORT_ENABLES_TX_DATA); + } + + if (mca_be_clk_started(cl)) { /* * Port is already started in the other direction. * Make sure there isn't a conflict with another cluster - * driving the port. + * driving the port clocks. */ - if (cl->port_driver !=3D fe_cl->no) + if (cl->port_clk_driver !=3D fe_cl->no) return -EINVAL; =20 - cl->port_started[substream->stream] =3D true; + cl->port_clk_started[substream->stream] =3D true; return 0; } =20 - writel_relaxed(PORT_ENABLES_CLOCKS | PORT_ENABLES_TX_DATA, - cl->base + REG_PORT_ENABLES); writel_relaxed(FIELD_PREP(PORT_CLOCK_SEL, fe_cl->no + 1), cl->base + REG_PORT_CLOCK_SEL); + writel_relaxed(PORT_DATA_SEL_TXA(fe_cl->no), cl->base + REG_PORT_DATA_SEL); + + mca_modify(cl, REG_PORT_ENABLES, PORT_ENABLES_CLOCKS, + PORT_ENABLES_CLOCKS); + scoped_guard(mutex, &mca->port_mutex) - cl->port_driver =3D fe_cl->no; - cl->port_started[substream->stream] =3D true; + cl->port_clk_driver =3D fe_cl->no; + cl->port_clk_started[substream->stream] =3D true; =20 return 0; } @@ -776,17 +789,21 @@ static void mca_be_shutdown(struct snd_pcm_substream = *substream, struct mca_cluster *cl =3D mca_dai_to_cluster(dai); struct mca_data *mca =3D cl->host; =20 - cl->port_started[substream->stream] =3D false; + if (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { + mca_modify(cl, REG_PORT_ENABLES, PORT_ENABLES_TX_DATA, 0); + writel_relaxed(0, cl->base + REG_PORT_DATA_SEL); + } =20 - if (!mca_be_started(cl)) { + cl->port_clk_started[substream->stream] =3D false; + if (!mca_be_clk_started(cl)) { /* * Were we the last direction to shutdown? - * Turn off the lights. + * Turn off the lights (clocks). */ - writel_relaxed(0, cl->base + REG_PORT_ENABLES); - writel_relaxed(0, cl->base + REG_PORT_DATA_SEL); + mca_modify(cl, REG_PORT_ENABLES, PORT_ENABLES_CLOCKS, 0); + writel_relaxed(0, cl->base + REG_PORT_CLOCK_SEL); scoped_guard(mutex, &mca->port_mutex) - cl->port_driver =3D -1; + cl->port_clk_driver =3D -1; } } =20 @@ -1092,7 +1109,7 @@ static int apple_mca_probe(struct platform_device *pd= ev) cl->host =3D mca; cl->no =3D i; cl->base =3D base + CLUSTER_STRIDE * i; - cl->port_driver =3D -1; + cl->port_clk_driver =3D -1; cl->clk_parent =3D of_clk_get(pdev->dev.of_node, i); if (IS_ERR(cl->clk_parent)) { dev_err(&pdev->dev, "unable to obtain clock %d: %ld\n", --=20 2.55.0 From nobody Wed Jul 15 21:24:08 2026 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CF47D22ACFA for ; Sat, 11 Jul 2026 01:11:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732320; cv=none; b=rTJ1to5XqbwXjlmeyyccuM1opHC0PSAougCdi5MFZmoyMopBhsboUnxSmpzqzA9ATmvzkhlu/I1G835AK/PMK/pbkJEinU6RM9FffQbzITdmErnhycDCxZrWIqIq+hDZl8aUQXyfKn6oAFibmRqf/pAzmR0FFgFNpZjiBmyj4O4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732320; c=relaxed/simple; bh=GHpRJg9oxVD6GKahUW6+PTUDA5kAW0ptFe5dE4sEofw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=D5wEl36klQgHSzYMeyg+kOu0gPfEG1ixrzi2jggOfHjfHST5S4slT0Gbp+sOqQT/mlqX4QAytQY7jv0EerH+88AjAdOQzwgo/kRr2FD60RQzKWIk+/keZ41zZDM3XkRJmqEZRIRqWEmyUFHhgGl/2NLMFkTV5m2qUyTuB7DL8pA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=P2cw1H+J; arc=none smtp.client-ip=209.85.210.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="P2cw1H+J" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-845c92bc464so1348570b3a.2 for ; Fri, 10 Jul 2026 18:11:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783732318; x=1784337118; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Ns9UFkQuF2E3pwYAgWuXOFZxiBt3YnXgvvVMaDlLWEk=; b=P2cw1H+J7ljRP/geRxrmIMaAyvWkIzwnxbOpZzHimk8N6vbw0rBCq7jbgEmj5WU4Rv hYtUOORZjwVFBSzoyx6QW3tOaMx13YOvb2iVH9UbvbwqajszEEDI0OecoDqIbIr6Oy3N FuZ0jjlZIRxW2PCL2TUnEytQjalzXJTsND5keXdyiJWdeDWsBrjcwUsSfAZdxKioFqVf LdLtgAlFxqG/X7YUgbV2QNuTq1iC4ZcIDvvrhEaXtkmej1BdoFOCr/ZFXZCE4yMPljW5 VWT+soaK7nHzk52hOs+5RIcrj2iWRtQSJTIXhmIfb4kHDpN+nX1fae59b7MPUvMJvpvJ OSng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783732318; x=1784337118; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Ns9UFkQuF2E3pwYAgWuXOFZxiBt3YnXgvvVMaDlLWEk=; b=LP600a/lqguwubRSh8WyEyfdQretX7qOWJ/KaJGP1+DdB1LNKrDAms2P5D50WME6JK PC+4zOJrru/rbNGXfZAFcL/1rfBDOxpHjYAQGAifqnXT/PdkxU0g5MJpa3r+rSS7oGlT m/2DZKuNmrSvcikmmUEFYLs/NfLKcKJ9sirJY3NraqLZbzJgOrdYdHTDgQZoNP4pAOUk ElPK39CsPzPTI+k3ExKAfH30vps++c5SnuUllpiOf7YB4GW60540MHfjhj9/LxU3AYOB tFaiNzMAZloZfIn9aLuhR349Hn+K9jPXq+2Aa3FpPUx8zjerLLKzhn9ElavLUW9G9Glk thyQ== X-Forwarded-Encrypted: i=1; AHgh+Rr/5XYrcl4749aJe1OoOZjWuLdBVKXvWSmHlcjIdwj30PA8VDJvPj+SL90WiUFb75UXQLamlivXJYpEKQU=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9rkVWt5xCuTarhTx7HR0j0gm5Epc06hD4G/lrK2QQCHW/fmNg A0VnCUeTrcxTsPrEY6Co1JNo/3kOdPJguIgyCRy1u6DScn9BMEEc8wbfgH+Wuw== X-Gm-Gg: AfdE7clzbnQeix+OFdBhNRzLxcikInCZgOzMKRdTXy5BKRCnewuIigkY8uQY1m2JLYI vou/zDjPmmRYTqbOj9y1TRp9KxXsiKZ1imPjfjtwGT/xUIdvpfUoJwer/vCJoOmbbrvCy78yx6d pONZs/qLi8x5za3d7ey8OyI+fMvclI5Gek3NsTdM4+yv0EsOv2PFZj47h7Sg4k8jJQM7zuxNZW0 7ZOLrpFqbNZHr5GriC6ZnRdp9wX/sNXjtD0w/wsW8KlxFrspdlYOH0TGH997iBLKdOUOUyw9zJs yYl7IQ6IFh6fAc8P3QfaAE2VKlY58Anstq06j1gxgGtVHxu3om2qXMLGqrgnBqiIsdc86E/i+zU EDfPn5oXb7Td2cnxEZaCDrMT6+WV9XxMSw0I50JoytFgALpJPBeXR+WeQSDZSndYsMDiToGQvTv mKpUm2WxPr9hGyJThRliRIpnNFP5YaAAcHzM4ggWyIevmYVhwxyTAK5bwiJHr8BqHmQiNPrz2R1 4GCN+85d6G81VEOfmGM1KsbH1lWeaRbU5wpx2Sr+DnySApcD1JlnrLHMLVxwTz6Cg== X-Received: by 2002:a05:6a00:448a:b0:848:2f74:1d5e with SMTP id d2e1a72fcca58-8488972ebb9mr1061334b3a.68.1783732318176; Fri, 10 Jul 2026 18:11:58 -0700 (PDT) Received: from [192.168.2.3] ([2403:581e:d87e:0:fc2d:ed31:e80e:412d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-848530c5a12sm3751929b3a.5.2026.07.10.18.11.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 18:11:57 -0700 (PDT) From: James Calligeros Date: Sat, 11 Jul 2026 11:11:21 +1000 Subject: [PATCH v4 3/7] ASoC: apple: mca: Factor out mca_be_get_fe Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260711-apple-audio-redux-v4-3-2994d87c2f24@gmail.com> References: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> In-Reply-To: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> To: =?utf-8?q?Martin_Povi=C5=A1er?= , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: asahi@lists.linux.dev, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, James Calligeros X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1985; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=gZo+qAecjsjEu2IDUW/qEj1Tcf3OnB55qMCIoJb2Flk=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDFmBM7yVJ9Zo2iWUT+6+N/80++qjtZbxSdZshU57U+umq akEtgV2TGRhEONisBRTZNnQJOQx24jtZr9I5V6YOaxMIEOkRRoYgICFgS83Ma/USMdIz1TbUM/Q SMdYx4iBi1MApvpQJiPDhsXiuzZGKS176hOaczYz4oVlp/b8vSsSXxdscaw6EOM0i5Hh0PeNawI Wn5bt1+eX2SQUXLPMaFHy162KuY/7bTJnbX7CCAA= X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Martin Povi=C5=A1er This is a function that we also want to use from within mca_be_shutdown, so factor it out. Signed-off-by: Martin Povi=C5=A1er Signed-off-by: James Calligeros --- sound/soc/apple/mca.c | 31 ++++++++++++++----------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c index 55cdb4e0f0b4..1e9a5c9cfc54 100644 --- a/sound/soc/apple/mca.c +++ b/sound/soc/apple/mca.c @@ -721,30 +721,35 @@ static bool mca_be_clk_started(struct mca_cluster *cl) return false; } =20 -static int mca_be_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) +static struct snd_soc_pcm_runtime *mca_be_get_fe(struct snd_soc_pcm_runtim= e *be, + int stream) { - struct snd_soc_pcm_runtime *be =3D snd_soc_substream_to_rtd(substream); - struct snd_soc_pcm_runtime *fe; - struct mca_cluster *cl =3D mca_dai_to_cluster(dai); - struct mca_cluster *fe_cl; - struct mca_data *mca =3D cl->host; + struct snd_soc_pcm_runtime *fe =3D NULL; struct snd_soc_dpcm *dpcm; =20 - fe =3D NULL; - - for_each_dpcm_fe(be, substream->stream, dpcm) { + for_each_dpcm_fe(be, stream, dpcm) { if (fe && dpcm->fe !=3D fe) { - dev_err(mca->dev, "many FE per one BE unsupported\n"); - return -EINVAL; + dev_err(be->dev, "many FE per one BE unsupported\n"); + return NULL; } =20 fe =3D dpcm->fe; } =20 + return fe; +} + +static int mca_be_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *be =3D snd_soc_substream_to_rtd(substream); + struct snd_soc_pcm_runtime *fe =3D mca_be_get_fe(be, substream->stream); + struct mca_cluster *cl =3D mca_dai_to_cluster(dai); + struct mca_cluster *fe_cl; + struct mca_data *mca =3D cl->host; + if (!fe) return -EINVAL; - fe_cl =3D mca_dai_to_cluster(snd_soc_rtd_to_cpu(fe, 0)); =20 if (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { --=20 2.55.0 From nobody Wed Jul 15 21:24:08 2026 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D0E3A244694 for ; Sat, 11 Jul 2026 01:12:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732324; cv=none; b=EbdnsfDTGZhmsnXHgtqgExYsdFcHiEnj3ggTwpsNjxeJ3haMaNF0/7c+e+ORnZC9C99dSS4dZROwCnRt3eU718uJqiAbNaIHyhvKlBEW3At09Akrx070bX2cX0RWz+prlmkg6VylL0HnkaqNRI/iLmSK6SUoQLYL3uslPVQnXcs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732324; c=relaxed/simple; bh=hsiZfdFeQ2D+g5v0NXSz07lWdCQawXUkZPcmZz11vVE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fkDCIU7iKgv31W9VogoFPQSiQ8DiTRgyMFDotfRFITfxkeytBxBEkN7eykkcnXJqFL5GcDKNfwI+ikHCbyyGy2jRbnmWy9/kYTJrR/57dv2tUd6eFeqlsY/6Bm+SqIqnDDN8+H2JSC6lkW6XO4ucMkGOp2vLec3wbUfuA+d7DDk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZZcX0hnl; arc=none smtp.client-ip=209.85.210.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZZcX0hnl" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-8487b7b3fc8so1059723b3a.3 for ; Fri, 10 Jul 2026 18:12:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783732322; x=1784337122; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xWXvW/d32rE+ZsswBcpmlmtcJ/j0K/HsxgukixLnv5k=; b=ZZcX0hnlYfYnwEF5JjBkkfwLEyBecbvKvVdHZI+gJgGAbC3SwoDJu6/PcisWUG3NXU Fd1QKWuEMXOb59Mprw39/Ijn2MfBHiIH5aSC0NvgT8kKL27cFiDVKs8vKU5TAtWyZsPj opc8GAOkaGKKACLYPEfHFzVKS3yeWdMpXVkt9uAIBW3xLPXhuVyAs/mUeh/QbrKjliaN ++3uHjyQx3YEmPql0cyuAI69qZW4XYxWvZWufeQ/XkjuiPOIyhJnNsYnvATV7LOjoMva 5udJ/fxANtdXlkjdjE6msdLDXmZJZXsQ6wCkFwO3/wFF/C1BjA6e1kxG5/Hq3JkzVKnS 47Tg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783732322; x=1784337122; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=xWXvW/d32rE+ZsswBcpmlmtcJ/j0K/HsxgukixLnv5k=; b=irnApRdbfzb9ZxjoCIYLXBky6TtF10MKgvVJt/QQtWZnLKXXG+lWEVXWhoK6O2VF+T rPePQRKpGOW32rkvAipEvZzd+vKuKyJsv48i/Je7z6zI3sso6uXCjox88SVXxzdrGPty aDW3qbqjaGE9RbHuCNhYjX/YkoPLV4lbziozMqVIG2NBXYiO7XKw8nj0GHD+/+KBW+mw x+VP0+mAd1Rde/hGYMuPmVVneViB0yJzK4u2tRdaenCVssBOdlm4wA2vVZs5hYj1K5bz Iu15s0B/8935lkWlWaaTmrm2qCy8zP1YVxTkaIdlVyDhQRq+GD3rkIQgjYnXxEGB3K1S 5RLw== X-Forwarded-Encrypted: i=1; AHgh+Ro4tOZ1y8+KKbZuNU2PskgG/iVwARt+XPXSYTlswZnEkGsve2/qLfgsvDuST6Wly3mGA2N4YZ+3W2ltogo=@vger.kernel.org X-Gm-Message-State: AOJu0Ywa9QquEIJ42R+st4Aly0HRPAuWBafp5ox4lPRAnehG9eebnaES 4b56rWfM6gIJw+z6TUG09LIbTVmakvhNei2L+pRUCb9vqOBsZsqvoMH9f6SEsQ== X-Gm-Gg: AfdE7cmSDhaTA3kdBtSuZlmka+qpRzE7K0G3bk3t939lx3riAl72oSKrw3eBheIMth3 IPOggpA0PnbuwK9Lv5qdln+s4crLo8m8B9SieuMrBuI4BdbThSRAir9q+0R/UT+6PHkU2wk/ng9 RtLbNCG2B5eUeJFaom8r3RWy09naxyk6WOESFwtSRyzWR8xOvl7zmqwYx/Olhg/IrJ9LUJEDkXb mZRH7wNqNvlwJ/Iv4NLvOJqfE56I68LtKenwDSn21i50nFxl1RQQ/fb8uEbQk65EHC06e4bDJX2 EghXguOxglVfKJzwME2sS5tvciettELORoKImRLwekWR464zHnoqREON4s6JLaB8vCcBwHh9L0n WnM7nK9VEDWzuHUF54zYsp7KRwT1/cfIzV2pm7OQxzulYa+LiDyORsoPGpbw7cmbM/uHXd9ZVsV 0eIgZBpuZm/yuHG44y0XTstwKT686ORdDpsaPYSu7q6rEIg2lQfhsZRoZwarxnTOQVNg0PNtctn ntCdGHmwm1n6zXBhV2s+aT+zN0zqYqrGkv5QtuXadcu9Ko82nbxkKgwgzFRAtY9Jw== X-Received: by 2002:a05:6a00:9515:b0:848:79aa:5d37 with SMTP id d2e1a72fcca58-8488976f68dmr1100276b3a.55.1783732322210; Fri, 10 Jul 2026 18:12:02 -0700 (PDT) Received: from [192.168.2.3] ([2403:581e:d87e:0:fc2d:ed31:e80e:412d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-848530c5a12sm3751929b3a.5.2026.07.10.18.11.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 18:12:01 -0700 (PDT) From: James Calligeros Date: Sat, 11 Jul 2026 11:11:22 +1000 Subject: [PATCH v4 4/7] ASoC: apple: mca: Support FEs being clock consumers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260711-apple-audio-redux-v4-4-2994d87c2f24@gmail.com> References: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> In-Reply-To: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> To: =?utf-8?q?Martin_Povi=C5=A1er?= , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: asahi@lists.linux.dev, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, James Calligeros X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6641; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=HGFc7Bs6efxQPRt87AL1RvM9nIpRzzqEdF6rtxgMhd0=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDFmBM7ynHHDRPixw0uOYp4HGJd//MyfP5xGeaHHa8eqPu rd7m6andExkYRDjYrAUU2TZ0CTkMduI7Wa/SOVemDmsTCBDpEUaGICAhYEvNzGv1EjHSM9U21DP 0EjHWMeIgYtTAKb6y25Ghun+n6Kv6+qc9G0rsD+y6Ifpl5c34iJesUyMWXFGc8XzlVcZ/sfPj1/ 1+73mCk/+JotdT8zrmDY8UPvPLCM4fWWopu++VWwA X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Martin Povi=C5=A1er Support FEs being I2S clock consumers. This does not mean we support accepting clocks from outside the SoC (although it paves the way for that support in the future), but it means multiple FEs can attach to one BE, one being clock producer and the rest clock consumers. This is useful for grabbing I/V sense data on some machines, since in such a scenario the format of the sense data on the I2S bus differs from that of the audio data (the two formats differing in slot width). With two FEs attached to the bus, we can split the responsibilities and command different slot widths to the two. Signed-off-by: Martin Povi=C5=A1er Signed-off-by: James Calligeros --- sound/soc/apple/mca.c | 124 ++++++++++++++++++++----- 1 file changed, 103 insertions(+), 21 deletions(-) diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c index 1e9a5c9cfc54..92c9f8df50d6 100644 --- a/sound/soc/apple/mca.c +++ b/sound/soc/apple/mca.c @@ -133,12 +133,17 @@ struct mca_cluster { struct clk *clk_parent; struct dma_chan *dma_chans[SNDRV_PCM_STREAM_LAST + 1]; =20 + bool clk_provider; + bool port_clk_started[SNDRV_PCM_STREAM_LAST + 1]; int port_clk_driver; /* The cluster driving this cluster's port */ =20 bool clocks_in_use[SNDRV_PCM_STREAM_LAST + 1]; struct device_link *pd_link; =20 + /* In case of clock consumer FE */ + int syncgen_in_use; + unsigned int bclk_ratio; =20 /* Masks etc. picked up via the set_tdm_slot method */ @@ -256,11 +261,32 @@ static int mca_fe_trigger(struct snd_pcm_substream *s= ubstream, int cmd, return 0; } =20 +static int mca_fe_get_port(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *fe =3D snd_soc_substream_to_rtd(substream); + struct snd_soc_pcm_runtime *be; + struct snd_soc_dpcm *dpcm; + + be =3D NULL; + for_each_dpcm_be(fe, substream->stream, dpcm) { + be =3D dpcm->be; + break; + } + + if (!be) + return -EINVAL; + + return mca_dai_to_cluster(snd_soc_rtd_to_cpu(be, 0))->no; +} + static int mca_fe_enable_clocks(struct mca_cluster *cl) { struct mca_data *mca =3D cl->host; int ret; =20 + if (!cl->clk_provider) + return -EINVAL; + ret =3D clk_prepare_enable(cl->clk_parent); if (ret) { dev_err(mca->dev, @@ -332,7 +358,7 @@ static int mca_be_prepare(struct snd_pcm_substream *sub= stream, int ret; =20 if (cl->port_clk_driver < 0) - return -EINVAL; + return 0; =20 fe_cl =3D &mca->clusters[cl->port_clk_driver]; =20 @@ -380,6 +406,56 @@ static int mca_be_hw_free(struct snd_pcm_substream *su= bstream, return 0; } =20 +static int mca_fe_prepare(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct mca_cluster *cl =3D mca_dai_to_cluster(dai); + struct mca_data *mca =3D cl->host; + + if (cl->clk_provider) + return 0; + + /* Turn on the cluster power domain if not already in use */ + if (!cl->syncgen_in_use) { + int port =3D mca_fe_get_port(substream); + + cl->pd_link =3D device_link_add(mca->dev, cl->pd_dev, + DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | + DL_FLAG_RPM_ACTIVE); + if (!cl->pd_link) { + dev_err(mca->dev, + "cluster %d: unable to prop-up power domain\n", cl->no); + return -EINVAL; + } + + mca_modify(cl, REG_SYNCGEN_MCLK_SEL, SYNCGEN_MCLK_SEL, BIT(port)); + mca_modify(cl, REG_SYNCGEN_STATUS, SYNCGEN_STATUS_EN, + SYNCGEN_STATUS_EN); + } + cl->syncgen_in_use |=3D 1 << substream->stream; + + return 0; +} + +static int mca_fe_hw_free(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct mca_cluster *cl =3D mca_dai_to_cluster(dai); + + if (cl->clk_provider) + return 0; + + cl->syncgen_in_use &=3D ~(1 << substream->stream); + if (cl->syncgen_in_use) + return 0; + + mca_modify(cl, REG_SYNCGEN_STATUS, SYNCGEN_STATUS_EN, 0); + if (cl->pd_link) + device_link_del(cl->pd_link); + + return 0; +} + static unsigned int mca_crop_mask(unsigned int mask, int nchans) { while (hweight32(mask) > nchans) @@ -505,9 +581,18 @@ static int mca_fe_set_fmt(struct snd_soc_dai *dai, uns= igned int fmt) u32 serdes_conf =3D 0; u32 bitstart; =20 - if ((fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) !=3D - SND_SOC_DAIFMT_BP_FP) + switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { + case SND_SOC_DAIFMT_BP_FP: + cl->clk_provider =3D true; + break; + + case SND_SOC_DAIFMT_BC_FC: + cl->clk_provider =3D false; + break; + + default: goto err; + } =20 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: @@ -564,24 +649,6 @@ static int mca_set_bclk_ratio(struct snd_soc_dai *dai,= unsigned int ratio) return 0; } =20 -static int mca_fe_get_port(struct snd_pcm_substream *substream) -{ - struct snd_soc_pcm_runtime *fe =3D snd_soc_substream_to_rtd(substream); - struct snd_soc_pcm_runtime *be; - struct snd_soc_dpcm *dpcm; - - be =3D NULL; - for_each_dpcm_be(fe, substream->stream, dpcm) { - be =3D dpcm->be; - break; - } - - if (!be) - return -EINVAL; - - return mca_dai_to_cluster(snd_soc_rtd_to_cpu(be, 0))->no; -} - static int mca_fe_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -706,6 +773,8 @@ static const struct snd_soc_dai_ops mca_fe_ops =3D { .set_tdm_slot =3D mca_fe_set_tdm_slot, .hw_params =3D mca_fe_hw_params, .trigger =3D mca_fe_trigger, + .prepare =3D mca_fe_prepare, + .hw_free =3D mca_fe_hw_free, }; =20 /* @@ -759,6 +828,9 @@ static int mca_be_startup(struct snd_pcm_substream *sub= stream, PORT_ENABLES_TX_DATA); } =20 + if (!fe_cl->clk_provider) + return 0; + if (mca_be_clk_started(cl)) { /* * Port is already started in the other direction. @@ -791,14 +863,24 @@ static int mca_be_startup(struct snd_pcm_substream *s= ubstream, static void mca_be_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { + struct snd_soc_pcm_runtime *be =3D snd_soc_substream_to_rtd(substream); + struct snd_soc_pcm_runtime *fe =3D mca_be_get_fe(be, substream->stream); struct mca_cluster *cl =3D mca_dai_to_cluster(dai); + struct mca_cluster *fe_cl; struct mca_data *mca =3D cl->host; =20 + if (!fe) + return; + fe_cl =3D mca_dai_to_cluster(snd_soc_rtd_to_cpu(fe, 0)); + if (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { mca_modify(cl, REG_PORT_ENABLES, PORT_ENABLES_TX_DATA, 0); writel_relaxed(0, cl->base + REG_PORT_DATA_SEL); } =20 + if (!fe_cl->clk_provider) + return; + cl->port_clk_started[substream->stream] =3D false; if (!mca_be_clk_started(cl)) { /* --=20 2.55.0 From nobody Wed Jul 15 21:24:08 2026 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A4F2723ED6A for ; Sat, 11 Jul 2026 01:12:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732329; cv=none; b=sL4yjbqEnGWthwTJozFKHHCYb2jLU527HXn1cJKR+JLqvXkK0kY3sokBe79gVLkzbtzn5S97WH+xu3VzZvfwNfkg/SPBifCX9S3ShLYGWZTwaT3de3s1GKJvSqbinchXodPJb7OXTB29bnT1VoskizQOl0Qkyy7/5sSq4qlBcns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732329; c=relaxed/simple; bh=svz2FgPyjN32jteRJSJZimrDV+MMYVIwx01Yxmk+cmk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AI1suJ3/6IQbQnrpmyFQMYn0myAaCv1AN1PomVL8ZfT2anzUgJ02Fv308NKxmT+ovIMmU3Fpgm1soosYBR0asV1+fh55IwwyKhTZUnkbDuvs44G7T0anMfN84thkEyNR6r2nPgRDa3vMP6hAjF3TXmjNQUGXn+2Judcc/ojX+58= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=rswzA7Gs; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rswzA7Gs" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-8487214ad2bso1966879b3a.1 for ; Fri, 10 Jul 2026 18:12:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783732327; x=1784337127; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=/c5wuyLR3HS7R6zL7H7EF7xHtYEbjQ3kyBPp9V64GBc=; b=rswzA7GslFlLb5BpVz99nE0eOPvFIhXeXeKGhEQ6ZUC6QmVZGHPZ3Bld0eOed/DbxU rT+42231JVcFwZMbPkcd4J+unNgJLfo4VCECWiV9jwdCUn3llGOawdKK/kYrLPioDyDZ EbIwF3LtPbJOjWae4E1i3fJOK96TGmyxVOLrIcxsRsB02C5lSHUQhncwddCfG/lHLp9l 1oDYaUg7rT6qin9jSSZpSejoM9nmWDh9WwxM1fm3wxOv4nP1lyWqfgI+3neVKzvwIVt5 oANoHw2VblCo6iFTZp8Hhl+ej/qtm3dRVzwGbylMxC6snJbdJpyJ4hyETjxi0+g0l6U2 lN/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783732327; x=1784337127; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=/c5wuyLR3HS7R6zL7H7EF7xHtYEbjQ3kyBPp9V64GBc=; b=IamI3tNl8EmCBUP0jwVdzGokt5yDqFRKkR5VZ1WKPDhQAyGtpNeUfEZEfBjrJxXKKS OUuWVMZZZ6ykJoDKmoGlm+jsusb3Jv+Q/TwAjmPtiW566jSKkPRcgsY+sWBqoNtuyKcl 1+qdOXsMVY44uXbTUxCyrnWrhGgInK07A1r1PFCXfSKPUSdxrZKN/XWIOs2ORXMsKuh6 utLCcprO5zfLlelKmx9qmXRg4n2IS6EL22N4TVHNNZSGxB1FUrsEoZ+buOUOAdV06ejm bson3SbKTSSI9Dalmr2nUjMBQGU+quZqBJN5loaMfOLGWzJ4zuoGuy2dsWGi7crrUSTh J2ag== X-Forwarded-Encrypted: i=1; AHgh+RpO35ORWThrezAhRIoWTlPMs5Otg1MKBC4FLai8SWyF3bIxp/wdWNfX4tGv9cKsr6cdEo55HL+9O2Ixh4s=@vger.kernel.org X-Gm-Message-State: AOJu0YyO3Z5o1QzXSkN+Q/gLKrs2KBSmAD8LLvaJqNwFFP5eP7bbXBo+ /A2NAMQX6omyrke8+DhreN/aKWXdcP3TPdZZr7c1HSzP7IWwp+Gb4fTUinvoaA== X-Gm-Gg: AfdE7cnNXBLKBExPBJQyWMLH/0WUpJN2/7+VzEXo/Qm4umi9Xw5XmZ4ZJ00nEFW4SyO R6Iti0hGEr8vTTn7N4UMjEUA3XE2SzLp81kJDD9Amltmf0xIf0z+TBVsZ9tgRloUoR2RtOFrY0f gE7pXjfKf1bGq/qYhcqXrndi0Gqno2aRvNlfpWfbmxv6iHyA+fd9JJzqi+xjigTGgvXst/pjjy1 t5cD+4sspNaGBTlb1IynofzKiPcMbgJ14FD4h1GToJWhc1bGrYH1x3f79bg4Jk0yDxvqT0m1qF0 xVnYZB19HbWcLoyKi8/wBXcyNSbV7afe93x7zYwNEDWsfg0JMqm5SzoSr8rmKkhoBP4WjTD4Lsk lglHX7wMUugPKyVmOFHyMV9A/rWj7agM/BmoZpfbyKT4f9t1iloT+nlu1uapkQ1lAWJJtbKedWM /aQpUcEvDRO2RN+BnxHqH7fJdHlhbin7TWuF+6+l7zQ6zIbNRbf/GlXcVlznuEoepJGMqZNlfzW kEKNuunBlC7/Tltt8j/MLJ6Hc4Intpnp6drVBbPtja/f5D+rNAL/e7+pdN9XEogoBeQvQuH1Bnp X-Received: by 2002:a05:6a00:2d9e:b0:848:2f77:e2e2 with SMTP id d2e1a72fcca58-848897ac31amr1087930b3a.75.1783732326973; Fri, 10 Jul 2026 18:12:06 -0700 (PDT) Received: from [192.168.2.3] ([2403:581e:d87e:0:fc2d:ed31:e80e:412d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-848530c5a12sm3751929b3a.5.2026.07.10.18.12.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 18:12:06 -0700 (PDT) From: James Calligeros Date: Sat, 11 Jul 2026 11:11:23 +1000 Subject: [PATCH v4 5/7] ASoC: apple: mca: Support capture on multiples BEs Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260711-apple-audio-redux-v4-5-2994d87c2f24@gmail.com> References: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> In-Reply-To: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> To: =?utf-8?q?Martin_Povi=C5=A1er?= , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: asahi@lists.linux.dev, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, James Calligeros X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3502; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=sZ/i3SB9vpC4tUFYF7qGww/Qs4mlMyHC7q5JOvKZBTk=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDFmBM7ylTj08qvFEIWRB/pfKVTzy8pos6gbnF+U1TUx9x fnajrm4YyILgxgXg6WYIsuGJiGP2UZsN/tFKvfCzGFlAhkiLdLAAAQsDHy5iXmlRjpGeqbahnqG RjrGOkYMXJwCMNX1DxkZZm1dpLXW72lKtdPTaLO5B1Zof6vatr9f1XFzd5Kbip64OMNv1qMRzgV 21ouWnr6vN+Pzxbrlx3km8DizsOeqW0cr+ZcwAQA= X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Martin Povi=C5=A1er When multiple BEs are linked to a FE, the former behavior was to source the data line from the DIN pin of the first BE only. Change this to ORing the DIN inputs of all linked BEs. As long as the unused slots on each BE's line are zeroed out and the slots on the BEs don't overlap, this will work out well. Signed-off-by: Martin Povi=C5=A1er Signed-off-by: James Calligeros --- sound/soc/apple/mca.c | 31 +++++++++++-------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c index 92c9f8df50d6..d8973e5611dd 100644 --- a/sound/soc/apple/mca.c +++ b/sound/soc/apple/mca.c @@ -261,22 +261,19 @@ static int mca_fe_trigger(struct snd_pcm_substream *s= ubstream, int cmd, return 0; } =20 -static int mca_fe_get_port(struct snd_pcm_substream *substream) +static int mca_fe_get_portmask(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *fe =3D snd_soc_substream_to_rtd(substream); - struct snd_soc_pcm_runtime *be; struct snd_soc_dpcm *dpcm; + int mask =3D 0; =20 - be =3D NULL; for_each_dpcm_be(fe, substream->stream, dpcm) { - be =3D dpcm->be; - break; - } + int no =3D mca_dai_to_cluster(snd_soc_rtd_to_cpu(dpcm->be, 0))->no; =20 - if (!be) - return -EINVAL; + mask |=3D 1 << no; + } =20 - return mca_dai_to_cluster(snd_soc_rtd_to_cpu(be, 0))->no; + return mask; } =20 static int mca_fe_enable_clocks(struct mca_cluster *cl) @@ -417,7 +414,7 @@ static int mca_fe_prepare(struct snd_pcm_substream *sub= stream, =20 /* Turn on the cluster power domain if not already in use */ if (!cl->syncgen_in_use) { - int port =3D mca_fe_get_port(substream); + int port =3D ffs(mca_fe_get_portmask(substream)); =20 cl->pd_link =3D device_link_add(mca->dev, cl->pd_dev, DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | @@ -466,7 +463,7 @@ static unsigned int mca_crop_mask(unsigned int mask, in= t nchans) =20 static int mca_configure_serdes(struct mca_cluster *cl, int serdes_unit, unsigned int mask, int slots, int nchans, - int slot_width, bool is_tx, int port) + int slot_width, bool is_tx, int portmask) { __iomem void *serdes_base =3D cl->base + serdes_unit; u32 serdes_conf, serdes_conf_mask; @@ -525,7 +522,7 @@ static int mca_configure_serdes(struct mca_cluster *cl,= int serdes_unit, serdes_base + REG_RX_SERDES_SLOTMASK); writel_relaxed(~((u32)mca_crop_mask(mask, nchans)), serdes_base + REG_RX_SERDES_SLOTMASK + 0x4); - writel_relaxed(1 << port, + writel_relaxed(portmask, serdes_base + REG_RX_SERDES_PORT); } =20 @@ -662,7 +659,7 @@ static int mca_fe_hw_params(struct snd_pcm_substream *s= ubstream, unsigned long bclk_ratio; unsigned int tdm_slots, tdm_slot_width, tdm_mask; u32 regval, pad; - int ret, port, nchans_ceiled; + int ret, portmask, nchans_ceiled; =20 if (!cl->tdm_slot_width) { /* @@ -711,13 +708,13 @@ static int mca_fe_hw_params(struct snd_pcm_substream = *substream, tdm_mask =3D (1 << tdm_slots) - 1; } =20 - port =3D mca_fe_get_port(substream); - if (port < 0) - return port; + portmask =3D mca_fe_get_portmask(substream); + if (!portmask) + return -EINVAL; =20 ret =3D mca_configure_serdes(cl, is_tx ? CLUSTER_TX_OFF : CLUSTER_RX_OFF, tdm_mask, tdm_slots, params_channels(params), - tdm_slot_width, is_tx, port); + tdm_slot_width, is_tx, portmask); if (ret) return ret; =20 --=20 2.55.0 From nobody Wed Jul 15 21:24:08 2026 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4DD2523D2A1 for ; Sat, 11 Jul 2026 01:12:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732333; cv=none; b=eiBAY70X0O9TRYFVzbkfHmxLWlrmidpZb2QXJKBlhxA/AcPIjk3VjKT5Gp3BuUWisNvRiR+XOrpAxrc1/k7vzcREUwiV35pXXnRauIkdpKcLBHcOuGniCmBy0mcBfnAOxZJHsTmiReC90bcIbrVMBXNCDjoC2eyjuv8ceypZMK0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732333; c=relaxed/simple; bh=u3feU+XxbkxG//8hCT8B0WoV0SQtpDUBimXlIjrgWBA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qSeNFQzkIs463Q6x3gGOCpFyXL8lywPK2OtgXAGC2zVyoQr7N5LGqp3GabM1coEKKE4oKI+pAnmMbscvfloVurrzXH/O2BjR8GviLMVfLEKopG+ZIAcTkExWrdgr/LQsZKp04katOevDJsJ1y132QxDkKGlSN5hNXamT1Nv1bCI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=refGNDhA; arc=none smtp.client-ip=209.85.215.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="refGNDhA" Received: by mail-pg1-f173.google.com with SMTP id 41be03b00d2f7-c966b9ee9cbso723634a12.1 for ; Fri, 10 Jul 2026 18:12:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783732331; x=1784337131; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=mN+pJBIMoW7rE9Ren2+zTaJ8YB+31uYcQku98tORliE=; b=refGNDhABTSRuhaPnsLxEvdztlsXXTo9l/CH6tKrbhGeGmM7mQaOCrowyaJNVoRXVa j58bI7oSjfVqxpdLTA5tD3583HpS4RTBzUNXMT5BL1UvoAlEBp76wbDnKAPYdWhqVlVk kaFaQu21eBIyhj2iQnh6sEmyAMIp1CTahjM7o5fUu9Cm4OutYPW/TJmzH2OmpOT5BIJQ B38AQSEWg6sF5IxIOAusLDllhBBD7uDexzofjuFxgeIIID4IAPBzfFEXU5hTsRjouRYs 81mwP3NL2hnUfz4VAkK+QwLTegLcajrzbA9JgH7OTmlSaWeqzbMKZetNzA17bH7cFmE7 xBpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783732331; x=1784337131; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=mN+pJBIMoW7rE9Ren2+zTaJ8YB+31uYcQku98tORliE=; b=EuxFH6XveTB87Ffx58YT8Nl1LqWNgsw7dUqILYod4MskvB6pGr9AGmEVJtkawEJ1+n m/9Tfbn7DId1a2Svjvk3f6TfGxO4oesYabypz7GXqa0/G5A0C3O/aVV1j7/5j1vheqlA //ueJwT/qlLaMi6Z1+ZdBM3n8q/36gakZs7OBwKKjODs3lwoaU0tmh6YiG7LdhoSnfds 3a2uDm9j0Lz0iG1iSwyM+VBzGfmTWEyLxSQOfXMj+FY/UFvGYBdPyRrKpx7XzQeUzx59 sYt+U9S0uC+dvm4wP+C9Fc6hCqUN5fYWmPypJaVR3vbRurjHoKEV4y/6lfNFXR25tMFr ev/g== X-Forwarded-Encrypted: i=1; AHgh+RqqSFUwMdYRZSuEPFS6wwKYsxYW3Vi9zoPueWuJXGpWxlQ67wsJ9RIUFhUT+Qv0Sln6yKL0CBoZKA1LQ24=@vger.kernel.org X-Gm-Message-State: AOJu0YwDcb+DmNXNLQ+wsfRSJnwcLVWJOQa8f5Bc1ZjiFjLKK/atnn7m wybJDlADXMDyFkMEOfdRw6Xt9jJ2urob3bWYK6nbLH6mZQfiXdLBmgFwMl6Tqw== X-Gm-Gg: AfdE7cltHWedYYWOij9ziRIFX7sLa3LPZIEqoUL5O90ZlnYr1Xau8XOUw14kXs2/M/8 WSMpqV1wheu26ZxPnclPCO+T1wqyiMV9362AlmsrPbZuUgT9DmoFN7hCfQxbruMvtlCinF2Ybz8 7InwO/Uz94IOrYDfNbNYulRmjg9FvLMQSzN5vi2it6kcMLitYQOfcasNyE06ivqfrs+Z67jemvi webbcKljKjLOxv7n8Z2iOsasmkraisFsM0n4f/ihOzkvKFciNxVzqftJ71ZGwaku/6wA1bMRPqx /Mr+SX0g9JCUrM8h1nW6/zYkzLa8C4oz6F1huOpzaw1tm6166O2Mm2yMiZ+/4g9/loF/gI42aoB Ql+wJsDdQ+7bzvKDQw4/ZO2t6KsURU5BpyzTAtbLVN28CC/i0h4xITpKOKe9BotDtpIZpL93GUr 1eZIkL+JizET8bbj6vFbFSmjgrfDbTfFfqjjbKFMIT6T1a/h37R+TxMdYyrxkrTTy/iCQKlg3eL o5WQdhBAO4UooT0yg8mnoH3mow9MdRADTJxgElwaVy7xgz70gdfxP9K92hkNzcUV4eLSZ6p83oz X-Received: by 2002:a05:6a00:a212:b0:848:79af:8b2a with SMTP id d2e1a72fcca58-848896863bcmr1132948b3a.27.1783732331483; Fri, 10 Jul 2026 18:12:11 -0700 (PDT) Received: from [192.168.2.3] ([2403:581e:d87e:0:fc2d:ed31:e80e:412d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-848530c5a12sm3751929b3a.5.2026.07.10.18.12.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 18:12:11 -0700 (PDT) From: James Calligeros Date: Sat, 11 Jul 2026 11:11:24 +1000 Subject: [PATCH v4 6/7] ASoC: apple: mca: Do not mark clocks in use for non-providers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260711-apple-audio-redux-v4-6-2994d87c2f24@gmail.com> References: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> In-Reply-To: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> To: =?utf-8?q?Martin_Povi=C5=A1er?= , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: asahi@lists.linux.dev, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, Hector Martin , James Calligeros X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3278; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=oPUxYsS4dAnn3g0MJvrYuVUHiPTpgN/zgb3R1tQjvLc=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDFmBM7xXue//3q0hrTxHXs639vb0HfFLIiYeeZ4eufNMm PPldTv/dUxkYRDjYrAUU2TZ0CTkMduI7Wa/SOVemDmsTCBDpEUaGICAhYEvNzGv1EjHSM9U21DP 0EjHWMeIgYtTAKbao5iRoctnzxqRyJhp3ySWlkW26sUpP3Pd2/DNO/qFashOK+F+L4bfrPJpkY/ 8J7GnHjw8a5pE/M6AJekSn8wKVN+ISgr9LO9jBgA= X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Hector Martin On the speakers PCM, this sequence: 1. Open playback 2. Open sense 3. Close playback 4. Close sense would result in the sense FE being marked as clocks in use at (2), since there is a clock provider (playback FE). Then at (4) this would WARN since there is no driver any more when closing the in use clocks. If (1) and (2) are reversed this does not happen, since the sense PCM is not marked as using the clocks when there is no provider yet. So, check explicitly whether the substream FE is a clock provider in be_prepare, and skip everything if it isn't. Signed-off-by: Hector Martin Signed-off-by: James Calligeros --- sound/soc/apple/mca.c | 67 ++++++++++++++----------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c index d8973e5611dd..322dd8771111 100644 --- a/sound/soc/apple/mca.c +++ b/sound/soc/apple/mca.c @@ -346,36 +346,6 @@ static bool mca_fe_clocks_in_use(struct mca_cluster *c= l) return false; } =20 -static int mca_be_prepare(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct mca_cluster *cl =3D mca_dai_to_cluster(dai); - struct mca_data *mca =3D cl->host; - struct mca_cluster *fe_cl; - int ret; - - if (cl->port_clk_driver < 0) - return 0; - - fe_cl =3D &mca->clusters[cl->port_clk_driver]; - - /* - * Typically the CODECs we are paired with will require clocks - * to be present at time of unmute with the 'mute_stream' op - * or at time of DAPM widget power-up. We need to enable clocks - * here at the latest (frontend prepare would be too late). - */ - if (!mca_fe_clocks_in_use(fe_cl)) { - ret =3D mca_fe_enable_clocks(fe_cl); - if (ret < 0) - return ret; - } - - cl->clocks_in_use[substream->stream] =3D true; - - return 0; -} - static int mca_be_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { @@ -805,6 +775,43 @@ static struct snd_soc_pcm_runtime *mca_be_get_fe(struc= t snd_soc_pcm_runtime *be, return fe; } =20 +static int mca_be_prepare(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct snd_soc_pcm_runtime *be =3D snd_soc_substream_to_rtd(substream); + struct snd_soc_pcm_runtime *fe =3D mca_be_get_fe(be, substream->stream); + struct mca_cluster *cl =3D mca_dai_to_cluster(dai); + struct mca_data *mca =3D cl->host; + struct mca_cluster *fe_cl, *fe_clk_cl; + int ret; + + fe_cl =3D mca_dai_to_cluster(snd_soc_rtd_to_cpu(fe, 0)); + + if (!fe_cl->clk_provider) + return 0; + + if (cl->port_clk_driver < 0) + return 0; + + fe_clk_cl =3D &mca->clusters[cl->port_clk_driver]; + + /* + * Typically the CODECs we are paired with will require clocks + * to be present at time of unmute with the 'mute_stream' op + * or at time of DAPM widget power-up. We need to enable clocks + * here at the latest (frontend prepare would be too late). + */ + if (!mca_fe_clocks_in_use(fe_clk_cl)) { + ret =3D mca_fe_enable_clocks(fe_clk_cl); + if (ret < 0) + return ret; + } + + cl->clocks_in_use[substream->stream] =3D true; + + return 0; +} + static int mca_be_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { --=20 2.55.0 From nobody Wed Jul 15 21:24:08 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE331233943 for ; Sat, 11 Jul 2026 01:12:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732338; cv=none; b=AU2l0hNG1jYKB/EJIH0isGREFltJK1IOQ9fok4pJUapS+LA1fzC5+avnuLTC3izpDdzA+UTTN/0E5q+wb/DYL9ZEFgpr+pSVBX0P0HFc2KqHhIDPVtWd2+2htDoeq+5H/EQ1N/3ZtHOT2cX0+hqlB+rNie3wz+WOH2HH3rxpPcE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783732338; c=relaxed/simple; bh=5F6Wpn2wEPSmmQLDtQuHy5iGCnuqtiFIo0tJtr1nPuA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SLMdybCuc++i09uRRbfERy/R6ha4GJBwpcp97xPaGWbW6uDOqETo8iPnlymSluKwYlTrIMzGptpICKyOYyoV2rT2SfF2MHYHomRKcp2ecPfC+uF+sGrAz6crz/mTEeO2jaKjSlbtQpUAUveHA0MJN5IqxDlqNnB/wEO5a/PqnjI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FxF8muE9; arc=none smtp.client-ip=209.85.210.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FxF8muE9" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-84864b41100so1294284b3a.3 for ; Fri, 10 Jul 2026 18:12:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783732336; x=1784337136; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=BmMcSTCtgId6XKkksH0TURh3OjzppyxEGWxNMVEqaKU=; b=FxF8muE9Nt6NLfLBH9xnRApFRciDF8cm4sRPrQpSrVUvxreYm1jm5MIkmCLhdo8iWb ZkiZNbOoE+xDlTVZ/DFPC3geWrlE5lLOgFDiCvgNj4kr1MDhAIhdQcMeNctOICm1xQZo NFUINhQ4udSei6wMpHUYMh/oQ4JsfYqSS8eibabgzaRp4MqcCankUBUVPn34uzRqHsm8 s034vnSBAFPTY9nhc5CxB/wb4MEZG2GE2vD0sDnOml6GxzkRYsJS3CvZMXGPz8veLAGm NFotKyg7GQhQrgtN0+N9J4XjzpFgtOR30ygICv+2jJsoZ/RYCydezjEwoffuknNOijie TavQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783732336; x=1784337136; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=BmMcSTCtgId6XKkksH0TURh3OjzppyxEGWxNMVEqaKU=; b=EXL9vAM2UNsll16ZmAnkjQnnM8j6NqNJOdQmjycq3Y+RAICnk2PC6FWSzEmfKQLBQJ lySkXYq6xm3BOL3qGHabyXaLCZfV4zQpSOHATfYlib4hQg0/XR2fjycLoOGZS5qHgZ2z EiRIsiiXvNLhaNBNRwMKTrS/vZ4KkKSmWSjaHI/Dr+kmONylzhcUFbw3ERP2+V+i+If0 oPuBNpml2zOLgAzT0KcN6SciOZFabL1O7rKtjveULzhKjo2Zn4tR1LbYOpJBH0aKezWm K7BI0xEEPicSz1FBdJmXUvYOhHfKX3Mwm7B2LPDXOtpxNYC2G8ei0JXCkE6vcOPe3x+R MRTg== X-Forwarded-Encrypted: i=1; AHgh+Rp983fckDfeeOX6kZLmE26ZMN49sK33Hyc4IWz1vnLnwBijNfFxHJHHQFyH4P8aPBzdK9+7Wf8aco85Hs8=@vger.kernel.org X-Gm-Message-State: AOJu0Yye3NENCRd5proy5y0hgjjNRI/46LEgukDaNjP+FMRpHGUy51VP bYVEXvBXRyH0Mv3aJx1SpfAmhemsb1QlcwsMbRbrsjIt2aGKzsVuOTP/7/DxhQ== X-Gm-Gg: AfdE7cmDLLKt9n3ACpwH3x4aa9xQA6KDpCXso6nuGJ0DppDJmJQJUf++BPK+4eDZSq3 Pc/ZrXIB+aWYAI6bsbazsyE6IOqgdP0dZA1/VXU7YYfb7K00IPFeYC4g0zPdOyCyX4iHN11eol6 +lg28jZcqYsoubGT6Xa01LkxzM7gD7IjT4l+u3g4W7R1QPrpNCTPQ5oK6CpxdP8alRqeiD6I9/S IgFzwRb6us8Nt76xHUoQANnVgxzvXS4FT9v/iiCmlW/lh8hxtoQXUM7F6OrpZ49oT/esUOdTHjZ /XhHXLFy/rsD/dGv2J/drjYo8iNN9ysI5Xhl/wMbNs0VsjS4+oJot2Y+3lrC7q8xlDrvHlST2+O hi0RrKzTqHrdUXEkYclIsbX/DCGYEth5FXy/vmu6UKhKS5E7ITlOjWb6JLFFu4f0+TiUj0nbDyJ fmb7JD6Gapm+vJOAdmXT4pUI+GFq8xJUODPMhvASiOp1y7M1NswRY2QYSnsympf2RrACVxLZYa9 h9TW88vwe5ZNQh/deieuPh72H6vnBckXVzj4gHy1oBlmsvXG/OHRVDpnPly/FUuEQ== X-Received: by 2002:a05:6a00:139c:b0:848:4c3d:659f with SMTP id d2e1a72fcca58-8488990d0b4mr1091981b3a.75.1783732336282; Fri, 10 Jul 2026 18:12:16 -0700 (PDT) Received: from [192.168.2.3] ([2403:581e:d87e:0:fc2d:ed31:e80e:412d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-848530c5a12sm3751929b3a.5.2026.07.10.18.12.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 18:12:15 -0700 (PDT) From: James Calligeros Date: Sat, 11 Jul 2026 11:11:25 +1000 Subject: [PATCH v4 7/7] ASoC: apple: mca: Add delay after configuring clock Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260711-apple-audio-redux-v4-7-2994d87c2f24@gmail.com> References: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> In-Reply-To: <20260711-apple-audio-redux-v4-0-2994d87c2f24@gmail.com> To: =?utf-8?q?Martin_Povi=C5=A1er?= , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: asahi@lists.linux.dev, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, Hector Martin , James Calligeros X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1040; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=YuGvJxGd7rMKWAmYwBfPtKfCWVffFa0TGyJifMJaBa0=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDFmBM7yV9qluP/feca3d3d46e3/JI5sObNq/6039+WU8t 7nqv7CrdkxkYRDjYrAUU2TZ0CTkMduI7Wa/SOVemDmsTCBDpEUaGICAhYEvNzGv1EjHSM9U21DP 0EjHWMeIgYtTAKbaR4Dhf9r3Z9Gn2WWEWJZHTq4yZGU9cHiKtmqAnoWgj/7bcrEZ9YwMTVL3P7F Ebr/It3yGMZdyxPVMzUyWbxk9D7YtDFh1MNmeAwA= X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Hector Martin Right after the early FE setup, ADMAC gets told to start the DMA. This can end up in a weird "slip" state with the channels transposed. Waiting a bit fixes this; presumably this allows the clock to stabilize. Signed-off-by: Hector Martin Signed-off-by: James Calligeros --- sound/soc/apple/mca.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c index 322dd8771111..afb3754a8883 100644 --- a/sound/soc/apple/mca.c +++ b/sound/soc/apple/mca.c @@ -225,6 +225,12 @@ static void mca_fe_early_trigger(struct snd_pcm_substr= eam *substream, int cmd, FIELD_PREP(SERDES_CONF_SYNC_SEL, 0)); mca_modify(cl, serdes_conf, SERDES_CONF_SYNC_SEL, FIELD_PREP(SERDES_CONF_SYNC_SEL, cl->no + 1)); + /* + * ADMAC gets started right after this. This delay seems + * to be needed for that to be reliable, e.g. ensure the + * clock is stable? + */ + udelay(100); break; default: break; --=20 2.55.0