From mboxrd@z Thu Jan 1 00:00:00 1970 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: 8bit 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šer 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šer 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 *substream, int cmd, return 0; } -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 = snd_soc_substream_to_rtd(substream); - struct snd_soc_pcm_runtime *be; struct snd_soc_dpcm *dpcm; + int mask = 0; - be = NULL; for_each_dpcm_be(fe, substream->stream, dpcm) { - be = dpcm->be; - break; - } + int no = mca_dai_to_cluster(snd_soc_rtd_to_cpu(dpcm->be, 0))->no; - if (!be) - return -EINVAL; + mask |= 1 << no; + } - return mca_dai_to_cluster(snd_soc_rtd_to_cpu(be, 0))->no; + return mask; } static int mca_fe_enable_clocks(struct mca_cluster *cl) @@ -417,7 +414,7 @@ static int mca_fe_prepare(struct snd_pcm_substream *substream, /* Turn on the cluster power domain if not already in use */ if (!cl->syncgen_in_use) { - int port = mca_fe_get_port(substream); + int port = ffs(mca_fe_get_portmask(substream)); cl->pd_link = 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, int nchans) 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 = 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); } @@ -662,7 +659,7 @@ static int mca_fe_hw_params(struct snd_pcm_substream *substream, 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; if (!cl->tdm_slot_width) { /* @@ -711,13 +708,13 @@ static int mca_fe_hw_params(struct snd_pcm_substream *substream, tdm_mask = (1 << tdm_slots) - 1; } - port = mca_fe_get_port(substream); - if (port < 0) - return port; + portmask = mca_fe_get_portmask(substream); + if (!portmask) + return -EINVAL; ret = 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; -- 2.55.0