From nobody Fri Jul 24 22:18:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A9DBE4582FD for ; Wed, 22 Jul 2026 23:42:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763753; cv=none; b=OHTDyEr1wJHAPAx7gMjGLSqATFdcfV0791QUVFcxUNcCBc1W4UY8lb+0kkcEMG/hS8XKnT4DMf7FpByA2zkuV1AHjanL7Wj8MAV8pVU6gV8R9vViA/XjQG594vAu0YtouJhs4wSSRqC3R2HlOA1gpFUSMcSZpev3fyVDyw9Zhyw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763753; c=relaxed/simple; bh=kklT4BtGmbxmXXl5fIL1oE0W7MuVDXFCHQeH+8hoyJ4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d2cYBpb1Lryrd1pwEnH3aS9fw9F0HrLBXc7x9XDujLVMHjgIwXxEE1fnZp1PkwDEfpXZMyniFql3qS2X9XPF8ErPlpQsmrVQRpMpQFC8YeFiejas8M0ZRDrmeM6GEEm27KFk2A5DHAb3lXrMGx725WgYsRaUoHMuCIxlHibDQ9A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=F5s9REBF; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=AxpUhsaR; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="F5s9REBF"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="AxpUhsaR" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MMnxhp2176078 for ; Wed, 22 Jul 2026 23:42:30 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=o3eANFp8vRp iIPxEwZyDYsYfAkwyo20ziwerf+wA+5I=; b=F5s9REBFpAnFfykmMX0iKjxiumE Lp7aLG6k74D+etcM9W/GRp4UhkJE5DSqXaWGUdT2l20vDm4NzQw9zSnhGaMF7HvD 6grs8gG58yRHPvNCA2QaobMqxlhhlQgzNGd1lfi0hdYEqvoPcvsZ8//N2UG2PpH6 LZLyuz+JR+YnFeieVbSJGu5T1goc8VoAVXZFRFAxbMMRdW0yRHjcrMgG7cUFXgpp tP61Wl1BNOAYLkf54vTbmNtbFHjJHPkfUlLJE17BMPzsgvGbzeazFoTAgel6lGCm oNIliTH8lsjH/jVj2BtwcoOCR5286lzk5SkIOLWhZ8BGTahGvBcntT9T04g== Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fjxm12f05-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 23:42:30 +0000 (GMT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-51c21c01cf3so251291cf.2 for ; Wed, 22 Jul 2026 16:42:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784763750; x=1785368550; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=o3eANFp8vRpiIPxEwZyDYsYfAkwyo20ziwerf+wA+5I=; b=AxpUhsaRvQ8FZXTw4IA/vPs1SK7WpPUcXloyCh3lef/VCYWw/WyTRne9GjDNdwRk9X dwWkxyPRXJh7YS094NZLCo8Tz7jX8IGtvHAGoUBEhUcmBF0Th4wUs9Xo5UofZa/oAubj 7ouOKr4L31Km70Qyt+oP/8F97OPHFVt7VIDzgVRSbrCiPgvBxkqs7a1eZE9ejMsgprAy j26Fz0EpC4dDue0GjVOtKCOR4xbBYjqekmC3wZQG08LQXMSldAUEjTvv9vzWKb7GWadf RgM+uGVpn/6EU6YbGvOxHuQbEhHZo7obXQdVEZZv/KrPAj1ddl9FBFv2cvOWd0DjNIFC BQnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784763750; x=1785368550; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=o3eANFp8vRpiIPxEwZyDYsYfAkwyo20ziwerf+wA+5I=; b=VcKqa2i2mOsAkyGDO2Bslxf03WMF3ifWfz0Vs5iroP88BiGi2NBBll7fhs/3wiOlsV uYv2BZckg/taaiY8yoooKgTq2kW7xohffVMI9OEXEQ431NmuZJJgQ1JKCISwAknnAxdK WvTFYPKSWzHgE74i3EQAOGgB3HOYGdZmQ6JPhrkpe4ulRjaktTdIPZoOyCI6w/Xcuc2e +um+pLyfgBp0U731q5thqi8wP5yC4IkI6cMYQnWtQEbFPo57HjnecxRGu2JWmhYS/fho sQf+l4deJzS3fxgUCPBPjChROox0DeeKrQbB4eBgP/BS8XgHo6jvU/RstBJX7b926kWc 8L0Q== X-Forwarded-Encrypted: i=1; AHgh+RphQMP3TFsiozXQ0Dj+MryNfXvXXP2eA7ym9SFmXiA6z9t8KywYSlNs8JY+qRwyWVQYeLP3jEzac5jErjc=@vger.kernel.org X-Gm-Message-State: AOJu0YxfUiXjHblByPuyB2OUGsQ0SaFS1Q+yPNLEEA4u66B3CA1c78CQ sZCYej2USV7/eATWDictxYzpstzxFBcg5Gbud4Uvsy38bo0PPzhoyJx4pPBiD8eFxUDAetlbXYI igzAGTju+hXdkL+ModaUa8FePkfPBCX/UomfZ+FkPVRJb4bkTRsazZq/Dg6NyutRy5G4= X-Gm-Gg: AR+sD12MNmyRQ28DBacQje60j+IK5z4AhxzsZbtTU40K7LVEDQnqO6GklAbg3x7ZNoz 8U0AiOXmB0b7/G2JO7envIUxy2ElPo6Sje/HXkqG14/g0PGo7LEGISxeuhnqCTjL0weOgUde9s0 cG1wUp4IDY+/rYL17x6w8/Jyg/GJt6yz7m8WHW0yAyIbxHRMk0wmEXEsuYKvimZfxqJuGfc/Wtt OP7YrwasqV0zzYl2QzCAxAA/R1Kvq8J4Cao1OqQgIf3lKhtsVaMfuG+5FSp6QmhrKpajgEvCWeq iEFsuFMicAjtqQi6I+lWLj4rx3gHQuD54wHSJ20XlNypVIbtk9ZsxgWwNo/dai9FxR+Tm3yCtgN M2XeLKEmaDItcyQ== X-Received: by 2002:ac8:5807:0:b0:51c:7b12:1218 with SMTP id d75a77b69052e-5283e0419dbmr6401681cf.86.1784763749852; Wed, 22 Jul 2026 16:42:29 -0700 (PDT) X-Received: by 2002:ac8:5807:0:b0:51c:7b12:1218 with SMTP id d75a77b69052e-5283e0419dbmr6401191cf.86.1784763749318; Wed, 22 Jul 2026 16:42:29 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4956a4aae16sm101796345e9.0.2026.07.22.16.42.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 16:42:28 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Charles Keepax , Maciej Strozek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Bard Liao , Pierre-Louis Bossart , Richard Fitzgerald , Jorijn van der Graaf , linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [RFC PATCH 1/8] ASoC: SDCA: hw_params: program upstream Input Terminals for OT DAI Date: Thu, 23 Jul 2026 00:42:11 +0100 Message-ID: <20260722234221.884765-2-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX4VPZh2sFk8is 4Sz0irtVtKrFTt+MqE0mvvJSq1wWxA8h9KBuhtQioB43TplOTxR6Dkx/Ck0b9Xv/lTm5k0WagYk QZlonFC06Ns2KlipUnPzqJztuK+nQSE= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX+Mwlg6FOLYFG uRzjFwcw796NE8798AzCwvE3FDFIxoz6fw6nEJzuegroqq7YTCXxTPLJ4mmkNCMyOeVquCTWPqX uYMplksnohCUCmJyjARjvmI0EP+F8FZXAbl6hBYKUFj1YWVomb0RT+Jxu9DshFeXBBKOFkgnOYV bIBlAMqJwJySGf50p9IZFYO10Ez6jubjBlXMJUpj5d89b03joPAo8R/7NOsldaEXwhb8AgA6PJ4 0xEiWG0+iP6mdFSo4fPk+jvfyrJYDN1ZjpscW+dhi4lGHyWJhfALw7GcVwDQryELLhLVUtN7DwE UvQhvk/pZ2Ti1KFiqRVgdWfsAro4o3CE9ZfI71v92lmd+sTRQ9+bGR4qHStQBrv8wvdmSLYaTK7 dRHubbbSnipm/wi6/wsR6iwu4PMHcQxcacv+/3OCc9Yc6pmGiw76rWv2VQjtMyCWVtP47YYiD9m slvuHzwGIZAcBeuQBwA== X-Authority-Analysis: v=2.4 cv=Rsv16imK c=1 sm=1 tr=0 ts=6a615566 cx=c_pps a=mPf7EqFMSY9/WdsSgAYMbA==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=uD0j0RXNaZXElQmVNg8A:9 a=dawVfQjAaf238kedN5IG:22 X-Proofpoint-GUID: nbZCFe6qiEV2f9BBQTWdKZhtA6yIsiNp X-Proofpoint-ORIG-GUID: nbZCFe6qiEV2f9BBQTWdKZhtA6yIsiNp X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_05,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 bulkscore=0 phishscore=0 spamscore=0 impostorscore=0 malwarescore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220233 Content-Type: text/plain; charset="utf-8" For a capture stream the DAI is the Output Terminal so sdca_asoc_hw_params() only programs the OT itself: cluster, clock and Usage. The upstream Input Terminals that actually source the audio never get their Usage, ClusterIndex or clock programmed, so the power domain comes up but no samples are produced. Walk the source graph from the OT and program every Input Terminal reachable through it. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Srinivas Kandagatla --- sound/soc/sdca/sdca_asoc.c | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/sound/soc/sdca/sdca_asoc.c b/sound/soc/sdca/sdca_asoc.c index b4dedba719dc..ac688cd62970 100644 --- a/sound/soc/sdca/sdca_asoc.c +++ b/sound/soc/sdca/sdca_asoc.c @@ -1726,6 +1726,51 @@ static int set_usage(struct device *dev, struct regm= ap *regmap, return -EINVAL; } =20 +/* + * For a capture stream the ASoC DAI is the Output Terminal, so hw_params + * only programs the OT itself. The upstream Input Terminal(s) that + * actually source the audio (e.g. a mic input behind a power-domain entit= y) + * never get their Usage / ClusterIndex / clock programmed and stay inacti= ve, + * so the power domain comes up but no samples are produced. Walk the sou= rce + * graph from the OT and program every Input Terminal we reach. + */ +static int set_input_terminal_sources(struct device *dev, struct regmap *r= egmap, + struct sdca_function_data *function, + struct sdca_entity *entity, + int channels, int rate, int width) +{ + int i, ret; + + for (i =3D 0; i < entity->num_sources; i++) { + struct sdca_entity *src =3D entity->sources[i]; + + if (src->type =3D=3D SDCA_ENTITY_TYPE_IT) { + ret =3D set_cluster(dev, regmap, function, src, channels); + if (ret) + return ret; + + if (src->iot.clock) { + ret =3D set_clock(dev, regmap, function, + src->iot.clock, rate); + if (ret) + return ret; + } + + ret =3D set_usage(dev, regmap, function, src, + SDCA_CTL_IT_USAGE, rate, width); + if (ret) + return ret; + } + + ret =3D set_input_terminal_sources(dev, regmap, function, src, + channels, rate, width); + if (ret) + return ret; + } + + return 0; +} + /** * sdca_asoc_hw_params - set SDCA channels, sample rate and bit depth * @dev: Pointer to the device, used for error messages. @@ -1762,6 +1807,12 @@ int sdca_asoc_hw_params(struct device *dev, struct r= egmap *regmap, break; case SDCA_ENTITY_TYPE_OT: usage_sel =3D SDCA_CTL_OT_USAGE; + + /* Program the upstream Input Terminal(s) that source this OT. */ + ret =3D set_input_terminal_sources(dev, regmap, function, entity, + channels, rate, width); + if (ret) + return ret; break; default: dev_err(dev, "%s: hw_params on non-terminal entity\n", entity->label); --=20 2.53.0 From nobody Fri Jul 24 22:18:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE3BB45D5CA for ; Wed, 22 Jul 2026 23:42:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763755; cv=none; b=USZNT1QobdSQU2uaYEIFpc+Tmrnzv7sIXJJjORJGRMu4fpB6z4OCFJOJN33J80Ncw8WVKiRpNzU5zCaKWy2Qe5aKvKfWTVSWfQ0achj4yeq1Mr117iiUmdyHyGwxv9BZL1VI3AIt8WmQk71UgBPV3wWF66Ok9/ucnkgwld19iRM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763755; c=relaxed/simple; bh=Y8OrT1b9+P25wm+nsipK+cGCcuo3jbfSsyp5e8veefA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TQERTns3DWGUS4/c2fcczoLFjs6/SAhiOcCOprlsqVoEGLlBAZWxDH23Yi28v6DVpI1BrgXpZzZdrnlgra0p9Af48YSX6HeDl/HtzKO6VNjy6gDxfEHEmDEYqGnuZ+/olkOtDxz2NubLMbDevivicCqwQQXFLyMPy2ln7U6U7CU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ay6c1PIS; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=EKQqw1PO; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ay6c1PIS"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="EKQqw1PO" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MMo2jI2176188 for ; Wed, 22 Jul 2026 23:42:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=6twen9BOQ6k ut18DPLsELurHQAzGfflSUGzYdphjhes=; b=ay6c1PISlnGyne/qPpS05V6Y6hY Fx3UPU9o+5fRbTYwTX9P0w+z8ME4g6RpjqxreaN+7uwG6Gi185g9mUp06ckx49x7 D8ZDZ1lChAjfIiVVnz/8QN7MKLBAy4zoGaZzQ/vKDxWM0YzcKqPwbMN3wu52Y8Co ZBs0OSgcJeJsYRUF8MLjAnU8eUEai15odpZbDOD3VvHpuGw5JdEifOhd8jIfEaLn KlhBYFRePGxZbJyGtTQRW2pq5jdsclewAo6wdbFkwOKPLwLKdOBQsipAFmuwa6UC +mCVmVPSklKi5ZkFjsA1+pa/Rh0LDPx9rArl6bNlqVU4lLnvAIWehMMRG0A== Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fjxm12f09-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 23:42:32 +0000 (GMT) Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-51c1d30035dso204231cf.2 for ; Wed, 22 Jul 2026 16:42:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784763752; x=1785368552; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=6twen9BOQ6kut18DPLsELurHQAzGfflSUGzYdphjhes=; b=EKQqw1POuO6qxztlT83qeZsl51bOlUfQd5asUneDP2Rz7sTB4NsipEzsOQxpUTYA2K 7Hv7GAKo4M4MluHDIVVJGbW18IwCIrr7lQR8iruJAN6La7SOo7QY/YVNzC8vu/zxgEc0 egStAKsWafSAGGv/ElhSzwAuDeNgMBf7+a+xGOZUSBFpXCCX3tWvvcZvByVPPiQ4qHWO FNAsTyleVEhAELHjkymq5bOuIH+GcfomavBYfX1fmIe0NVZHre40B4LjOv35WafxSpjL eKzWTB555V9jYJzRf6nSKOj43GPDaSZlEuYYY3cmRhtkiknhZZj/BH092mkxgq6RUtct 9gBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784763752; x=1785368552; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=6twen9BOQ6kut18DPLsELurHQAzGfflSUGzYdphjhes=; b=A6/naVPwoMg2qJAxy6C7etbexfkANjLAtgP448+NmZ2RE6KhdQFxm0Tps6xkNCnfd+ k25ALN+0UI1VgxWX9YORzts4MxiYxef6zO95PFmofaRwfHVTvP3L7nMpzEoDQsHHfGz0 U/SPYMCgoRqnu7XEHBdxlG+MoXXr8k2SjhhfczF/7GoqT2yuES0YIe0169eEdpN4neMN BCuTT84Bhhi6/hUY4xWUrRTb0rJm9Dafw2RuGnCSZhFVpk6HqvbWhi2cHrlBbhHbtu72 4yCI7OIqIhcpkCSde6tKVsUIYT/Sza80SEinguWeyXssofifaHHxzuaIl9DhjI2ZnCts xdBw== X-Forwarded-Encrypted: i=1; AHgh+RpbUrwSM1xhPGEpm/LpR1NFGS8m8jqrDh4eKAeIdezIdNg6Pui5RTORtF8wukTEiEQmniCf6ALmqCnQkFM=@vger.kernel.org X-Gm-Message-State: AOJu0Yz+CEONQSafzdmSKMPi5hG4sNzIDcJx8CT6LCvrb6pq+CFOJETp rHkz5CG47pmMkE5P7fNx+nvDit1uxi6Jo2aaaKafka1Tg2z4jw6scltw3A18UB6C7Q9dI3HkH5C STeXyoHF9r8Js8qYnmYf3pLUwQe5BHJADqEigVhSwShEJCM4f3lo/moCiPXmw6rKx4ec= X-Gm-Gg: AR+sD10H9YV9HBi/qwrISI9scrKblWsR7xJM8vTXcb+JMCGGBaYtK2NlE41Qz69lupE XkZfXwuOglS0JTMEDa6O7SoA86YGXJchrpzq9wp2idhq33EqBYh2blUwvLrNomqcm/zQPc/UTnT dJtmksXqDEWMiRF1WgRnptoEcw/amfqn6BZ4rc9G8CNISVvqTkxg/woKLL+mBzy1ReWnYLRwX+8 5xmVWUWwMeJGIWMO530wMZnxQ+mw/rNocZwprABHDDh2A7NUrz4k1VPflBELcqQ6bG/NyoVvY1W Kw5N4fR6K86VAqUjkNajqZqX6iSy9s2Oepl2l3BuGOPo/KB9OOnJf0BiXsWweZhZOnOcVnYsazr 09j+8CSnWsEgz5g== X-Received: by 2002:ac8:598a:0:b0:51c:1117:c7c with SMTP id d75a77b69052e-5283de0e53cmr6820141cf.25.1784763752025; Wed, 22 Jul 2026 16:42:32 -0700 (PDT) X-Received: by 2002:ac8:598a:0:b0:51c:1117:c7c with SMTP id d75a77b69052e-5283de0e53cmr6819781cf.25.1784763751566; Wed, 22 Jul 2026 16:42:31 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4956a4aae16sm101796345e9.0.2026.07.22.16.42.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 16:42:30 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Charles Keepax , Maciej Strozek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Bard Liao , Pierre-Louis Bossart , Richard Fitzgerald , Jorijn van der Graaf , linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [RFC PATCH 2/8] ASoC: SDCA: allow building without ACPI Date: Thu, 23 Jul 2026 00:42:12 +0100 Message-ID: <20260722234221.884765-3-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX8PwcH+RDhbjj q9bZ7vJVECoLfrf5AB4a3VhElWhHPkzmcrNwqO3M3Uh/+CMiAhBm7sWzMvQdCzbJssT8f+yOAW0 4OZymsbUI9nzNoR0N9jo5tlOIaAbT9s= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX1kgSisMv4idU dSHXUOcxmphN4H7Sj2Q0+LYy3sNl+Ssw1M2ed7xEs+gV1jOBySlUUZe6vKZ77dJoqeB1XCHJBCY woQWPJQ6520Hkr51p3P5ets/h14kBjmiCbEkQhCSxGh+74yPdID7eaNzDuHDHX3NMdOqb5FGuPT diMmrp9XwUuL+78UW/JAR8WUG2QjN0QzSJcCn74JaPnNmCdxMZc0JGa8af0+38FAl9mLcy9LD87 rHyy2hvsZwOA1oomYQ3mx14Q+lW6xBsyoPbAlf0bMj/A94lYXtm21f2OE1odiOUq3GdJNurqq5c VIzMEMAmRQ2KGUSWAUxYBnjzV9iukHpqG75y29G3hpm8omN6UHSEv6UgRuG/Bn1cUYeWTS4orLy /xAf+PU0vsEyIxzEjfhCgBaabbEDB1QKq13NFipms7L0aRlgLsriU3vMGKrTygy226ALFgVtbXI 8WpwDIOwYgoi4/B0flA== X-Authority-Analysis: v=2.4 cv=Rsv16imK c=1 sm=1 tr=0 ts=6a615568 cx=c_pps a=WeENfcodrlLV9YRTxbY/uA==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=w-sIlrOF0iEp6es9nnkA:9 a=kacYvNCVWA4VmyqE58fU:22 X-Proofpoint-GUID: VVgV9H9yZXGdUvHDigSdhCnB-yIPnHDB X-Proofpoint-ORIG-GUID: VVgV9H9yZXGdUvHDigSdhCnB-yIPnHDB X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_05,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 bulkscore=0 phishscore=0 spamscore=0 impostorscore=0 malwarescore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220233 Content-Type: text/plain; charset="utf-8" The SDCA class driver is useful on non-ACPI platforms where the topology is supplied statically via sdca_class_hw_ops.get_function_data. Drop 'depends on ACPI' from SND_SOC_SDCA and guard the ACPI-parsing implementations in sdca_device.c and sdca_functions.c with IS_ENABLED(CONFIG_ACPI), providing empty stubs when ACPI is off. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Srinivas Kandagatla --- include/sound/sdca.h | 2 +- sound/soc/sdca/Kconfig | 6 ++++-- sound/soc/sdca/sdca_device.c | 4 ++++ sound/soc/sdca/sdca_functions.c | 4 ++++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/include/sound/sdca.h b/include/sound/sdca.h index 2bdf4e333e04..c449b10ef893 100644 --- a/include/sound/sdca.h +++ b/include/sound/sdca.h @@ -60,7 +60,7 @@ enum sdca_quirk { SDCA_QUIRKS_SKIP_FUNC_TYPE_PATCHING, }; =20 -#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SDCA) +#if IS_ENABLED(CONFIG_SND_SOC_SDCA) =20 void sdca_lookup_functions(struct sdw_slave *slave); void sdca_lookup_swft(struct sdw_slave *slave); diff --git a/sound/soc/sdca/Kconfig b/sound/soc/sdca/Kconfig index 4c0dcb9ff3b9..dc4cba1e3e0e 100644 --- a/sound/soc/sdca/Kconfig +++ b/sound/soc/sdca/Kconfig @@ -3,11 +3,13 @@ menu "SoundWire (SDCA)" =20 config SND_SOC_SDCA tristate "SDCA core support" - depends on ACPI select AUXILIARY_BUS help This option enables support for the MIPI SoundWire Device - Class for Audio (SDCA). + Class for Audio (SDCA). The ACPI/DisCo topology parser is + only built when CONFIG_ACPI is enabled; on non-ACPI platforms + (e.g. ARM/DT) codec drivers supply the SDCA function data + via sdca_class_hw_ops.get_function_data. =20 config SND_SOC_SDCA_HID bool "SDCA HID support" diff --git a/sound/soc/sdca/sdca_device.c b/sound/soc/sdca/sdca_device.c index 405e80b979de..59d6c7466d91 100644 --- a/sound/soc/sdca/sdca_device.c +++ b/sound/soc/sdca/sdca_device.c @@ -28,6 +28,7 @@ void sdca_lookup_interface_revision(struct sdw_slave *sla= ve) } EXPORT_SYMBOL_NS(sdca_lookup_interface_revision, "SND_SOC_SDCA"); =20 +#if IS_ENABLED(CONFIG_ACPI) static void devm_acpi_table_put(void *ptr) { acpi_put_table((struct acpi_table_header *)ptr); @@ -45,6 +46,9 @@ void sdca_lookup_swft(struct sdw_slave *slave) devm_add_action_or_reset(&slave->dev, devm_acpi_table_put, &slave->sdca_data.swft); } +#else +void sdca_lookup_swft(struct sdw_slave *slave) { } +#endif EXPORT_SYMBOL_NS(sdca_lookup_swft, "SND_SOC_SDCA"); =20 static bool sdca_device_quirk_rt712_vb(struct sdw_slave *slave) diff --git a/sound/soc/sdca/sdca_functions.c b/sound/soc/sdca/sdca_function= s.c index 77940bd6b33c..8814adc05f04 100644 --- a/sound/soc/sdca/sdca_functions.c +++ b/sound/soc/sdca/sdca_functions.c @@ -25,6 +25,7 @@ */ #define SDCA_PROPERTY_LENGTH 64 =20 +#if IS_ENABLED(CONFIG_ACPI) static int patch_sdca_function_type(u32 interface_revision, u32 *function_= type) { /* @@ -198,6 +199,9 @@ void sdca_lookup_functions(struct sdw_slave *slave) =20 acpi_dev_for_each_child(adev, find_sdca_function, &slave->sdca_data); } +#else +void sdca_lookup_functions(struct sdw_slave *slave) { } +#endif EXPORT_SYMBOL_NS(sdca_lookup_functions, "SND_SOC_SDCA"); =20 struct raw_init_write { --=20 2.53.0 From nobody Fri Jul 24 22:18:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B12D045D5FB for ; Wed, 22 Jul 2026 23:42:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763758; cv=none; b=oFwpttqhOMjift7t7yb6Pk4gpeYspKgZeADjhtWN/7I0+5XzpbCnhUhr8L03YcDvI8nv++yV8xv0EseErsotU8iV12n8HPMCXxtO8++sGb7GcNrFb21RnP3vmz3Zh9G9tRE0zCQyNpUCwU7e61R+7tIa1pkRx/qRwKNkKroHp10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763758; c=relaxed/simple; bh=j684rOsac2Qt79mUicIQGsRWvKVbjXmufFgdE3NdzzE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fnSgh+2OKCc0EULUEc3WX673/1pdYI6wwcfHxtoI361hpCTNKkkehCA0Ypi8vw0cWczA5DGoSq4tN3Yxm5C7qsU2nXOXc84pe3tLPI/TlUTnTANvOth+t6ZpET30Zoe2TbFLqSA7a6nMISvCarTlBfDOwvVg60UmN6lWk311t2w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=HbkoFwYU; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=gF9mYwmm; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="HbkoFwYU"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="gF9mYwmm" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MMnaop2037940 for ; Wed, 22 Jul 2026 23:42:35 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=j0kOWh2iDvE MA3XAs4O2/Bne0RHCbtocGHBN4QE9SHM=; b=HbkoFwYU8FND+ztPsT0vo1CFIWQ gmjLWSoLfPdF2Y/JCcsdi7jygROGgFUWTI+Oj5b1VXr6gTKKkb2Wkh6GzU2lQw6e 0WFvTIR1oJjISwTFCQ3Qd1rUkQYH9mds6e0szFa7Q8gF5eyp06AKzlNaXrg1Bgt9 5O5FMQKiR+wyOhPg/DZhP+BJA2JB0fvRMDNupZXX8fmS6Zf7/10NT3qTdGn6qynV WxOnIUGdHYraecrY/Wserx6QHh4yJdnLzkE499LnskP0U5H35G+S/Qm7lY67VJ7W jvitV9YXrtK1ebqbvdQdf/AzkoPeimMMDxcRDakKTWU7S+dLWAwQNBvx5Dg== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fk275hbyx-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 23:42:34 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-8f000e221d7so1367116d6.0 for ; Wed, 22 Jul 2026 16:42:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784763754; x=1785368554; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=j0kOWh2iDvEMA3XAs4O2/Bne0RHCbtocGHBN4QE9SHM=; b=gF9mYwmmm8Khvu8XQuCKAHCIpfugTilcY+5CMUEX6agpZrl87/VX6Co03eNnxysj8k ZEjG6p6Vd+MB5uWnsvU6Q9IiQkOOXJ/TYrO774zuXLJ0h3Cutg5U2qJ7mT2FacYpmQUT RVqKXZXczrpj5MgL0yFvwKK/pkqqqmIxUAWVuprhwLDcFol5Rb/cxQOz6X3TtFpbDwBk rVkN2eiAjnHcHX2+WZTpeGNtrxNJWbk8SsdzTR5WqMDSbWbZ0GVLFqBjq8Ox7w68uQZK 92ObUR/uarBxgfx+3AJvBoFM063P+jOKPowXtk+6YKhao11DYdQRx1F3/U+OrP67OPAW RYBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784763754; x=1785368554; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=j0kOWh2iDvEMA3XAs4O2/Bne0RHCbtocGHBN4QE9SHM=; b=B6E2Ywr1KxCO4lrTwVIxQU7NrBYvHBmNOnr/In+F0rEHuf6k2UUVXW6orS94/GZ1u/ acUi/3oDxFbs/2HO4W3O20kEn74ND8yyAviObVKOANMT4NlqB/zm/59mjjRbn3h/tSHJ 4ZzGTNnmoq1Z0ZR9FyQdlMAWkbghVwskbY8lIgWWDEWQYtb84ejfeKpXhrR6rqNNzieg Xh+uTsVQrXRT81BlH7IQRqhiC7+G4fQQHBXHhyuxBVLnI5i4fDay/l+EBUhpMcV1UYk8 XlcPRk3BrQ+f2lxkACK1o+wnGsB5cU7AQfY7JfQ+uwoqz92UJvviT5AUnS5BbVXwwKFH EHAg== X-Forwarded-Encrypted: i=1; AHgh+Rov8/cjDMtZcQSYcSp94Kup+ZiptCs2c/ic7mNFiR+CCSL6X9Z+j9kvM8KwSsOogXjoUAABv2Xg7rL0zHQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzcQMUJsaMCkGFuTKYGqzSyyLAuNmiO8Vc9iiN9whb1Yu96ufNP /dVLyghyLXPZp7LSPl8FzTXvUtETsi6o3i1OYWhCR/lN6w8+uE4k1IXV4BDiocfONfLQ9T47U1s 94mK2MnzHqYNrOz0nUcMOVFNxqJmS+XnExG7rOll+UekfBDMdUJNbpZ4Ur7ISeEUj9RE= X-Gm-Gg: AR+sD11qAYgE0uqhexzHG/HOo2OFUyQAtgvDOCr92JNPwVd+zsLSYqrbQp3XgQTJVaJ FR6rExdtCI5Sl+j5CPA6pxOkX9/LIvU0T8KZ0ZnTpFtIsyf+g42xvDOhrj0+vgFtkCtr25OFyXw yUc+GN+gpqGWi/fEM57LrPCEAMz/aNlpH/N0LuAzlLAnsXBHh+3MxvwTS9ANNVawvyB0YGFDW3d 9Dp8vXIy4Eb9/on0UrMr6Wpc3Vb0mfR6MOvIZRR0OvGmLiVItClOhnFZ5ujYRccRz31cRkUmGv0 iZfExf4Ds3Pz3TfhiufyH15u1/po5RLYBZUOuXVnovnJYxJ54PmRvwKGFb4R54Qc6YkNE2NHfwr qj7TMikIE4EzQmQ== X-Received: by 2002:ac8:5c8b:0:b0:51c:844f:28da with SMTP id d75a77b69052e-5283ddb1862mr7978261cf.5.1784763753599; Wed, 22 Jul 2026 16:42:33 -0700 (PDT) X-Received: by 2002:ac8:5c8b:0:b0:51c:844f:28da with SMTP id d75a77b69052e-5283ddb1862mr7977971cf.5.1784763752999; Wed, 22 Jul 2026 16:42:32 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4956a4aae16sm101796345e9.0.2026.07.22.16.42.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 16:42:32 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Charles Keepax , Maciej Strozek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Bard Liao , Pierre-Louis Bossart , Richard Fitzgerald , Jorijn van der Graaf , linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [RFC PATCH 3/8] ASoC: SDCA: expose class helpers with hw_ops for non-DisCo platforms Date: Thu, 23 Jul 2026 00:42:13 +0100 Message-ID: <20260722234221.884765-4-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Analysis: v=2.4 cv=Q53iJY2a c=1 sm=1 tr=0 ts=6a61556a cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=vdTmw_I4eXCyo6tFA2sA:9 a=O8hF6Hzn-FEA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX5/n62pRx3cHv UfPXmCDzu07lESJB/ImnoB3AI1m4FCwcxyUHJL7UUKygQs7zWbIOp+lX6EFWSYD0FvrUlMF0oHT Eb5hzV/3DG9mRCfDLHaRmh30vwugWBM= X-Proofpoint-GUID: w87O98KoaxHWm6_Jbnj_qRX43WoTktFL X-Proofpoint-ORIG-GUID: w87O98KoaxHWm6_Jbnj_qRX43WoTktFL X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfXykUag/wso46K DR7ugpDb75BAqSWHU8LH6leSFTu3nPTqO1JhCoOGdshBtJQ9I/iSL3+xjQ7aP34y/P/wV/AhDyI lZUhr5MFKlEHhnMu1VFkMHe8qdmUr2k2j9jStwIHN1fgvjx4K1Zop9D1jHCzVvvqjKejEOtXrDJ OaKQCrQZktgcB87uO6KXSl1D5Y2t497yfD0tQDeiioXr3MMqlmGmOaM/t4x8vJ0JXpti+rPN0D5 x2kMVeaWaw6yRSb14J+deada88UlvELbX7hwoqkxRvZAP5i6FvHlOkk8bNtE1qZM5Yd7x/Xwa63 AQiTKKlw07gOtYGp95m+7g+mGHiQu/6xH9x3PPZqSI5qfqM5cd5g+qJH6kxmMnAC9jYg/xtfxNX V8FrDet609eyAkKOZRPB9JgXFZ+W88zg2DZVvM09bFb8K94rQ8TwYfMY5D5jWT04zVDg7KYkkR0 Da2OLWdLeoR7zF/dqYA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_05,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 priorityscore=1501 adultscore=0 bulkscore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 malwarescore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220233 Content-Type: text/plain; charset="utf-8" On ARM/DT platforms without ACPI/DisCo, sdca_lookup_functions() is a no-op and num_functions stays 0. Introduce struct sdca_class_hw_ops with hw_init and get_function_data callbacks so codec drivers can supply pre-populated sdca_function_data and toggle supplies/reset at probe time. Convert the class SoundWire probe into an exported library helper sdca_class_probe(sdw, hw_ops) and export sdca_class_read_prop() and sdca_class_pm_ops. Codec-specific SoundWire drivers can register their own sdw_driver and call these helpers from their probe. The built-in class_sdw_driver stays for generic SDCA parts that need no per-device quirks (hw_ops =3D NULL). For non-DisCo boots, the class helper injects the driver-supplied function descriptors into sdca_device_data so sdca_dev_register_functions() can create the auxiliary devices, and the auxiliary function driver uses get_function_data() as a fallback source of per-entity data when the firmware node is absent. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Srinivas Kandagatla --- sound/soc/sdca/sdca_class.c | 83 +++++++++++++++++++++++++-- sound/soc/sdca/sdca_class.h | 30 ++++++++++ sound/soc/sdca/sdca_class_function.c | 40 ++++++++++++- sound/soc/sdca/sdca_function_device.c | 2 +- 4 files changed, 146 insertions(+), 9 deletions(-) diff --git a/sound/soc/sdca/sdca_class.c b/sound/soc/sdca/sdca_class.c index 8d7b007a068f..c9a4cce77557 100644 --- a/sound/soc/sdca/sdca_class.c +++ b/sound/soc/sdca/sdca_class.c @@ -24,7 +24,15 @@ =20 #define CLASS_SDW_ATTACH_TIMEOUT_MS 5000 =20 -static int class_read_prop(struct sdw_slave *sdw) +/** + * sdca_class_read_prop - fill SDCA-common SoundWire slave properties + * @sdw: SoundWire slave + * + * Exported so codec-specific SoundWire drivers can invoke the SDCA + * common property setup from their own sdw_slave_ops.read_prop, and + * then apply codec-specific overrides inline. + */ +int sdca_class_read_prop(struct sdw_slave *sdw) { struct sdw_slave_prop *prop =3D &sdw->prop; =20 @@ -36,9 +44,10 @@ static int class_read_prop(struct sdw_slave *sdw) =20 return 0; } +EXPORT_SYMBOL_NS_GPL(sdca_class_read_prop, "SND_SOC_SDCA_CLASS"); =20 static const struct sdw_slave_ops class_sdw_ops =3D { - .read_prop =3D class_read_prop, + .read_prop =3D sdca_class_read_prop, }; =20 static void class_regmap_lock(void *data) @@ -136,9 +145,23 @@ static void class_boot_work(struct work_struct *work) pm_runtime_put_sync(drv->dev); } =20 -static int class_sdw_probe(struct sdw_slave *sdw, const struct sdw_device_= id *id) +/** + * sdca_class_probe - SDCA class SoundWire slave probe helper + * @sdw: SoundWire slave + * @hw_ops: optional device-specific hw_ops (may be NULL for pure-generic + * SDCA parts that need no quirks) + * + * Exported so codec-specific SoundWire drivers can call this from their + * own sdw_driver.probe. For codecs with quirks, pass the codec's + * sdca_class_hw_ops so hw_init, DT function injection, and PDE hooks + * are wired up. For pure-generic SDCA parts (used by the built-in + * class_sdw_driver in this file), pass NULL. + */ +int sdca_class_probe(struct sdw_slave *sdw, + const struct sdca_class_hw_ops *hw_ops) { struct device *dev =3D &sdw->dev; + struct sdca_device_data *data =3D &sdw->sdca_data; struct regmap_config *dev_config; struct sdca_class_drv *drv; int ret; @@ -156,11 +179,47 @@ static int class_sdw_probe(struct sdw_slave *sdw, con= st struct sdw_device_id *id =20 drv->dev =3D dev; drv->sdw =3D sdw; + drv->hw_ops =3D hw_ops; mutex_init(&drv->regmap_lock); mutex_init(&drv->init_lock); =20 dev_set_drvdata(drv->dev, drv); =20 + /* + * On ARM platforms without ACPI/DisCo tables, sdca_lookup_functions() + * is a no-op and num_functions stays 0. Inject the function descriptors + * from the device-specific static data so sdca_dev_register_functions() + * can create the auxiliary devices. + */ + if (data->num_functions =3D=3D 0 && hw_ops && hw_ops->get_function_data) { + struct sdca_function_data *fdata; + unsigned int num =3D 0; + unsigned int i; + + fdata =3D hw_ops->get_function_data(&num); + if (!fdata || num =3D=3D 0 || num > SDCA_MAX_FUNCTION_COUNT) + return -EINVAL; + + for (i =3D 0; i < num; i++) { + if (!fdata[i].desc) + return -EINVAL; + data->function[i].type =3D fdata[i].desc->type; + data->function[i].adr =3D fdata[i].desc->adr; + data->function[i].name =3D fdata[i].desc->name; + data->function[i].node =3D NULL; + } + data->num_functions =3D num; + + dev_info(dev, "no DisCo/ACPI functions found, injected %u descriptor(s)\= n", + num); + } + + if (hw_ops && hw_ops->hw_init) { + ret =3D hw_ops->hw_init(sdw); + if (ret) + return dev_err_probe(dev, ret, "hw_init failed\n"); + } + INIT_WORK(&drv->boot_work, class_boot_work); =20 dev_config->lock_arg =3D &drv->regmap_lock; @@ -185,6 +244,13 @@ static int class_sdw_probe(struct sdw_slave *sdw, cons= t struct sdw_device_id *id =20 return 0; } +EXPORT_SYMBOL_NS_GPL(sdca_class_probe, "SND_SOC_SDCA_CLASS"); + +static int class_sdw_probe(struct sdw_slave *sdw, const struct sdw_device_= id *id) +{ + /* Pure-generic SDCA parts: no per-device hw_ops. */ + return sdca_class_probe(sdw, NULL); +} =20 static void class_sdw_remove(struct sdw_slave *sdw) { @@ -266,11 +332,18 @@ static int class_runtime_resume(struct device *dev) return ret; } =20 -static const struct dev_pm_ops class_pm_ops =3D { +const struct dev_pm_ops sdca_class_pm_ops =3D { SYSTEM_SLEEP_PM_OPS(class_suspend, class_resume) RUNTIME_PM_OPS(class_runtime_suspend, class_runtime_resume, NULL) }; +EXPORT_SYMBOL_NS_GPL(sdca_class_pm_ops, "SND_SOC_SDCA_CLASS"); =20 +/* + * Built-in class driver for SDCA parts that need no per-device quirks. + * Codecs that need hw_ops (hw_init, DT function injection, PDE / jack + * hooks, etc.) register their own sdw_driver and call + * sdca_class_probe(slave, &their_hw_ops) from their .probe. + */ static const struct sdw_device_id class_sdw_id[] =3D { SDW_SLAVE_ENTRY(0x01FA, 0x4245, 0), SDW_SLAVE_ENTRY(0x01FA, 0x4249, 0), @@ -282,7 +355,7 @@ MODULE_DEVICE_TABLE(sdw, class_sdw_id); static struct sdw_driver class_sdw_driver =3D { .driver =3D { .name =3D "sdca_class", - .pm =3D pm_ptr(&class_pm_ops), + .pm =3D pm_ptr(&sdca_class_pm_ops), }, =20 .probe =3D class_sdw_probe, diff --git a/sound/soc/sdca/sdca_class.h b/sound/soc/sdca/sdca_class.h index 57f7f8d08f49..74db9d4ce4a2 100644 --- a/sound/soc/sdca/sdca_class.h +++ b/sound/soc/sdca/sdca_class.h @@ -15,10 +15,32 @@ #include =20 struct device; +struct dev_pm_ops; struct regmap; struct sdw_slave; struct sdca_function_data; =20 +/** + * struct sdca_class_hw_ops - optional device-specific hardware callbacks + * @hw_init: called during probe to enable supplies, toggle reset GPIO, et= c. + * @get_function_data: called when no DisCo/ACPI firmware node is available + * (e.g. DT/ARM platforms) to supply pre-populated static func= tion + * data in place of sdca_parse_function(). Returns a pointer = to + * an array of struct sdca_function_data and stores the number + * of entries in @num (must be > 0 and <=3D SDCA_MAX_FUNCTION_= COUNT). + * May be NULL. + * + * Codec-specific SoundWire drivers pass a pointer to this struct to + * sdca_class_probe() from their sdw_driver.probe. Codec-specific + * SoundWire slave property overrides live directly in the codec's + * sdw_slave_ops.read_prop, which should call sdca_class_read_prop() to + * fill the SDCA-common bits first. + */ +struct sdca_class_hw_ops { + int (*hw_init)(struct sdw_slave *slave); + struct sdca_function_data *(*get_function_data)(unsigned int *num); +}; + struct sdca_class_drv { struct device *dev; struct regmap *dev_regmap; @@ -26,10 +48,18 @@ struct sdca_class_drv { =20 struct sdca_interrupt_info *irq_info; =20 + const struct sdca_class_hw_ops *hw_ops; + struct mutex regmap_lock; /* Serialise function initialisations */ struct mutex init_lock; struct work_struct boot_work; }; =20 +/* Library helpers used by codec-specific SDCA SoundWire drivers. */ +int sdca_class_read_prop(struct sdw_slave *sdw); +int sdca_class_probe(struct sdw_slave *sdw, + const struct sdca_class_hw_ops *hw_ops); +extern const struct dev_pm_ops sdca_class_pm_ops; + #endif /* __SDCA_CLASS_H__ */ diff --git a/sound/soc/sdca/sdca_class_function.c b/sound/soc/sdca/sdca_cla= ss_function.c index 1496a15f7d2a..905c96ed6172 100644 --- a/sound/soc/sdca/sdca_class_function.c +++ b/sound/soc/sdca/sdca_class_function.c @@ -329,9 +329,43 @@ static int class_function_probe(struct auxiliary_devic= e *auxdev, drv->core =3D core; drv->function =3D &sdev->function; =20 - ret =3D sdca_parse_function(dev, core->sdw, drv->function); - if (ret) - return ret; + if (drv->function->desc->node) { + ret =3D sdca_parse_function(dev, core->sdw, drv->function); + if (ret) + return ret; + } else if (core->hw_ops && core->hw_ops->get_function_data) { + /* + * No DisCo/ACPI firmware node available (e.g. DT/ARM platform). + * Use pre-populated static function data supplied by the + * device-specific hw_ops instead of sdca_parse_function(). + * The callback returns an array of function_data entries; + * pick the one matching this auxdev's function type. + */ + struct sdca_function_data *fdata; + unsigned int num =3D 0; + unsigned int i; + + fdata =3D core->hw_ops->get_function_data(&num); + if (!fdata || num =3D=3D 0) + return -EINVAL; + + for (i =3D 0; i < num; i++) { + if (fdata[i].desc && + fdata[i].desc->type =3D=3D sdev->function.desc->type) { + *drv->function =3D fdata[i]; + drv->function->desc =3D sdev->function.desc; + break; + } + } + if (i =3D=3D num) { + dev_err(dev, "no matching function data for type 0x%x\n", + sdev->function.desc->type); + return -EINVAL; + } + } else { + dev_err(dev, "no firmware node and no get_function_data hook\n"); + return -EINVAL; + } =20 ndefaults =3D sdca_regmap_count_constants(dev, drv->function); if (ndefaults < 0) diff --git a/sound/soc/sdca/sdca_function_device.c b/sound/soc/sdca/sdca_fu= nction_device.c index b5ca98283a88..9fecfcfdbb6d 100644 --- a/sound/soc/sdca/sdca_function_device.c +++ b/sound/soc/sdca/sdca_function_device.c @@ -46,7 +46,7 @@ static struct sdca_dev *sdca_dev_register(struct device *= parent, auxdev =3D &sdev->auxdev; auxdev->name =3D function_desc->name; auxdev->dev.parent =3D parent; - auxdev->dev.fwnode =3D function_desc->node; + auxdev->dev.fwnode =3D function_desc->node ?: dev_fwnode(parent); auxdev->dev.release =3D sdca_dev_release; =20 sdev->function.desc =3D function_desc; --=20 2.53.0 From nobody Fri Jul 24 22:18:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78B4C46A5E5 for ; Wed, 22 Jul 2026 23:42:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763759; cv=none; b=b2Hlu9P/7cRBGykKMblbcYZQeQF0bG6723j/BrlOHuRZ8uwKY/mD1MFpasc8yF8/q4tbses1odjspIU9Ams92coSHnmowmKi3+k+Rl6+k7r4GCypBR/VUKnw6OCUWO1tLgUpTMccYj2qeag/C17CPvgegaqj+oGkSLFylaW1VrM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763759; c=relaxed/simple; bh=I3HeKdoaqr6J677nN/TvvOWVijKfTEhqVjX9TUsnPn0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TRIO2VN/PkKuo0T1WBs+8lKv9UWxOzKaOYvzfd0IroJWEGmAOaY870sOGm3hopooSN7BWyCZI8CKEKMyyyhOXKCV6aIDO3QBmtiEdRykWjVUBOewSsZUaeNYPWlXjLmxA938VH6nZBFWeL+G8q1GXcPagLYBkvI/jLz/uoe+DV4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=FujzAj60; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=QPDMkVIo; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="FujzAj60"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="QPDMkVIo" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MMo2rv2042826 for ; Wed, 22 Jul 2026 23:42:36 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=1ecc3MSmL7x fj8NmfMmWmihlUbejMMv9R5FqL2QClAQ=; b=FujzAj60e2jkOlS+8OB5sOg8TcU qlYOzqB+wAK63ukMyu2p4ROybvLMGaPbkufkK/vTu+WbhK2O398il05kBVvqAmnt KmrI99ME9NbJx1Y5h0gKN0xCwFE1MqORwTikHX/NF/i5w99gJPmPu91sfhbVhUeU dQw4kqBkp98MTxIqIcd4nLepq5f66ROD5KR5qh7k6lxpHWlapd9JfVoZxBid0h96 5YUzKN44DR4pAIesqkHQkoPfrZhM8RyxGHqJW/GUsgmHNqnPnG8t+EQJaQh4SB0/ WzTkdUGMdAq9Y+tJk3uyNsHer7D2pEi0Ag9XXqCIkJG+Bz8fbHY0psXXtow== Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fjtn2ukkm-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 23:42:36 +0000 (GMT) Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-51c1a9764f0so569771cf.1 for ; Wed, 22 Jul 2026 16:42:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784763756; x=1785368556; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=1ecc3MSmL7xfj8NmfMmWmihlUbejMMv9R5FqL2QClAQ=; b=QPDMkVIoRM5gQ8DWDNgAAAKmVmZUdzppAXRx14HUS8FpPPNRF2lMXOmYB7/oOi5AJ5 9nuwlWRZoc6dOolfbOLlAV9nSUru7FasEMH9vLzBBDpBT8Hd96aVVN9709+R2UX2d6V3 puSdvPv7YqHl0xyGQM6QhDChx/+/IskknNHNkOnHDsBiaPTCub6u0Xhhqrmp/gk8FqsV JrFmZw2npbU0VVkGEW7DtKdip1fWGCobP9K2W0sIj7tO/3lMXtcb9EcW68/oruhF5NPs C+GYAZtOAtqGGabOQRIc7Z3TiHKJBOQo/l1GC7W/frx7/mDlyOfb1QJAt3xpDyly2/h5 r3RA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784763756; x=1785368556; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=1ecc3MSmL7xfj8NmfMmWmihlUbejMMv9R5FqL2QClAQ=; b=W5ErPmJzYC3QvcOzkHlbwTl9C/kXR4Iz/ny4OrQOg3a7kqq0LZafPSPd1gDH9E38wk 2TnrmjTmhQ2fktuv66PyM/TpisDsMFJCrgndb3NUNfEonw0YBhAwvr+9t5+roiz0k2T8 RgyEJGa2SaMUzzowi/0a7UMctghOCfy6P/bOTETCu+TKVw9FnpCYqb9XQVkC0xK9W5On xfrMfEssWmGSBP86p3O3+dr+3CsKYGM7MHmVn8DYzcb5cN0QLlyfdrdtrsPi8sTOq4Sv W20HcgG9Z+3eb7TyrCs1fkaOWfyMq/L+Fy+t0bgHL7Oy+Az2zt0kE07S6m8nK2HlgL1u mavA== X-Forwarded-Encrypted: i=1; AHgh+RrhI1Z6t6HbzCl0t9NY7oeuYbLQmZnD2zo5iBGXrJUyYN56GyHtS6hAgqmZWCQ3hi1BJ1VUS+fc6cJaoS8=@vger.kernel.org X-Gm-Message-State: AOJu0YxWECgWqFzIPYXniMQhzzZ69TA6RXI2WnVcQ4QGIkpeT+7XhjMr bYdlgBM3JQ0lo1X6OAl01hfTr9ZWNYJiAMm4OwSjFKKk0pkL2ggMBCc+HPAJPi+hAHvMyN0FFZv P9Lw1KRYdIGeo0aiBjjMkgHei5JjCHnq5MdL/sjul89eHolz/wwPgofiMrn6k/tiS/7HCvIAuPp A= X-Gm-Gg: AR+sD12uC6Rq4woTmqSeofJyeiGK+5Y0gOV/lcLzd3t//xQRztnLX+yKI9kWI8FrtPX NYae+HevUeODH+K3v1J2od2li+CaxjPgMTxkVxHaIFgAKXpb02stopLXQPwAjwM9tC0clRv64co GOa4gkQbY9Eal0qrIpFMTjn7fC0jeEkkLUXSTkT568AAsxr0IoWFrYDqn5DCpNPwKNrwP+9Rlaj hz0f3C9bduaK5m9PKhB31f247ylVbs8UET3NOxTUZTYpusnTeBVVQ8lfJysAZcURWkqaUdOjdl/ sF8j/zAp7U3BzSKQ2mWigYXbIVqlGTZMGqkoPWI+d1WQdtiBmidwF/QgjtJjF12DryhkmCreCEm HglUvlxQUJwXnSg== X-Received: by 2002:ac8:5d49:0:b0:51c:7b12:5ff6 with SMTP id d75a77b69052e-5283dff0b9dmr6908731cf.82.1784763755718; Wed, 22 Jul 2026 16:42:35 -0700 (PDT) X-Received: by 2002:ac8:5d49:0:b0:51c:7b12:5ff6 with SMTP id d75a77b69052e-5283dff0b9dmr6908501cf.82.1784763755268; Wed, 22 Jul 2026 16:42:35 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4956a4aae16sm101796345e9.0.2026.07.22.16.42.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 16:42:33 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Charles Keepax , Maciej Strozek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Bard Liao , Pierre-Louis Bossart , Richard Fitzgerald , Jorijn van der Graaf , linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [RFC PATCH 4/8] ASoC: SDCA: add PDE pre/post-pmu hooks to hw_ops Date: Thu, 23 Jul 2026 00:42:14 +0100 Message-ID: <20260722234221.884765-5-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfXyqKBitdxCvrv do/lqJh49FY9QMoG1HKmr/iGmo68lfiegedye9qy3Utd2yuagvr6BlRztEbAir44Ee6CX4lyykW oEW3Kn4EGNIatob3tqV2eibkW3mn2A6vc2QydqWvUpUdyyi47mr+qhBw/4HZhZyrL9+wEjBpuGN QM6YzRbyIe22pOCwyhXOgJIIG6V8YCVycSZTwDYW5jmw0hJfx0c4vXHMjoHhww1qShB70gZyUCx J56zpeVKsw1ym9jLBsd+2MkeY15gVMxR/EFxyGR8G/3/P67RRjoI4ClGKMc/jxAkhwejhbCHoib 6dHlmijudPdOWx2yNEmCQr6unb2TPczjhc1+vim1hGr6PJq+l7wKpnyCoHLLnXvIyMzLv/8ofxl b4zIVH9egWkmXlWxtNGZBYizeDZJBGHFulbNyTlSX/Qi5jZOzAh6C1ruuUQM3N66x/QjnrqLuL7 +TsTCLCHZEgjP+uNPXA== X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfXwkSLIVIgXtCn nFibMI/PVQ0DeuyJ87JWkX0XXjrwTRv6OnHTmQ1YnPy8AMDD14QMXZkRJfv8ZYM6UIA8qRL297H F4gJyTkYTP5Y7Q3OYg1uTWdF2GNwGkM= X-Proofpoint-GUID: C16iuZsZAD7wS05NTt74RgCYKVSDr_nw X-Proofpoint-ORIG-GUID: C16iuZsZAD7wS05NTt74RgCYKVSDr_nw X-Authority-Analysis: v=2.4 cv=T+28ifKQ c=1 sm=1 tr=0 ts=6a61556c cx=c_pps a=JbAStetqSzwMeJznSMzCyw==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=L7SaaVQrovU1Y9o8N14A:9 a=uxP6HrT_eTzRwkO_Te1X:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_05,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 phishscore=0 impostorscore=0 malwarescore=0 spamscore=0 clxscore=1015 bulkscore=0 lowpriorityscore=0 adultscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220233 Content-Type: text/plain; charset="utf-8" Add pde_pre_pmu and pde_post_pmu callbacks to struct sdca_class_hw_ops so codec drivers can hook into DAPM PDE power-domain transitions. pde_pre_pmu is called before REQUESTED_PS=3DPS0 is written, allowing the driver to stage state (e.g. IT_USAGE, MIC_BIAS) that must be valid before the PDE sequencer runs. pde_post_pmu is called after REQUESTED_PS=3DPS0 and before ACTUAL_PS polling begins, allowing the driver to commit pending writes (e.g. FU mute/volume via SCP_COMMIT) that the sequencer needs to see. Both callbacks receive function_id and entity_id so the driver can act selectively per power domain. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Srinivas Kandagatla --- sound/soc/sdca/sdca_asoc.c | 33 ++++++++++++++++++++++++++++++++- sound/soc/sdca/sdca_class.h | 11 +++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/sound/soc/sdca/sdca_asoc.c b/sound/soc/sdca/sdca_asoc.c index ac688cd62970..795498b9a314 100644 --- a/sound/soc/sdca/sdca_asoc.c +++ b/sound/soc/sdca/sdca_asoc.c @@ -32,6 +32,7 @@ #include #include #include +#include "sdca_class.h" =20 static bool exported_control(struct sdca_entity *entity, struct sdca_contr= ol *control) { @@ -432,6 +433,8 @@ static int entity_pde_event(struct snd_soc_dapm_widget = *widget, { struct snd_soc_component *component =3D snd_soc_dapm_to_component(widget-= >dapm); struct sdca_entity *entity =3D widget->priv; + struct sdca_class_drv *core; + unsigned int fn; int from, to; int ret; =20 @@ -439,6 +442,19 @@ static int entity_pde_event(struct snd_soc_dapm_widget= *widget, return -EIO; =20 switch (event) { + case SND_SOC_DAPM_PRE_PMU: + core =3D dev_get_drvdata(component->dev->parent); + if (core && core->hw_ops && core->hw_ops->pde_pre_pmu) { + fn =3D SDW_SDCA_CTL_FUNC(widget->reg); + ret =3D core->hw_ops->pde_pre_pmu(core->sdw, + component->regmap, fn, + SDW_SDCA_CTL_ENT(widget->reg)); + if (ret) + dev_warn(component->dev, + "%s: pde_pre_pmu failed: %d\n", + entity->label, ret); + } + return 0; case SND_SOC_DAPM_POST_PMD: from =3D widget->on_val; to =3D widget->off_val; @@ -451,6 +467,20 @@ static int entity_pde_event(struct snd_soc_dapm_widget= *widget, return 0; } =20 + if (event =3D=3D SND_SOC_DAPM_POST_PMU) { + core =3D dev_get_drvdata(component->dev->parent); + if (core && core->hw_ops && core->hw_ops->pde_post_pmu) { + fn =3D SDW_SDCA_CTL_FUNC(widget->reg); + ret =3D core->hw_ops->pde_post_pmu(core->sdw, + component->regmap, fn, + SDW_SDCA_CTL_ENT(widget->reg)); + if (ret) + dev_warn(component->dev, + "%s: pde_post_pmu failed: %d\n", + entity->label, ret); + } + } + ret =3D sdca_asoc_pde_poll_actual_ps(component->dev, component->regmap, SDW_SDCA_CTL_FUNC(widget->reg), SDW_SDCA_CTL_ENT(widget->reg), @@ -502,7 +532,8 @@ static int entity_parse_pde(struct device *dev, (*widget)->mask =3D GENMASK(control->nbits - 1, 0); (*widget)->on_val =3D SDCA_PDE_PS0; (*widget)->off_val =3D SDCA_PDE_PS3; - (*widget)->event_flags =3D SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD; + (*widget)->event_flags =3D SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | + SND_SOC_DAPM_POST_PMD; (*widget)->event =3D entity_pde_event; (*widget)->priv =3D entity; (*widget)++; diff --git a/sound/soc/sdca/sdca_class.h b/sound/soc/sdca/sdca_class.h index 74db9d4ce4a2..1278159ea61b 100644 --- a/sound/soc/sdca/sdca_class.h +++ b/sound/soc/sdca/sdca_class.h @@ -29,6 +29,13 @@ struct sdca_function_data; * an array of struct sdca_function_data and stores the number * of entries in @num (must be > 0 and <=3D SDCA_MAX_FUNCTION_= COUNT). * May be NULL. + * @pde_pre_pmu: called before DAPM writes REQUESTED_PS=3DPS0; use to + * prepare device state that must be valid before the PDE + * sequencer runs (e.g. IT_USAGE); may be NULL + * @pde_post_pmu: called after DAPM writes REQUESTED_PS=3DPS0 and before + * ACTUAL_PS polling begins; use to commit pending register + * writes (e.g. FUNCTION_ACTION) on devices that require an + * explicit commit trigger for PDE power-up; may be NULL * * Codec-specific SoundWire drivers pass a pointer to this struct to * sdca_class_probe() from their sdw_driver.probe. Codec-specific @@ -39,6 +46,10 @@ struct sdca_function_data; struct sdca_class_hw_ops { int (*hw_init)(struct sdw_slave *slave); struct sdca_function_data *(*get_function_data)(unsigned int *num); + int (*pde_pre_pmu)(struct sdw_slave *slave, struct regmap *regmap, + unsigned int function_id, unsigned int entity_id); + int (*pde_post_pmu)(struct sdw_slave *slave, struct regmap *regmap, + unsigned int function_id, unsigned int entity_id); }; =20 struct sdca_class_drv { --=20 2.53.0 From nobody Fri Jul 24 22:18:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C9B2C46A5E9 for ; Wed, 22 Jul 2026 23:42:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763761; cv=none; b=kKM1QT3gVfRtEghGIhNGtGqzqBSSXTbjnbwgd2jL3kUXmkVSktVcTT/RtEmfzOJ6rk3ZkMiWeagf2WjjmT1EbvfzqUGZbr5mhaBIuGUz5Edg8NEom/EsbDA2BL+h1jOCclOAXrAdNyiOAkGzwAxx+/YRmodhTYZX9K0uDzg9jlM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763761; c=relaxed/simple; bh=7zLqofSl1fFRrfQhgsKi3J3B3rL/IRezTib4sF9WHmI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SxEWoGpxJ56NKtNduRKTrrKZlEVu/VmMRKPKmRhKcJW9EHwZfKsjgpPrae+/ynn8eisrJLtfBUl5bqX4aZJD/fi7rmlP7Ns1IaFTM2yYvLR61BtfgJbcpMk884JcabBhWBQHs/Tm4CjRVeaNHRGscAoogPoMmJXGO7KP7dvxhgY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=pyYY8QNc; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Mk2IDjm9; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="pyYY8QNc"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Mk2IDjm9" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MMoPAS2142654 for ; Wed, 22 Jul 2026 23:42:38 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=oqvjgH5GFBL 7f+z5ZXVfT3VkAPAKsKCcpcjs7sW2udw=; b=pyYY8QNcHHHbFkhGM3eeUorAELn SqpOXkrEqw9HADN27FgmDM1gvOx010xUdRDMjDc5pyOAYqULghMtgLWoiTCbqCWz 8I0l83xvN1PnQmtJ+mRC56wn/2yqVArGXoWsWPqzch12+fD2rqYNYRoJ3wqrGTSm mXa3+3MqG0n2bU9OnLTD1y28iTA4103xevs8C1G2AANhn2MHztN3Tah1SXEWAr05 NEi5PitefOh6Gq9YnEZ5nUDZyFtlF+PJAI1AIVD+i99DfNF4jGDBiWdjeiofKn0M qoFwf/iFq0ngQWZOn2Cviw/5WwCu7B4LyJmPWK6Go+8yRxhscnmnhBSpWAg== Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fk28vhc2m-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 23:42:38 +0000 (GMT) Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-52827090cc5so432781cf.0 for ; Wed, 22 Jul 2026 16:42:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784763758; x=1785368558; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=oqvjgH5GFBL7f+z5ZXVfT3VkAPAKsKCcpcjs7sW2udw=; b=Mk2IDjm94rCybPiWn5lwusYrLe52EKHiu2Xmq5wJJLUGPRQtgVGSFSrejQFhriBGDe BgtAAKaSdvkqA+74H2F3HTB70cJKgavX1bbCBJwotUfOuQvqQTHdso6Tid5F+FPnkVCK BmCizer6hRFHfrCcjMqE2BgND6uu0VZWLu00QumcFPDn3xfmFRD7tulu+itSkOQ5wRD6 AtlyalQTeVj4UTVVlN2leP837WIfAtEKDuXbu9RItHjcL29YVALXJ4TPTtwq7id4Ng7z ZsBhJTdridQSLfyuDIrF4+3rZH8LXIWgnhtosTqDD7ZF85xKnQMW4K4ZUmOPWarihkqx +CJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784763758; x=1785368558; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=oqvjgH5GFBL7f+z5ZXVfT3VkAPAKsKCcpcjs7sW2udw=; b=U0PaQVxzU/XRtEqw9IMlv41nVn+vqvomMVfS8a9KkvT6KRKinLKW5kOZA91K94iia+ D2CU5CMKWF/VO5rUNhM53CC1irLFfnQ51bcNUs8cSeQl30vRnkI5drHF9Nkg8YaegEmi 6ovOw4iN+cNitwMlXY8n8YDoUdte49/AnWkGf5zAAaEa5uBkpFUsW6gBlzjweevCjXqg qe+roYKWBZxX/FEGceP/PFZfpmuDBuQNJ35WqXFaCYD9PExmA4MhRSIUQo0jElUWKd+n P8mHLPvSIsTKkChMQvVLAJD2MRQE+zWw3eM2oltgHR+HJC+b6lCPEjJ1XGxnhVTruzr6 bMNQ== X-Forwarded-Encrypted: i=1; AHgh+RpDNNeFG86jEFID/Nt8eS1ucBtBQRGm47YrUzLtkN93znlUS3ihjYaaMYN+Kw86Ta7tsXf6U7hVdo4AHDU=@vger.kernel.org X-Gm-Message-State: AOJu0Yx9wfgetVgkaTsS2oeOTWOBi2vz5oAArxmDlPXHRz8Qg1vGD/sG iA5wTw09BWIO2/s1YI+Jt56TplbvNRBCGYxGPZAYEfV5bcwYSjYhyDltbMRWJlHhB5tIfJvMCNq Hyq28YX5BGTMcu1RvX2HZDLQL6DKbbn23aM+jMflTKIfYDU0LU5cXVMCKwSRVTQYakeM= X-Gm-Gg: AR+sD118R+mWnguH042Z4WvLH+j3S/0jMeSFHizWr+fvrHBQbsSgi0ySvD/AgBVkzVS MRbK0fW0tfc0U00rGL0KVgsilSwGDvOMQZV8x8RJbZjpafLLW0T8EGBSdgzu/oTHq4DAQUg+gWn lS4TvQpYLHOy1lGpxR6ph6s/iEy3tzLI/SNPb3nGY6GRFnzbbQi3vMNpIVryZs8h2OWmSpgdqQi N8/mN3C4a/BntWWKYgN7piRPd9oXThoun3mIFum9feelG6AG7Jq1aoDckDifOyXwDLPvu86l6e7 R0Et71sxKc1/wfQv41TT47P8wkw5lTZlzl5sAMKB6+jPyMZUMdndh5/UYNNdxIH6uJ2RcEOXTo/ KenhIYntebAeyUA== X-Received: by 2002:a05:622a:2c2:b0:51c:98f:f288 with SMTP id d75a77b69052e-5283edce89bmr4129781cf.25.1784763757994; Wed, 22 Jul 2026 16:42:37 -0700 (PDT) X-Received: by 2002:a05:622a:2c2:b0:51c:98f:f288 with SMTP id d75a77b69052e-5283edce89bmr4129461cf.25.1784763757480; Wed, 22 Jul 2026 16:42:37 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4956a4aae16sm101796345e9.0.2026.07.22.16.42.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 16:42:36 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Charles Keepax , Maciej Strozek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Bard Liao , Pierre-Louis Bossart , Richard Fitzgerald , Jorijn van der Graaf , linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [RFC PATCH 5/8] ASoC: SDCA: class_function: xlate sound-dai cell by entity index Date: Thu, 23 Jul 2026 00:42:15 +0100 Message-ID: <20260722234221.884765-6-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX8PCj2iSMWA+H ajG40xag4jmswP4xVFOTeyDM6OxMHEhgCdwtjpQnCl5H7989LzRhv7TS/lqzd6UMy+/qbIE4Sma vxdoU8KOVXQGS8ZsWtb74jILC43ZSZU= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX+K9bkYVn/ARI h55/1gu0nSco0zpXhTbMgRRrX2w4NI5UsKLMYqWV95aTNc59hQ4DdOUyM+lzg6CHUOAXIpQlnwM 8BqSM0j9rBGoIKXrLMT1ZU2sZos6XPLqB/TR5zQQZnGfeKDh9pIqTyaCo/vIBAdkU8AhRyW/NBF tfXVBrfcSujfNtuU6Rg01FoayhLQV2gnKAgvktYdMjCG0yt4kpL9iS1gGEE2wNHLwQ8U/ss7/Np FYWTRyzJPSQhAMyoPKMBN8GH7t4RIkfIECqkOf7cngy6zKAG0BHEDwhO2/pGPFR/xeZMqFDKGIV H+DKHEy3VW1ioVYJfbX8XekEWiJVhqXNbsi5HSDmtaKxogZS6gzYTAkkg/HPk4elDwKxt/wZpz1 cvlhGjow5inTOy8Tg4MQBUPez2ynsu6tB4mANYqekS+YBhI/n8nJfmjWDPrkfvDwsPySa6707ms VVmJjleAtDL4OPT8pRQ== X-Proofpoint-ORIG-GUID: 3bvydXJBA-zwREnHWW8DWBmNSB2_snIq X-Proofpoint-GUID: 3bvydXJBA-zwREnHWW8DWBmNSB2_snIq X-Authority-Analysis: v=2.4 cv=D4V37PRj c=1 sm=1 tr=0 ts=6a61556e cx=c_pps a=EVbN6Ke/fEF3bsl7X48z0g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=D7LRd5SpCY7MsyqoJ6wA:9 a=a_PwQJl-kcHnX1M80qC6:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_05,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 adultscore=0 priorityscore=1501 phishscore=0 spamscore=0 bulkscore=0 suspectscore=0 impostorscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220233 Content-Type: text/plain; charset="utf-8" sdca_asoc_populate_dais() sets each DAI id from the SDCA Function's entity array index. ASoC's default of_xlate_dai_name treats the phandle cell as a positional index into the DAI list, so on a Function with non-DAI entries between dataport entities a sound-dai phandle resolves to the wrong DAI. Register a custom of_xlate_dai_name that walks the entity array and returns the dataport entity whose array index matches the cell value. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Srinivas Kandagatla --- sound/soc/sdca/sdca_class_function.c | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/sound/soc/sdca/sdca_class_function.c b/sound/soc/sdca/sdca_cla= ss_function.c index 905c96ed6172..b0fbe243d732 100644 --- a/sound/soc/sdca/sdca_class_function.c +++ b/sound/soc/sdca/sdca_class_function.c @@ -216,9 +216,44 @@ static int class_function_set_jack(struct snd_soc_comp= onent *component, return sdca_jack_set_jack(core->irq_info, jack); } =20 +/* + * Map a "sound-dai" phandle cell to a DAI. The cell value is the SDCA en= tity + * array index (matching dais[].id assigned in sdca_asoc_populate_dais()),= not + * the positional order of the dataport DAIs, so the default positional xl= ate + * cannot be used. + */ +static int class_function_of_xlate_dai_name(struct snd_soc_component *comp= onent, + const struct of_phandle_args *args, + const char **dai_name) +{ + struct class_function_drv *drv =3D snd_soc_component_get_drvdata(componen= t); + struct sdca_function_data *function =3D drv->function; + int target =3D args->args[0]; + int i; + + for (i =3D 0; i < function->num_entities - 1; i++) { + struct sdca_entity *entity =3D &function->entities[i]; + + if (entity->type !=3D SDCA_ENTITY_TYPE_IT && + entity->type !=3D SDCA_ENTITY_TYPE_OT) + continue; + if (!entity->iot.is_dataport) + continue; + if (i =3D=3D target) { + *dai_name =3D entity->label; + return 0; + } + } + + dev_err(component->dev, "xlate: no dataport entity at index %d (num_entit= ies=3D%d)\n", + target, function->num_entities); + return -EINVAL; +} + static const struct snd_soc_component_driver class_function_component_drv = =3D { .probe =3D class_function_component_probe, .remove =3D class_function_component_remove, + .of_xlate_dai_name =3D class_function_of_xlate_dai_name, .endianness =3D 1, }; =20 --=20 2.53.0 From nobody Fri Jul 24 22:18:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0725146D0A1 for ; Wed, 22 Jul 2026 23:42:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763763; cv=none; b=vALExAtDeATHveXhFxKy9/djzFadZQZyq20sZTGASV9Ecl3ep3WUmBabgyUGQkAJcnHloeEaVqgVn1w8wLmNcZ4U+cN1Of1MMUtkIv0Ezr74S3Tm3Le8QR0rGf1SFCDqP6WkzL5yGPpSwhV8FdiPYs3xOj1MvFVwuQyu+jAThhQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763763; c=relaxed/simple; bh=7rkC2k0Lo1vXVJ45Hmq7MvKzcx0DEVOuMEPgR81TGc4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Lgm3eViEHyGMugMQd9A+m77TWv/3Z4nNmS141ogYig/zESoT/baj3+xXlgGHg7A9vfRtDdq3qgOh8ff0KPaYqamW4I3PICAdZl2SiOs7QC5Y4J9sadOc+xuWq7/chUOicE13lLqKRBds1OB+oIU78dG0y5Es369+bx/F3X1eRz0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=nv59NaIp; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=MnxWE2cb; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="nv59NaIp"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="MnxWE2cb" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MMoPAT2142654 for ; Wed, 22 Jul 2026 23:42:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=S9XQeQnGmad nUCXQJ+wg7LPiyIzeyxrCrD18wQUy38Q=; b=nv59NaIpNut9agHnKuIk6yldifR +lL9Nur4YY0SjpyIAUGUriwDyXoeqrDvl6n88fzCojzc1+56bb2nYNP+uiIr6M/j rydnktn3uUbJ08tzhDwGZpAawcztDRUy/rAvIoTWL3rJYzhl5PtTNGsoR4oIJWcA YDkFRwFY6BfkJ48c4yc9tyLuug842Ege7FgE/KIIykB8baq3kLsDoRL0NUL0JAXb s7XYjr9GxSTw3DLmdA4j3Zt56P/fsyESM90mi/R6kfqCNcq+EULGh9bpYXhFlciu P6xEyBrPSePHpK0/3/9+Z5PxJW1r02tGnW1wUYKzepepuAlFvZTW/IeNPQg== Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fk28vhc2u-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 23:42:40 +0000 (GMT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-51ebdfceddcso258501cf.3 for ; Wed, 22 Jul 2026 16:42:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784763760; x=1785368560; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=S9XQeQnGmadnUCXQJ+wg7LPiyIzeyxrCrD18wQUy38Q=; b=MnxWE2cbKjxcCF70RGxDhQHHNpA+XDemq9DB7tbBskDQKYfc7cbCG9ul1Mtr+tLMgq WfCwaZNNG/BiVTx3vYRLa7gCKguVu55bs6MIISbx09MFkmd38oPRMA6ZJfmZhdVyGLjs LHvWLdNlySPhHkQYLXeMSgpYBNWtM5ZPcLbeZE7AlY5EboRu3PvksGxrqW+S0F2aONqX QQAwKYyWJE32WDfWYj9T+sFSUNXkkvNSTDA6gxVxzsEUi1GBLPDn9IH/ioIcA9t9xQxZ ZnYz0k4zCmNTK0Q1ctlLInrHLpwARigfS5j/UlaPDuJlOVdSMlKd9JHxFNQNKHzRnZLh wfTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784763760; x=1785368560; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=S9XQeQnGmadnUCXQJ+wg7LPiyIzeyxrCrD18wQUy38Q=; b=tQt3PNXCbNXieT+TT/Ngz+xdQYWs1cZc9az+e0EmqNd7fIgDJk8N1o+V8UQII2LlDR 8vnyjNj6XX36MWBJ0Ek8Wi8MZCRtvE8ZXXtnDJFNciQUEw4ePkX0Kt+KvMcBjBsn1YUv /1UK4tRI9L6H5pN0KDx1RES5k9aCXieeVNwjqm6cpMRTjL6no6Y7UZV/Mo8l7zoKcRK9 7TVw/YkBSTL++h/Ic8LuoFVMTBpnqAbKP2F34QUpUJbMejGgi07ZyA4PLQV8FjracKDX CHM/Xc+nSK09MCGL7Ypc9rmrOB9+kqfE0jTQVxVRUYunlh5xZ05HlBFLmf4g0Bij1el9 nQ1Q== X-Forwarded-Encrypted: i=1; AHgh+Rr34uxafsq2lohqxQKlxxVGHZTm3yj17+qSKXVMSQS8PRJameGFBeAKRkmYkqZzZQ4ECdRX0+NKgZAHyAk=@vger.kernel.org X-Gm-Message-State: AOJu0YxN02s9KebTrMzg2L2vH9OMOoosJODidbRJ2XbdqA8g+1dsOgD+ 9uirkBGUW2zmueeQ/v15iLoMP2h7WEFLVKEeSzdtJrX+BdGO5P9ulH/SWzukwXUZItE4lBQ4zqt 1VkuSOxGnInspuwQaENNRAhfZXLZFoiwOpK8/resQEygBA/vfGCuNLQBRTC54PySdYQY= X-Gm-Gg: AR+sD11E8rqCZuWLKRKI1DzoPnfig7/43gcDJHmumKJNqSu8aUlChibld3FXrA5YOjq ZnYIMsr76gYaEVzjqoJRVHH0j1dthUegBx4lC7/ZSRjtuua2kO22NCMY/RBnzuCp02Pst0pIMUV l4jFjWsGAw3MVu0V8v6zVf4dSdkX0x9c1qpEmjep878nSPnd+Sx5d930hS2ytOByZCljtRCaPen D3iAyPDUqhywfcsBtfLc7+Q8rCsvLFegbFxUh33HauHAeZRQO5/3c7iK+Y8yBXeYgFEnNfHbFZg fnaSReFvqb7xmou+BTYg6mnc7kLxfwWAyF49OYmaz7xTyZOl6heEAVaemzsI00NVBXkEJJnuzQp BiJz12QCICDG/Ow== X-Received: by 2002:a05:622a:64d:b0:51a:8c97:938e with SMTP id d75a77b69052e-5283df680bamr6735111cf.69.1784763760287; Wed, 22 Jul 2026 16:42:40 -0700 (PDT) X-Received: by 2002:a05:622a:64d:b0:51a:8c97:938e with SMTP id d75a77b69052e-5283df680bamr6734631cf.69.1784763759798; Wed, 22 Jul 2026 16:42:39 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4956a4aae16sm101796345e9.0.2026.07.22.16.42.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 16:42:38 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Charles Keepax , Maciej Strozek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Bard Liao , Pierre-Louis Bossart , Richard Fitzgerald , Jorijn van der Graaf , linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [RFC PATCH 6/8] ASoC: SDCA: register SDCA_FUNCTION_TYPE_SIMPLE_JACK in class function driver Date: Thu, 23 Jul 2026 00:42:16 +0100 Message-ID: <20260722234221.884765-7-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfXxO/HlWfZs+UO u3Y6h/xiMJLqGPdm+OYF5tmgcbhX6R3g1Qk1TkfExgdbPlhS0t6EQyh3jE8HcAQInoCax7ALbAK OdaLdKMXTXG0wTEKUv8nlfxVQ428mWw= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX8tgqYeMCAkaS mtTlT0Jp5L9mSKx3QLP6i2MUhxg0Rc56F12aYD/u1Xpkjen3XgcLTEhm7lromIfH2GtNULveg/x xl2uhbzqyTvbfaSpD15hsH2BMjP5qzPIE/iCNnNxYvyNLKs6Mm6QaohNaGcrl7CHvfj7u3GZL06 9kw7A9jVV/JGAhew85n6jsPYvPOpd15LXq1hmh3DIIG6l1en6R5lrs0Rz8l1at0LFCxiasviUPi T88acIVzSW2pI9vxLKhWsFIVBS6/VqtQpma6l3djt9TQeV0Qjsg9w/JWpYwwCXRDUPICI7Csi8k VSL2SvefhfoRgiPwBRFZVbHHEKfsuqfMA/L629EfR12Xz1hyX0t/lxj7p2hHe7fDwd02uNwWDFX DzmiqMuc6kP8MHNjYOLuC7zEpIXPV0+Tyw7a+dzatAjCBmbKxg6FZL2ihDFywgTih4bhmRJCMko 535mw7+XTEmmPSGv5vA== X-Proofpoint-ORIG-GUID: 6v8t9D-YRGAOwfipkzQ4koHsKEe3KqVm X-Proofpoint-GUID: 6v8t9D-YRGAOwfipkzQ4koHsKEe3KqVm X-Authority-Analysis: v=2.4 cv=D4V37PRj c=1 sm=1 tr=0 ts=6a615570 cx=c_pps a=mPf7EqFMSY9/WdsSgAYMbA==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=_VQL4OnVw18WlseRxScA:9 a=dawVfQjAaf238kedN5IG:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_05,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 adultscore=0 priorityscore=1501 phishscore=0 spamscore=0 bulkscore=0 suspectscore=0 impostorscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220233 Content-Type: text/plain; charset="utf-8" Add SDCA_FUNCTION_TYPE_SIMPLE_JACK to the class function driver's auxiliary id table so a SimpleJack auxdev is bound and enumerated as an ASoC component. Wire set_jack for this function type so the machine driver can register an ASoC jack against it. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Srinivas Kandagatla Reviewed-by: Charles Keepax --- sound/soc/sdca/sdca_class_function.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sound/soc/sdca/sdca_class_function.c b/sound/soc/sdca/sdca_cla= ss_function.c index b0fbe243d732..ed00bc1eeafa 100644 --- a/sound/soc/sdca/sdca_class_function.c +++ b/sound/soc/sdca/sdca_class_function.c @@ -436,6 +436,7 @@ static int class_function_probe(struct auxiliary_device= *auxdev, switch (drv->function->desc->type) { case SDCA_FUNCTION_TYPE_UAJ: case SDCA_FUNCTION_TYPE_RJ: + case SDCA_FUNCTION_TYPE_SIMPLE_JACK: cmp_drv->set_jack =3D class_function_set_jack; break; default: @@ -621,6 +622,10 @@ static const struct auxiliary_device_id class_function= _id_table[] =3D { .name =3D "snd_soc_sdca." SDCA_FUNCTION_TYPE_RJ_NAME, .driver_data =3D SDCA_FUNCTION_TYPE_RJ, }, + { + .name =3D "snd_soc_sdca." SDCA_FUNCTION_TYPE_SIMPLE_NAME, + .driver_data =3D SDCA_FUNCTION_TYPE_SIMPLE_JACK, + }, {}, }; MODULE_DEVICE_TABLE(auxiliary, class_function_id_table); --=20 2.53.0 From nobody Fri Jul 24 22:18:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB89C46D2D1 for ; Wed, 22 Jul 2026 23:42:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763767; cv=none; b=FN4P5AZDgCN6y9OQxnSUxTJWcdbBvDT9WRoj3U+t5Cp2WOXOnH1dlbVinS65bLEv3B8JJeDuCQ5ZV+J7WBb72k+pn+tNTphTFGJeO7auYRxa9cN1v8/DGk+RFdaNYoO9aICqTMeFtppb5zY1lwb71QJ0BV6/on8GBiykSp391MA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763767; c=relaxed/simple; bh=pOlNWN/SE7+GOWg3lwO7wBAjUsf1hbmGRPplEOANydw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WU4Lb7FahvqQwi1dts6dul4Mgfa0Ma0+4Pj5kxmHBD6d9rUHDluBNoKqqfH59j3ZhEdv7cOwz2gL5BZ+nwVX6I2BoV9U6+GhpSzl2kgqeLPt199MMefWqY96Sb3MDKpaH0uXAg8U4wQTv1/wrO0+kqw7uKBoDzXC/nvELxHZRGc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=moYpWRxq; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=dVjVYExl; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="moYpWRxq"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="dVjVYExl" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MMnZur2295565 for ; Wed, 22 Jul 2026 23:42:43 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=L12LTqZQ+Uv nxuqB4DZoUExrnf4AgkG5KfhXRLi+mUk=; b=moYpWRxqFsJuva115DBLOU9LJbH 3W9mhpBVHlEZxIIkHnJPlgquNGmlfKoi6X227+jZqBD9SteYUfhtXBgNzX/y3yoW jqcUzNq4vcP0g7v2E+FNDtRUY1U6a14mWIxsH3C2bEfBRoQ6H3j5ot/7uB0sB1ZO dkEFDR27PrLUF15+qyjTnd/bWk6mUTgakDsGTmGD7mH2iVQ0CADCXZuBBVB5IFxO F9NcGLRvur9BQI8sUYd/NiQvbOP7iABWug9oZrB7s0xWdxIQjI29EhYfqxwh5a/Y BuAHVV/WnbD0hLKwOTe9JC2lb9k55lUOn269oZFBG6OtM26hWOvIxlqfsLA== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fk6c7g805-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 23:42:43 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-8ef18406878so1054556d6.2 for ; Wed, 22 Jul 2026 16:42:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784763762; x=1785368562; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=L12LTqZQ+UvnxuqB4DZoUExrnf4AgkG5KfhXRLi+mUk=; b=dVjVYExlMyQeLAkl6em4txps51GPvxoWLvsjX3Tt4BvXEt6o5PmRv3W3I4L9UX8AN+ zVuXpNpmxyxxbQ0CC8PnmXgZX8H9HuFDBlM3MVMQbkKtoorLuE9X3t1KO9W9XEZPeUUT 6eiagRNEgpPUOahtuX/RGINa/mBMpeQWQP7yhN91vhacIt1bToo2PJciPK+1De1ghKuw aC1VEOW26jJPCm8GA1itAVAG99rvBK+SCCZKOMENReOqdH7qLQE9gIqtI/UF5Xgi1EBr N9JWeZXJW7YbJcLnWMTHdWWAf3gzLIFZLFqkua+Oddb/HVSKvQl+ZzwzHJRzTeNp+5Fw kecA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784763762; x=1785368562; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=L12LTqZQ+UvnxuqB4DZoUExrnf4AgkG5KfhXRLi+mUk=; b=VEfz3MPggYEZhjS7DUIx5Ga3W7xob7gueyuieuvodIZou2MWraLqOonHOQzwbv3Db+ Yulx+6Ep6LEgflpWQrqflvu+a2dehmIP/pug7ZqxGHEhZRaaBxp4xxCNfB/vAK2PWjXP G83mLlA0yE12Tt38IwccJMe0CWPPLnBq7bnxwcrPmGRzKpuxg1dHfXOoeQYe6+le41K6 uZJn92xNPYNHA9/VWuVmptGKwEc0eRN7mNbm+ZSnlFvaWYJdx6/zl0N2C7y3SRi6Weyv 6gh/9cp0O7Q5UpnsCe8WVM6cHYrFLXTKlKuQ/tBpGyS3j6EEL0Sr+4srK3Hiy3fbnz2+ SChA== X-Forwarded-Encrypted: i=1; AHgh+RoMyxs1Dglk2nLcCmRPOl0Ui2ZiQGbJz1u08bviFue1OQWk9KJ3q0UWVqfIchkvCLN3MH28HWYQ5W925n0=@vger.kernel.org X-Gm-Message-State: AOJu0YwOpTKNAEpJgt+S/ZF0y34oR5k08N4279q0w73P5UImiBtT3e3W Wntic6hYHheXZFtcf4cpO4exRDyr6l6k8KI4+nOermtTcEwoV4d89k6SzjL23ygUZKJifMEgsrL 5Z/jcGJPIIRs2oz6QWvxQmb6zPj+ugBMwZh3zpbhnRe1C88pEQrf/RdDCfNQCtQKXydSTIP+Mhx M= X-Gm-Gg: AR+sD13hKye6T0dfhKHlkZaaiZmOWzSVzwWv7tule55EMn0O2oo1vTUI4TwIjABEFI/ xTpB+/EqxwrBLok3CbDwHJ+MWBElc9X6+g63rdx0Qd/xN9cdNfS/imv5YqqT3zPaXrzifi5d/mI DUh4tpl/2Z4HzNzO8qEOaXnBz6rwi/xVzTtDyXeeoPIqLtzZSW+3WXSagupTvwkodnMOZWbhVg9 MReladNBi76pWq16dsEWL/vANcStnaEnyOD0ZjNK68v0j/tBUrFuBw+9OhbrrICa8nOBPh2Y0SI cSw5kbDZMuuywLU8UA9UqGv9PiSCB1juMDDownq4O7jC8maRhrftKc/5/XGRZb5DvbmHDchNJGN yO6e9eAc/QPBseA== X-Received: by 2002:a05:622a:580c:b0:51a:8c9c:7f3e with SMTP id d75a77b69052e-5283df4fe14mr6874151cf.65.1784763761819; Wed, 22 Jul 2026 16:42:41 -0700 (PDT) X-Received: by 2002:a05:622a:580c:b0:51a:8c9c:7f3e with SMTP id d75a77b69052e-5283df4fe14mr6873761cf.65.1784763761209; Wed, 22 Jul 2026 16:42:41 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4956a4aae16sm101796345e9.0.2026.07.22.16.42.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 16:42:40 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Charles Keepax , Maciej Strozek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Bard Liao , Pierre-Louis Bossart , Richard Fitzgerald , Jorijn van der Graaf , linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [RFC PATCH 7/8] dt-bindings: sound: qcom: add Tambora WCD9378 SDCA codec Date: Thu, 23 Jul 2026 00:42:17 +0100 Message-ID: <20260722234221.884765-8-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: omNiY0q_ZWhGhx3VU-Yg167P4b8B_JPI X-Proofpoint-ORIG-GUID: omNiY0q_ZWhGhx3VU-Yg167P4b8B_JPI X-Authority-Analysis: v=2.4 cv=baZbluPB c=1 sm=1 tr=0 ts=6a615573 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=gEfo2CItAAAA:8 a=EUspDBNiAAAA:8 a=GYSh3LzNAAAA:8 a=s5uLdfJeeDcd-HM_FJ0A:9 a=1HOtulTD9v-eNWfpl4qZ:22 a=sptkURWiP4Gy88Gu7hUp:22 a=lWcdFasyL5yHfcDTNXXo:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfXyO+K3IK9GLeM hqhBp4e4VugLibJm+stV640apZ7LGOisJMJWMkYLmRNyj4WN1Qr6EmSbfZbyvcDxIUZC3DRJq5B /wXaQTzgoQ7vXfXqh46xVj9+pX4kSoc= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX8A2v9djaW531 gvzWOlle7fWsiH5DIbFSLccjZGl0Tfrdg7CNcIpvPDTBPj4vd1YEnD9NYhvj4fFzXssNzCwuKG4 GJVo2r99MiOiV8UEtdRp2zH5bhuDMvlkaKDVKlAkRIQptOoGLV6LBOyTmvuvMkAezK5pIqd3EKD iQ2Q2trNS3gKp8LdqRa2Iezk+Az9qXjM4bWWXD9Oesmic4H1tR22hpdG0FFTbn7I60XMA76B7B8 1plI4ULIUcHhvnXX0LslS74kF8vBsULecFZRc28jzfCbB+8h7yo+/o+7ZwLiqz/dP0CfyTTreFh yH1soPTCLnlCW7XynEaV1SQ50+QBKWMrHsXAb3qAIV8ubIdlMraz49EwgS9uWN12oGM2tsXYNf3 nXL302VFkNPoAR57MrRxYAmo92EXopDf4+AorQQxc7Wi1bVr99CvjQ9hPh4f3l57/3bGXdOBBUy PQuLJql4fOVkD9Vbacw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_05,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 malwarescore=0 lowpriorityscore=0 phishscore=0 suspectscore=0 adultscore=0 impostorscore=0 priorityscore=1501 bulkscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220233 Content-Type: text/plain; charset="utf-8" Describe the WCD9378 SDCA peripheral node (compatible sdw20217011000) driven by the wcd9378-sdca codec driver for headphone playback, headset mic capture and jack detection via the SimpleJack SDCA function type. WCD9378 codec can be wired up in 2 different modes. "mobile mode" on phone/tablet SoCs is enumerated as tx and rx device, each of which has dedicated control and data lines. "compute mode" on compute platforms such as Glymur is enumerated as single standard MIPI SDCA class device. Both modes share same Device ID, compatible; qcom,compute-mode selects which driver path is taken. Supplies, reset GPIO and mic-bias voltages live on the SoundWire slave node in compute mode and are forbidden in mobile mode (owned by the top-level codec parent there). Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Srinivas Kandagatla --- .../bindings/sound/qcom,wcd9378-sdw.yaml | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 Documentation/devicetree/bindings/sound/qcom,wcd9378-sd= w.yaml diff --git a/Documentation/devicetree/bindings/sound/qcom,wcd9378-sdw.yaml = b/Documentation/devicetree/bindings/sound/qcom,wcd9378-sdw.yaml new file mode 100644 index 000000000000..2ed4ad92958e --- /dev/null +++ b/Documentation/devicetree/bindings/sound/qcom,wcd9378-sdw.yaml @@ -0,0 +1,200 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/sound/qcom,wcd9378-sdw.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm SoundWire Slave devices on WCD9378 + +maintainers: + - Jorijn van der Graaf + - Srinivas Kandagatla + +description: | + The Qualcomm WCD9378 codec presents its SoundWire slave devices with + class ID sdw20217011000 in both operating modes: + + * mobile mode -- two slave instances sit on separate SoundWire + masters carrying data only. A separate top-level codec node + owns the codec's supplies, mic-bias voltages and reset GPIO. + + * SDCA / compute mode -- one aggregated slave sits on a multi-lane + master and carries both control and data. There is no separate + top-level codec node, so the SoundWire slave node itself owns + supplies, reset GPIO and mic-bias voltage configuration. It is + marked with qcom,compute-mode. + + Codec drivers that match sdw20217011000 use qcom,compute-mode to + decide which mode to serve; the presence or absence of this property + also gates whether the supply and mic-bias properties on this node + are required or forbidden. + +properties: + compatible: + const: sdw20217011000 + + reg: + maxItems: 1 + + qcom,compute-mode: + description: | + Marks this SoundWire slave as the single aggregated slave that + implements the codec in SDCA / compute mode. Only present when + the codec has no separate top-level codec parent; in that case + this slave node also owns the codec's supplies, reset GPIO and + mic-bias voltage configuration. Absent in mobile mode. + type: boolean + + qcom,port-mapping: + description: | + Static mapping between codec SoundWire peripheral ports and master + ports on the SoundWire bus. Length and interpretation depend on + the slave's role as fixed by the parent codec node: + + mobile (5 entries): the mobile-mode driver derives direction + (RX / TX) from its own context (parent phandle from the + top-level codec node, or the presence of + qcom,tx-port-mapping / qcom,rx-port-mapping on other slaves + in that binding). + SDCA (7 entries): DP1..DP7 aggregated on the single slave + (index 0 unused). + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 5 + maxItems: 8 + + reset-gpios: + description: | + SDCA / compute mode only. GPIO used to release the codec from + reset. Active-low. + maxItems: 1 + + vdd-buck-supply: + description: SDCA / compute mode only. 1.8 V analog buck supply. + + vdd-rxtx-supply: + description: SDCA / compute mode only. 1.8 V RX/TX supply. + + vdd-io-supply: + description: SDCA / compute mode only. Digital I/O supply. + + vdd-mic-bias-supply: + description: SDCA / compute mode only. Mic bias supply. + + qcom,micbias1-microvolt: + description: SDCA / compute mode only. MICB1 rail voltage in microvol= ts. + minimum: 1800000 + maximum: 2850000 + + qcom,micbias2-microvolt: + description: | + SDCA / compute mode only. MICB2 rail voltage in microvolts. + Used by the SDCA SimpleJack headset-mic input (IT33 / AMIC2). + minimum: 1800000 + maximum: 2850000 + + qcom,micbias3-microvolt: + description: SDCA / compute mode only. MICB3 rail voltage in microvol= ts. + minimum: 1800000 + maximum: 2850000 + + '#sound-dai-cells': + const: 1 + +required: + - compatible + - reg + - qcom,port-mapping + - '#sound-dai-cells' + +allOf: + # qcom,compute-mode gates the standalone-slave shape: supplies, reset + # and mic-bias voltages live on this node in compute mode and are + # forbidden in mobile mode (owned by the top-level codec parent there). + - if: + required: + - qcom,compute-mode + then: + required: + - vdd-buck-supply + - vdd-rxtx-supply + - vdd-io-supply + - vdd-mic-bias-supply + - qcom,micbias1-microvolt + - qcom,micbias2-microvolt + - qcom,micbias3-microvolt + else: + properties: + vdd-buck-supply: false + vdd-rxtx-supply: false + vdd-io-supply: false + vdd-mic-bias-supply: false + qcom,micbias1-microvolt: false + qcom,micbias2-microvolt: false + qcom,micbias3-microvolt: false + reset-gpios: false + +additionalProperties: false + +examples: + # Mobile mode: two SoundWire slaves on separate masters. Neither + # carries supplies or mic-bias -- the top-level codec parent owns + # those. + - | + soundwire@3210000 { + reg =3D <0x03210000 0x2000>; + #address-cells =3D <2>; + #size-cells =3D <0>; + + wcd9378_rx: audio-codec@0,4 { + compatible =3D "sdw20217011000"; + reg =3D <0 4>; + qcom,port-mapping =3D <1 2 3 4 5>; + #sound-dai-cells =3D <1>; + }; + }; + + soundwire@33b0000 { + reg =3D <0x033b0000 0x2000>; + #address-cells =3D <2>; + #size-cells =3D <0>; + + wcd9378_tx: audio-codec@0,3 { + compatible =3D "sdw20217011000"; + reg =3D <0 3>; + qcom,port-mapping =3D <1 1 1 2 3>; + #sound-dai-cells =3D <1>; + }; + }; + + # SDCA / compute mode: single aggregated slave -- owns supplies, + # reset GPIO and mic-bias voltages. + - | + #include + + soundwire@7630000 { + reg =3D <0x07630000 0x10000>; + #address-cells =3D <2>; + #size-cells =3D <0>; + + wcd9378c_sdw: audio-codec@3,0 { + compatible =3D "sdw20217011000"; + reg =3D <0 3>; + + qcom,compute-mode; + qcom,port-mapping =3D <2 2 3 4 5 6 7 8>; + + reset-gpios =3D <&tlmm 191 GPIO_ACTIVE_LOW>; + + vdd-buck-supply =3D <&vreg_l15b_1p8>; + vdd-rxtx-supply =3D <&vreg_l15b_1p8>; + vdd-io-supply =3D <&vreg_l18b_1p2>; + vdd-mic-bias-supply =3D <&vreg_bob1>; + + qcom,micbias1-microvolt =3D <1800000>; + qcom,micbias2-microvolt =3D <2750000>; + qcom,micbias3-microvolt =3D <1800000>; + + #sound-dai-cells =3D <1>; + }; + }; +... --=20 2.53.0 From nobody Fri Jul 24 22:18:41 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EA57146DFE0 for ; Wed, 22 Jul 2026 23:42:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763770; cv=none; b=Fyu0govYvblNnLRe+y5lhjs9RuoNLuPUwADf5bIw8U8cHx1O9gohvWPEtjSPM4oo7enQeKepDHueMod/Di7/nhYbD5QnwAtXAq+swiyhY5btCYM8bJOJv1bkUWNA6UBJHmPjmoExq6saHKYERJBHcvU2OXeie35H/zitAP5e4Cc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784763770; c=relaxed/simple; bh=P5E6PJIAFHOvFKOojO8WfDv1X5hte4vtVCZ4CiYGIzk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aeOjRIUKND8nI1KaDhmLL4g1dr7BlYq9kG7dF4eI5WsROyaYCp08u4641Wu8CtBKBD0FvmCWMrYTHLZXantRirQD4LS6T0AEJTrVDQm5oCUZubICe2OmKs/wfOFtgYIyTt4rNdUsjblCeIIEshTSuRWioKug6Q5FKoz8sPyl7Pw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=b0lhoPYD; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=GvWjoSAe; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="b0lhoPYD"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="GvWjoSAe" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66MNCXrv2486054 for ; Wed, 22 Jul 2026 23:42:46 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 5/obpLdePENN28oe7/16g7wkCuj4dYNKilBuML27YeA=; b=b0lhoPYDKNEppbQ7 77O7MtCeYdSIt8izU/HZhoBcxN25V7qumxB+Y5wNftaG31ZhpLnPcSbURm8fsIuo ti2+cvDI9oQgfd/hlaSgvypVi4c8Px/TCvtV04inuSXMINovqmc76V4OM4SzNVvT aPTX6zY3YbDMF3P7OrsBbzFN+K7aV+26gGJNI+iQAiDfjtYCHBAMq9KPsz0rVgQ+ 2bFWyYo+NlARU+FCljqpFydM2EPNKwVwVVTMESWRkUDxshJ1l0QtFZzEkz4j9Og9 7JXHS/P+tTHG90DQbtk28mpHM1ha9rBy7BYBfHSICKuuyGIjNEdYPEYIBX5USRis Q6MwJw== Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fk7b5027r-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 22 Jul 2026 23:42:45 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-8e9489f62bfso1505616d6.2 for ; Wed, 22 Jul 2026 16:42:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784763765; x=1785368565; darn=vger.kernel.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=5/obpLdePENN28oe7/16g7wkCuj4dYNKilBuML27YeA=; b=GvWjoSAejhJBV9Mf6iy2vsWyczRb1nirHiqDqvr+p0x1QU9045AMDPxmGs5gp96uAm 2mP9hg/Bpd1G3MIwRnBJcDu4iR9pwqTMv5sggRJhWA/Svl4ysJEtAKmGyyTY347KERsq WYiqEL/M/HAHMFu+PDFPQ4sXIdzBuXFFh255qmgqrs7lUCYiHZ/5uoDaNZd48uiE1Ymt zKRBIbfaUZDvXZkQt2Wr+SPnEtLImLAG6pNOMOy4QTpsqBCeY6gjmkftscAPiVToEqwZ 1WN++PvFwMFyajLdn1Wrd5WnJDPwg65ICk+SAdgFnZxvIJHJLBAx3AyY6IhRxgqbhhJW iClQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784763765; x=1785368565; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=5/obpLdePENN28oe7/16g7wkCuj4dYNKilBuML27YeA=; b=VQZkLIsf2d4P9SwyL5soEglsDEYPZjnrMp+YvZIkx3JCOVZWxDODNxIHavwAePGPdL o2jlLw+IwP6VZlnHC6CixJXWzJyWaXWi60n/DOoUP3S2o2RnjfftvCA7fSi+RkDy/Vw2 6bHzYweNu5iUlz8WRlCX5stL389liii6a3A+NrqSMXrAPoLMdbdZZYAukps/rtr/W1r6 vgNngFq5rJ3MI2/aCMCPYavuwaqHKSdPcxPdrg/lN3/6HSENN83V5+0u80SDWv1AEcoI 6KMKcOuC2cumRW5GaOepkofxexOqimmwNVERusgm2GGrNLs/HrVu4qVyLDiE/Bm/FxIg oadA== X-Forwarded-Encrypted: i=1; AHgh+RrryKtnQPriF7vBBGW/JVozYkBymDcRHYCYNghCcCBNVOc3gM2eG2kXq6qnsLtXYkAY6aDOc9y3PUBYtKU=@vger.kernel.org X-Gm-Message-State: AOJu0YxoxA1UKeGxIpTv2oNpd0zhLpiqPtIWFsc5we1XECIlHV5QcEwq H6GD/IBh/Nr3IKoa1jk0eygwdkuMdAMH2YH8nuBcMCrGkQKqxotQIYKf8N4XKmDsSrp6o453+2b ViOJl3P7/aZQx/t/CIy62+zz6uXH0QFAc8kHdh6Xf3RJrFYz2QdH8nOTy82wcRYt6Qg4= X-Gm-Gg: AR+sD13F8SNH+IHT/9cy98miLrdX8SrG67JaobI5Ge06zHR2zh4SWconb2xjCmSvaV5 kUC+t+d0ImqbniPHJJNMRPR/4SzRbObYpjpLHNNzCV7Zfqix/UTSqD/DiTmXIhtU2tAUQgUaQH0 sG3AtqDXd3w4kfnair5R6qlRTS/YZJKHhIU4eDJXmCCiqJI429xr5v/wbVnJIwsmj5KWlxzfwgi ncjfdVK5Vog11s7esho+C52Wo7dlbpl/OB84ebWi3XjPhPv3VId7anojadroPNDxCGsMoVQaIkB vghLcL5l8qIEyd8WuAeQTm3Yavt3RI6f5BkmQ0wENj2IMjsWKvsxBCbGOA+xUu7e6NmxcMs1n2s 29ag3fa8k0jmBHg== X-Received: by 2002:a05:622a:44e:b0:51c:9e6:ec42 with SMTP id d75a77b69052e-5283def061cmr6711881cf.57.1784763763803; Wed, 22 Jul 2026 16:42:43 -0700 (PDT) X-Received: by 2002:a05:622a:44e:b0:51c:9e6:ec42 with SMTP id d75a77b69052e-5283def061cmr6711311cf.57.1784763762859; Wed, 22 Jul 2026 16:42:42 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4956a4aae16sm101796345e9.0.2026.07.22.16.42.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 16:42:42 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Charles Keepax , Maciej Strozek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Srinivas Kandagatla Cc: Bard Liao , Pierre-Louis Bossart , Richard Fitzgerald , Jorijn van der Graaf , linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [RFC PATCH 8/8] ASoC: codecs: add Qualcomm Tambora (WCD9378) SDCA codec Date: Thu, 23 Jul 2026 00:42:18 +0100 Message-ID: <20260722234221.884765-9-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260722234221.884765-1-srinivas.kandagatla@oss.qualcomm.com> 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 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfX41mZza3E3Cti kmVMgqEInKUJm4D1TzlqAwh+GsFqD7Rrq5DZAB3Yg9/PEXaIseRHkh6EQhlPazPjpKXB29w9R8e MX+rEqKunUg+A5n1HydtRmyF8vyzkfh7iKjVPpnBiaZ4z4RAP/gLy6lFVe/7LM4Xz7cfjBa5oSL x/mjW/kCY47CmVMSV9XTe6drE+Sf2qAJcmEj0iC6lEoIi6FhlkDw57yFtqk1Sa8GPLCj2pMWlvE 96Unc6SuRj4MlLQ/e5v8dedlEjhhqi7ppKhArVGwgp9BkeqeS1Sfjq1jKoLvcDopN41meKiN//H YjcUz5ptPfdT2una7hUnHJiKqPOP7DUfZbMVbzpszfIoYhOkXrMUz3yeBA5z2il9lQmDDgvT5k0 sgdoWF/5yY7/PyRKIfzkY7NRijn2Yt1yW0yhZ4+LJouKiCxHUNvSq7YUSrUEO6v7UNUPmS9n0uX yISAEBuDFVE+ZmSgmkQ== X-Proofpoint-GUID: VsXiXq4Pv9JJjk8n4Zx7o9UzAgwa_Ot4 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIyMDIzMyBTYWx0ZWRfXxK4ePwyX5BJI papzVXKOGdQ0b7v6LTxi8uLLhbrjydyTqFDdLCXVKlaEhUFNuC0yJNOs2alrLlwcCRA+bDoo6mw APVurtLjTBhIgvZGNiFsVi/9pCm2DZM= X-Authority-Analysis: v=2.4 cv=btx8wkai c=1 sm=1 tr=0 ts=6a615576 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=o0TCp_R9GsAS89_1xQEA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=O8hF6Hzn-FEA:10 a=1HOtulTD9v-eNWfpl4qZ:22 X-Proofpoint-ORIG-GUID: VsXiXq4Pv9JJjk8n4Zx7o9UzAgwa_Ot4 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-22_05,2026-07-22_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 malwarescore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 phishscore=0 priorityscore=1501 spamscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607220233 Add support for the Qualcomm Tambora (WCD9378) headset codec in SDCA mode over SoundWire. WCD9378 ("Tambora") is a low-power stereo audio codec used across Qualcomm mobile and compute platforms. It integrates a headphone amplifier, mono earpiece output, three analogue microphone inputs with independent programmable mic-bias supplies, jack and button detection, and SoundWire dataports for both playback and capture. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Srinivas Kandagatla --- sound/soc/codecs/Kconfig | 12 + sound/soc/codecs/Makefile | 2 + sound/soc/codecs/wcd9378-sdca.c | 1202 +++++++++++++++++++++++++++++++ 3 files changed, 1216 insertions(+) create mode 100644 sound/soc/codecs/wcd9378-sdca.c diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 76e90144ea91..372d2e134f05 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -2770,6 +2770,18 @@ config SND_SOC_WSA884X This enables support for Qualcomm WSA8840/WSA8845/WSA8845H Class-D Smart Speaker Amplifier. =20 +config SND_SOC_WCD9378_SDCA + tristate "Qualcomm Tambora (WCD9378) SDCA codec" + depends on SOUNDWIRE + depends on SND_SOC_SDCA_CLASS + default m if ARCH_QCOM + help + This enables support for the Qualcomm Tambora (WCD9378) headset + codec when driven via the SDCA class driver on ARM platforms + without ACPI/DisCo tables. It provides the static SDCA topology + and SoundWire data port properties transcribed from the factory + ACPI tables. + config SND_SOC_ZL38060 tristate "Microsemi ZL38060 Connected Home Audio Processor" depends on SPI_MASTER diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index aa0396e5b575..6dcf28b88972 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -426,6 +426,7 @@ snd-soc-wm-hubs-y :=3D wm_hubs.o snd-soc-wsa881x-y :=3D wsa881x.o snd-soc-wsa883x-y :=3D wsa883x.o snd-soc-wsa884x-y :=3D wsa884x.o +snd-soc-wcd9378-sdca-y :=3D wcd9378-sdca.o snd-soc-zl38060-y :=3D zl38060.o # Amp snd-soc-max9877-y :=3D max9877.o @@ -876,6 +877,7 @@ obj-$(CONFIG_SND_SOC_WM_HUBS) +=3D snd-soc-wm-hubs.o obj-$(CONFIG_SND_SOC_WSA881X) +=3D snd-soc-wsa881x.o obj-$(CONFIG_SND_SOC_WSA883X) +=3D snd-soc-wsa883x.o obj-$(CONFIG_SND_SOC_WSA884X) +=3D snd-soc-wsa884x.o +obj-$(CONFIG_SND_SOC_WCD9378_SDCA) +=3D snd-soc-wcd9378-sdca.o obj-$(CONFIG_SND_SOC_ZL38060) +=3D snd-soc-zl38060.o =20 # Amp diff --git a/sound/soc/codecs/wcd9378-sdca.c b/sound/soc/codecs/wcd9378-sdc= a.c new file mode 100644 index 000000000000..46a2b5728d2c --- /dev/null +++ b/sound/soc/codecs/wcd9378-sdca.c @@ -0,0 +1,1202 @@ +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) +// Copyright (c) 2025 Qualcomm Technologies, Inc. All rights reserved. + +/* + * WCD9378 SDCA hardware quirk for the SDCA class driver. + * + * sdca_class.c is the SoundWire slave driver; it calls wcd9378_sdca_hw_ops + * during probe to enable supplies, toggle the reset GPIO, and apply + * SoundWire slave properties and static SDCA function data that are speci= fic + * to this device (the Tambora / WCD9378 codec). On ARM/DT platforms there= is + * no ACPI/DisCo firmware node, so the topology transcribed from the facto= ry + * ASL is supplied via get_function_data. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../sdca/sdca_class.h" + +/* Forward declaration of entities array */ +static struct sdca_entity wcd9378_sdca_entities[]; +/* + * Entity array index map (see wcd9378_sdca_entities[] below). + * The entities are stored in the same order as the ASL entity-id-list, + * with Entity 0 (Function) last. + * + * [0] E001 IT 41 (0x1) [11] E00F IT 33 (0xF) + * [1] E002 CS 41 (0x2) [12] E010 PDE 34 (0x10) + * [2] E003 MFPU 21 (0x3) [13] E011 FU 33 (0x11) + * [3] E004 XU 42 (0x4) [14] E012 SU 35 (0x12) + * [4] E007 SU 43 (0x7) [15] E013 XU 36 (0x13) + * [5] E008 SU 45 (0x8) [16] E015 CS 36 (0x15) + * [6] E009 PDE 47 (0x9) [17] E016 OT 36 (0x16) + * [7] E00A OT 43 (0xA) [18] E017 MFPU 236 (0x17) + * [8] E00B OT 45 (0xB) [19] E018 CS 236 (0x18) + * [9] E00C GE 35 (0xC) [20] E019 OT 236 (0x19) + * [10] E00D IT 131 (0xD) [21] E000 Function (0x0) + */ +#define QSJ_IT41 0 +#define QSJ_CS41 1 +#define QSJ_MFPU21 2 +#define QSJ_XU42 3 +#define QSJ_SU43 4 +#define QSJ_SU45 5 +#define QSJ_PDE47 6 +#define QSJ_OT43 7 +#define QSJ_OT45 8 +#define QSJ_GE35 9 +#define QSJ_IT131 10 +#define QSJ_CS131 11 +#define QSJ_IT33 12 +#define QSJ_PDE34 13 +#define QSJ_FU33 14 +#define QSJ_SU35 15 +#define QSJ_XU36 16 +#define QSJ_CS36 17 +#define QSJ_OT36 18 +#define QSJ_MFPU236 19 +#define QSJ_CS236 20 +#define QSJ_OT236 21 + +/* + * Range Data Structures + * + * Range layout is { cols, rows, data[cols*rows] }. The raw values mirror + * the little-endian buffers from the ASL. + */ + +/* Entity 1 (IT 41) - Usage range: 1 septuple (cols=3D7, rows=3D1) + * PDM render stream: SoundWire carries 2-bit PDM at 4.8MHz internally, but + * the host-visible PCM rate/width is 48kHz/16-bit (msft-sdca-pdm-pcm map). + * Usage value =3D 0x2 (HIFI); value 0x3 (ULP) does not route audio to the + * HPH analog driver on WCD9378. + */ +static u32 range_it41_usage_data[] =3D { + /* usage, CBN, sample_rate, sample_width, full_scale, noise_floor, tag */ + 0x2, 0x2D0, 0xBB80, 0x10, 0x0, 0x0, 0x0, /* HIFI, 48kHz PCM, 16-bit */ +}; + +/* Entity 1 (IT 41) - ClusterIndex range: index -> cluster id */ +static u32 range_it41_cluster_data[] =3D { 0x1, 0x1 }; + +/* Entity 1 (IT 41) - DataPort selector range (16 cols x 4 rows) + * DC value =3D 6; row A col 6 =3D 0x06 (DP6 / HPH render port). + */ +static u32 range_it41_dp_data[] =3D { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x= FF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF +}; + +/* Entity 2 (CS 41) - SampleRateIndex range: index 1 -> 48kHz PCM + * Register DC value =3D 1. PCM rate is 48kHz (PDM-to-PCM mapped internall= y). + */ +static u32 range_cs41_sr_data[] =3D { 0x1, 0xBB80 }; + +/* Selector unit range: disconnected / connected (shared layout) */ +static u32 range_su_sel_data[] =3D { 0x0, 0x1 }; + +/* PDE Requested_PS range: PS0 / PS3 (shared layout) */ +static u32 range_pde_req_ps_data[] =3D { 0x0, 0x3 }; + +/* Entity 0xC (GE 35) - SelectedMode range: mode -> terminal type + * + * WORKAROUND: modes 0 (Jack Unplugged) and 1 (Jack Unknown) are added + * and mapped to the same "Headphone on jack" terminal type as mode 4. + * The Tambora firmware on this board does the mechanical MBHC (fires + * SDCA_4 with DETECTED_MODE=3D1) but cannot complete headphone-vs-headset + * ADC discrimination on its own, so the state machine gets stuck at + * Jack Unknown and sdca_jack_process falls back to SELECTED_MODE=3D0. + * Without these mode 0/1 entries, the GE MUX DAPM widget has no route + * for those values and drops SU45's selector, muting all HPH playback. + * Aliasing both to Headphone keeps the IT41->OT43 (HPH) DAPM path alive + * so the analog HP jack works while proper HS discrimination lands in + * a future wcd-mbhc-v2 integration. + */ +static u32 range_ge35_mode_data[] =3D { + 0x0, 0x6C0, /* Mode 0: Jack Unplugged (workaround: routes to HPH) */ + 0x1, 0x6C0, /* Mode 1: Jack Unknown (workaround: routes to HPH) */ + 0x3, 0x6D0, /* Mode 3: Headset output on jack */ + 0x4, 0x6C0, /* Mode 4: Headphone on jack */ +}; + +/* Entity 0xD (IT 131) - Usage range: optimization render stream at 192kHz= */ +static u32 range_it131_usage_data[] =3D { + 0x3, 0x334, 0x2EE00, 0x8, 0x0, 0x0, 0x0, /* ULP, 192kHz, 8-bit */ +}; + +/* Entity 0xD (IT 131) - ClusterIndex range: index -> cluster id 3 */ +static u32 range_it131_cluster_data[] =3D { 0x1, 0x3 }; + +/* Entity 0xD (IT 131) - DataPort selector range (DP7) */ +static u32 range_it131_dp_data[] =3D { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7, 0xFF, 0xFF, 0xFF, 0xFF, 0x= FF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF +}; + +/* Entity 0xE (CS 131) - SampleRateIndex range: index -> 192kHz */ +static u32 range_cs131_sr_data[] =3D { 0x1, 0x2EE00 }; + +/* Entity 0xF (IT 33) - Mic bias range: 2.75V */ +static u32 range_it33_micbias_data[] =3D { 0x5 }; + +/* Entity 0xF (IT 33) - Usage range */ +static u32 range_it33_usage_data[] =3D { + 0x1, 0x2C6, 0x0, 0x0, 0x0, 0x0, 0x0, /* HIFI */ +}; + +/* Entity 0xF (IT 33) - ClusterIndex range: index -> cluster id 2 */ +static u32 range_it33_cluster_data[] =3D { 0x1, 0x2 }; + +/* Entity 0x15 (CS 36) - SampleRateIndex range: index 1 -> 48kHz PCM */ +static u32 range_cs36_sr_data[] =3D { 0x1, 0xBB80 }; + +/* Entity 0x16 (OT 36) - Usage range + * PDM capture: 1-bit PDM at 4.8MHz internally; host sees 48kHz/16-bit PCM. + */ +static u32 range_ot36_usage_data[] =3D { + 0x1, 0x2C6, 0xBB80, 0x10, 0x0, 0x0, 0x0, /* HIFI, 48kHz PCM, 16-bit */ +}; + +/* Entity 0x16 (OT 36) - DataPort selector range (DP2 / TX1) */ +static u32 range_ot36_dp_data[] =3D { + 0xFF, 0xFF, 0x2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x= FF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF +}; + +/* Entity 0x18 (CS 236) - SampleRateIndex range: index -> 48kHz */ +static u32 range_cs236_sr_data[] =3D { 0x1, 0xBB80 }; + +/* Entity 0x19 (OT 236) - Usage range + * Optimization capture; clock domain is CS 131 (192 kHz), so PCM rate =3D= 192 kHz. + */ +static u32 range_ot236_usage_data[] =3D { + 0x1, 0x334, 0x2EE00, 0x8, 0x0, 0x0, 0x0, /* HIFI, 192kHz, 8-bit */ +}; + +/* Entity 0x19 (OT 236) - DataPort selector range (DP5 / TX4) */ +static u32 range_ot236_dp_data[] =3D { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x= FF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0= xFF, 0xFF, 0xFF, 0xFF +}; + +/* + * Control Value Arrays + */ + +/* Entity 0 (Function) Control Values */ +static int ctrl_fun_sdca_ver_vals[] =3D { 0x11 }; +static int ctrl_fun_type_vals[] =3D { 0x08 }; /* SimpleJack */ +static int ctrl_fun_man_id_vals[] =3D { 0x0217 }; +static int ctrl_fun_id_vals[] =3D { 0x3 }; +static int ctrl_fun_ver_vals[] =3D { 0x0 }; +static int ctrl_dev_sdca_ver_vals[] =3D { 0x11 }; + +/* Entity 1 (IT 41) Control Values */ +static int ctrl_it41_latency_vals[] =3D { 0x0 }; +static int ctrl_it41_cluster_vals[] =3D { 0x1 }; +static int ctrl_it41_dp_vals[] =3D { 0x6 }; + +/* Entity 2 (CS 41) Control Values */ +static int ctrl_cs41_sr_vals[] =3D { 0x1 }; + +/* Entity 3 (MFPU 21) Control Values */ +static int ctrl_mfpu21_bypass_vals[] =3D { 0x1 }; + +/* Entity 4 (XU 42) Control Values */ +static int ctrl_xu42_id_vals[] =3D { 0x2131 }; +static int ctrl_xu42_ver_vals[] =3D { 0x1 }; + +/* Entity 0xD (IT 131) Control Values */ +static int ctrl_it131_latency_vals[] =3D { 0x0 }; +static int ctrl_it131_cluster_vals[] =3D { 0x1 }; +static int ctrl_it131_dp_vals[] =3D { 0x7 }; + +/* Entity 0xE (CS 131) Control Values */ +static int ctrl_cs131_sr_vals[] =3D { 0x1 }; + +/* Entity 0xF (IT 33) Control Values */ +static int ctrl_it33_micbias_vals[] =3D { 0x5 }; /* 2.75V mic bias */ +static int ctrl_it33_latency_vals[] =3D { 0x0 }; +static int ctrl_it33_cluster_vals[] =3D { 0x1 }; + +/* Entity 0x13 (XU 36) Control Values */ +static int ctrl_xu36_id_vals[] =3D { 0x2131 }; +static int ctrl_xu36_ver_vals[] =3D { 0x1 }; + +/* Entity 0x15 (CS 36) Control Values */ +static int ctrl_cs36_sr_vals[] =3D { 0x1 }; + +/* Entity 0x16 (OT 36) Control Values */ +static int ctrl_ot36_latency_vals[] =3D { 0x0 }; +static int ctrl_ot36_dp_vals[] =3D { 0x2 }; + +/* Entity 0x17 (MFPU 236) Control Values */ +static int ctrl_mfpu236_bypass_vals[] =3D { 0x1 }; + +/* Entity 0x18 (CS 236) Control Values */ +static int ctrl_cs236_sr_vals[] =3D { 0x1 }; + +/* Entity 0x19 (OT 236) Control Values */ +static int ctrl_ot236_latency_vals[] =3D { 0x0 }; +static int ctrl_ot236_dp_vals[] =3D { 0x5 }; + +/* Entity 0 (Function) Controls */ +static struct sdca_control entity0_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_li= st =3D 0x1, .label =3D SDCA_CTL_COMMIT_GROUP_MASK_NAME }, + { .sel =3D 0x4, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_li= st =3D 0x1, .values =3D ctrl_fun_sdca_ver_vals, .has_fixed =3D true, .label= =3D SDCA_CTL_FUNCTION_SDCA_VERSION_NAME }, + { .sel =3D 0x5, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_li= st =3D 0x1, .values =3D ctrl_fun_type_vals, .has_fixed =3D true, .label =3D= SDCA_CTL_FUNCTION_TYPE_NAME }, + { .sel =3D 0x6, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_li= st =3D 0x1, .values =3D ctrl_fun_man_id_vals, .has_fixed =3D true, .label = =3D SDCA_CTL_FUNCTION_MANUFACTURER_ID_NAME }, + { .sel =3D 0x7, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_li= st =3D 0x1, .values =3D ctrl_fun_id_vals, .has_fixed =3D true, .label =3D S= DCA_CTL_FUNCTION_ID_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_li= st =3D 0x1, .values =3D ctrl_fun_ver_vals, .has_fixed =3D true, .label =3D = SDCA_CTL_FUNCTION_VERSION_NAME }, + { .sel =3D 0x9, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D 0x4, .cn_li= st =3D 0x1, .label =3D SDCA_CTL_FUNCTION_EXTENSION_ID_NAME }, + { .sel =3D 0xA, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D 0x4, .cn_li= st =3D 0x1, .label =3D SDCA_CTL_FUNCTION_EXTENSION_VERSION_NAME }, + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_RW1C, .layers =3D 0x4, .cn_li= st =3D 0x1, .is_volatile =3D true, .label =3D SDCA_CTL_FUNCTION_STATUS_NAME= }, + { .sel =3D 0x11, .mode =3D SDCA_ACCESS_MODE_RW1S, .layers =3D 0x4, .cn_li= st =3D 0x1, .label =3D SDCA_CTL_FUNCTION_ACTION_NAME }, + { .sel =3D 0x2C, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D 0x4, .cn_li= st =3D 0x1, .label =3D SDCA_CTL_DEVICE_MANUFACTURER_ID_NAME }, + { .sel =3D 0x2D, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D 0x4, .cn_li= st =3D 0x1, .label =3D SDCA_CTL_DEVICE_PART_ID_NAME }, + { .sel =3D 0x2E, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D 0x4, .cn_li= st =3D 0x1, .label =3D SDCA_CTL_DEVICE_VERSION_NAME }, + { .sel =3D 0x2F, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_li= st =3D 0x1, .values =3D ctrl_dev_sdca_ver_vals, .has_fixed =3D true, .label= =3D SDCA_CTL_DEVICE_SDCA_VERSION_NAME }, +}; + +/* Entity 1 (IT 41) Controls */ +static struct sdca_control entity_it41_controls[] =3D { + { .sel =3D 0x4, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_list= =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_it41_usage_d= ata }, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_it41_latency_vals, .has_fixed =3D true, .label =3D SDC= A_CTL_LATENCY_NAME }, + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_it41_cluster_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x2, .rows =3D 0x1, .data =3D range_it41_cluster= _data }, + .label =3D SDCA_CTL_CLUSTERINDEX_NAME }, + { .sel =3D 0x11, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_it41_dp_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x10, .rows =3D 0x4, .data =3D range_it41_dp_dat= a }, + .label =3D SDCA_CTL_DATAPORT_SELECTOR_NAME }, +}; + +/* Entity 2 (CS 41) Controls */ +static struct sdca_control entity_cs41_controls[] =3D { + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_cs41_sr_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x2, .rows =3D 0x1, .data =3D range_cs41_sr_data= }, + .label =3D SDCA_CTL_SAMPLERATEINDEX_NAME }, +}; + +/* Entity 3 (MFPU 21) Controls */ +static struct sdca_entity *entity_mfpu21_sources[] =3D { + &wcd9378_sdca_entities[QSJ_IT41], + &wcd9378_sdca_entities[QSJ_IT131], +}; + +static struct sdca_control entity_mfpu21_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list = =3D 0x1, + .values =3D ctrl_mfpu21_bypass_vals, .has_fixed =3D true, .label =3D SD= CA_CTL_BYPASS_NAME }, +}; + +/* Entity 4 (XU 42) Controls */ +static struct sdca_entity *entity_xu42_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_MFPU21] }; + +static struct sdca_control entity_xu42_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_list = =3D 0x1, .label =3D SDCA_CTL_BYPASS_NAME }, + { .sel =3D 0x7, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list = =3D 0x1, + .values =3D ctrl_xu42_id_vals, .has_fixed =3D true, .label =3D SDCA_CTL= _XU_ID_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list = =3D 0x1, + .values =3D ctrl_xu42_ver_vals, .has_fixed =3D true, .label =3D SDCA_CT= L_XU_VERSION_NAME }, +}; + +/* Entity 7 (SU 43) Controls */ +static struct sdca_entity *entity_su43_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_XU42] }; + +static struct sdca_control entity_su43_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_LA= YER_DEVICE, + .cn_list =3D 0x1, + .range =3D { .cols =3D 0x1, .rows =3D 0x2, .data =3D range_su_sel_data = }, + .label =3D SDCA_CTL_SELECTOR_NAME }, +}; + +/* Entity 8 (SU 45) Controls */ +static struct sdca_entity *entity_su45_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_XU42] }; + +static struct sdca_control entity_su45_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_LA= YER_DEVICE, + .cn_list =3D 0x1, + .range =3D { .cols =3D 0x1, .rows =3D 0x2, .data =3D range_su_sel_data = }, + .label =3D SDCA_CTL_SELECTOR_NAME }, +}; + +/* Entity 9 (PDE 47) - manages OT 43 and OT 45 */ +static struct sdca_entity *entity_pde47_managed[] =3D { + &wcd9378_sdca_entities[QSJ_OT43], + &wcd9378_sdca_entities[QSJ_OT45], +}; + +static struct sdca_pde_delay pde47_delays[] =3D { + { .from_ps =3D 3, .to_ps =3D 0, .us =3D 30000 }, + { .from_ps =3D 0, .to_ps =3D 3, .us =3D 30000 }, +}; + +static struct sdca_control entity_pde47_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .range =3D { .cols =3D 0x1, .rows =3D 0x2, .data =3D range_pde_req_ps_d= ata }, + .label =3D SDCA_CTL_REQUESTED_PS_NAME }, + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .is_volatile =3D true, .label =3D SDCA_CTL_ACTUAL_PS_NAME }, + /* + * Fake interrupt anchors for the WCD9378 HPH protection interrupts + * (INTMASK_1 bits 5/6/7 =3D HPH OCP/CNP, INTMASK_2 bit 0 =3D SDCA_8 + * HPHL_CNP, INTMASK_3 bits 2/3 =3D SDCA_18/19 HPH surge det). These + * SDCA_N positions have no matching ASL controls, so use invented + * selectors on PDE47 (which owns the HPH power domain) so the SDCA + * framework registers regmap-irq virqs for them. + * + * With virqs registered, regmap-irq's mask_buf_def includes these + * bits and enable_irq() unmasks them in SDW_SCP_SDCA_INTMASK1..3. + * When a bit fires the base_handler in sdca_interrupts.c logs the + * name ("PDE 47 HPHR OCP" etc.) and regmap-irq acks via INT1..4. + * + * sel values must be unique within the entity but are otherwise + * unused since the base_handler only logs the name. Using values + * >0x30 to avoid collision with real SDCA controls. + */ + { .sel =3D 0x30, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, + .cn_list =3D 0x1, .interrupt_position =3D 5, .is_volatile =3D true, + .label =3D "HPHR OCP" }, + { .sel =3D 0x31, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, + .cn_list =3D 0x1, .interrupt_position =3D 6, .is_volatile =3D true, + .label =3D "HPHR CNP" }, + { .sel =3D 0x32, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, + .cn_list =3D 0x1, .interrupt_position =3D 7, .is_volatile =3D true, + .label =3D "HPHL OCP" }, + { .sel =3D 0x33, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, + .cn_list =3D 0x1, .interrupt_position =3D 8, .is_volatile =3D true, + .label =3D "HPHL CNP" }, + { .sel =3D 0x34, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, + .cn_list =3D 0x1, .interrupt_position =3D 18, .is_volatile =3D true, + .label =3D "HPHR SURGE" }, + { .sel =3D 0x35, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, + .cn_list =3D 0x1, .interrupt_position =3D 19, .is_volatile =3D true, + .label =3D "HPHL SURGE" }, +}; + +/* Entity 0xA (OT 43) - Headphone, no controls */ +static struct sdca_entity *entity_ot43_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_IT41] }; + +/* Entity 0xB (OT 45) - Headset, no controls */ +static struct sdca_entity *entity_ot45_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_IT41] }; + +/* Entity 0xC (GE 35) - jack detection group entity */ + +/* + * WORKAROUND: modes 0 (Jack Unplugged) and 1 (Jack Unknown) route SU 45 + * the same as mode 4 (Headphone) so the DAPM path IT41 -> SU45 -> OT43 + * stays connected even when the Tambora firmware cannot complete + * HP/HS discrimination and leaves DETECTED_MODE at 1. See the + * range_ge35_mode_data comment above. + */ +static struct sdca_ge_control ge35_mode0_controls[] =3D { + { .id =3D 0x8, .sel =3D 0x1, .cn =3D 0x0, .val =3D 0x1 }, /* SU 45 select= or =3D source 1 (XU 42) */ +}; + +static struct sdca_ge_control ge35_mode1_controls[] =3D { + { .id =3D 0x8, .sel =3D 0x1, .cn =3D 0x0, .val =3D 0x1 }, /* SU 45 select= or =3D source 1 (XU 42) */ +}; + +static struct sdca_ge_control ge35_mode3_controls[] =3D { + { .id =3D 0x7, .sel =3D 0x1, .cn =3D 0x0, .val =3D 0x1 }, /* SU 43 select= or =3D source 1 (XU 42) */ +}; + +static struct sdca_ge_control ge35_mode4_controls[] =3D { + { .id =3D 0x8, .sel =3D 0x1, .cn =3D 0x0, .val =3D 0x1 }, /* SU 45 select= or =3D source 1 (XU 42) */ +}; + +static struct sdca_ge_mode ge35_modes[] =3D { + { .val =3D 0x0, .num_controls =3D ARRAY_SIZE(ge35_mode0_controls), .contr= ols =3D ge35_mode0_controls }, + { .val =3D 0x1, .num_controls =3D ARRAY_SIZE(ge35_mode1_controls), .contr= ols =3D ge35_mode1_controls }, + { .val =3D 0x3, .num_controls =3D ARRAY_SIZE(ge35_mode3_controls), .contr= ols =3D ge35_mode3_controls }, + { .val =3D 0x4, .num_controls =3D ARRAY_SIZE(ge35_mode4_controls), .contr= ols =3D ge35_mode4_controls }, +}; + +static struct sdca_control entity_ge35_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_list = =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .range =3D { .cols =3D 0x2, .rows =3D 0x4, .data =3D range_ge35_mode_da= ta }, + .label =3D SDCA_CTL_SELECTED_MODE_NAME }, + { .sel =3D 0x2, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D 0x4, .cn_list = =3D 0x1, + .interrupt_position =3D 4, /* SDCA_4 =3D GE_DETECTED_MODE, see init_tab= le INTMASK_1 */ + .is_volatile =3D true, .label =3D SDCA_CTL_DETECTED_MODE_NAME }, +}; + +/* Entity 0xD (IT 131) - optimization stream input */ +static struct sdca_control entity_it131_controls[] =3D { + { .sel =3D 0x4, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_list= =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_it131_usage_= data }, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_it131_latency_vals, .has_fixed =3D true, .label =3D SD= CA_CTL_LATENCY_NAME }, + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_it131_cluster_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x2, .rows =3D 0x1, .data =3D range_it131_cluste= r_data }, + .label =3D SDCA_CTL_CLUSTERINDEX_NAME }, + { .sel =3D 0x11, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_it131_dp_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x10, .rows =3D 0x4, .data =3D range_it131_dp_da= ta }, + .label =3D SDCA_CTL_DATAPORT_SELECTOR_NAME }, +}; + +/* Entity 0xE (CS 131) Controls */ +static struct sdca_control entity_cs131_controls[] =3D { + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_cs131_sr_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x2, .rows =3D 0x1, .data =3D range_cs131_sr_dat= a }, + .label =3D SDCA_CTL_SAMPLERATEINDEX_NAME }, +}; + +/* Entity 0xF (IT 33) - headset mic input */ +static struct sdca_control entity_it33_controls[] =3D { + { .sel =3D 0x3, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_it33_micbias_vals, .has_default =3D true, + .range =3D { .cols =3D 0x1, .rows =3D 0x1, .data =3D range_it33_micbias= _data }, + .label =3D SDCA_CTL_MIC_BIAS_NAME }, + { .sel =3D 0x4, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_list= =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_it33_usage_d= ata }, + .has_reset =3D true, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_it33_latency_vals, .has_fixed =3D true, .label =3D SDC= A_CTL_LATENCY_NAME }, + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_it33_cluster_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x2, .rows =3D 0x1, .data =3D range_it33_cluster= _data }, + .label =3D SDCA_CTL_CLUSTERINDEX_NAME }, +}; + +/* Entity 0x10 (PDE 34) - manages IT 33 */ +static struct sdca_entity *entity_pde34_managed[] =3D { &wcd9378_sdca_enti= ties[QSJ_IT33] }; + +static struct sdca_pde_delay pde34_delays[] =3D { + { .from_ps =3D 3, .to_ps =3D 0, .us =3D 30000 }, + { .from_ps =3D 0, .to_ps =3D 3, .us =3D 30000 }, +}; + +static struct sdca_control entity_pde34_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .range =3D { .cols =3D 0x1, .rows =3D 0x2, .data =3D range_pde_req_ps_d= ata }, + .label =3D SDCA_CTL_REQUESTED_PS_NAME }, + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .is_volatile =3D true, .label =3D SDCA_CTL_ACTUAL_PS_NAME }, +}; + +/* Entity 0x11 (FU 33) - no controls */ +static struct sdca_entity *entity_fu33_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_IT33] }; + +/* Entity 0x12 (SU 35) Controls */ +static struct sdca_entity *entity_su35_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_FU33] }; + +static struct sdca_control entity_su35_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D 0x4, .cn_list = =3D 0x1, + .range =3D { .cols =3D 0x1, .rows =3D 0x2, .data =3D range_su_sel_data = }, + .label =3D SDCA_CTL_SELECTOR_NAME }, +}; + +/* Entity 0x13 (XU 36) Controls */ +static struct sdca_entity *entity_xu36_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_SU35] }; + +static int ctrl_xu36_bypass_vals[] =3D { 0x1 }; + +static struct sdca_control entity_xu36_controls[] =3D { + /* bypass=3D1: pass mic signal through XU36 without proprietary processin= g */ + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_list = =3D 0x1, + .values =3D ctrl_xu36_bypass_vals, .has_default =3D true, .label =3D SD= CA_CTL_BYPASS_NAME }, + { .sel =3D 0x7, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list = =3D 0x1, + .values =3D ctrl_xu36_id_vals, .has_fixed =3D true, .label =3D SDCA_CTL= _XU_ID_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list = =3D 0x1, + .values =3D ctrl_xu36_ver_vals, .has_fixed =3D true, .label =3D SDCA_CT= L_XU_VERSION_NAME }, +}; + +/* Entity 0x15 (CS 36) Controls */ +static struct sdca_control entity_cs36_controls[] =3D { + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_cs36_sr_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x2, .rows =3D 0x1, .data =3D range_cs36_sr_data= }, + .label =3D SDCA_CTL_SAMPLERATEINDEX_NAME }, +}; + +/* Entity 0x16 (OT 36) - mic capture output; signal chain: IT33=E2=86=92FU= 33=E2=86=92SU35=E2=86=92XU36=E2=86=92OT36 */ +static struct sdca_entity *entity_ot36_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_XU36] }; + +static struct sdca_control entity_ot36_controls[] =3D { + { .sel =3D 0x4, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_list= =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_ot36_usage_d= ata }, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_ot36_latency_vals, .has_fixed =3D true, .label =3D SDC= A_CTL_LATENCY_NAME }, + { .sel =3D 0x11, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_ot36_dp_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x10, .rows =3D 0x4, .data =3D range_ot36_dp_dat= a }, + .label =3D SDCA_CTL_DATAPORT_SELECTOR_NAME }, +}; + +/* Entity 0x17 (MFPU 236) Controls */ +static struct sdca_control entity_mfpu236_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list = =3D 0x1, + .values =3D ctrl_mfpu236_bypass_vals, .has_fixed =3D true, .label =3D S= DCA_CTL_BYPASS_NAME }, +}; + +/* Entity 0x18 (CS 236) Controls */ +static struct sdca_control entity_cs236_controls[] =3D { + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_cs236_sr_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x2, .rows =3D 0x1, .data =3D range_cs236_sr_dat= a }, + .label =3D SDCA_CTL_SAMPLERATEINDEX_NAME }, +}; + +/* Entity 0x19 (OT 236) - optimization stream capture output */ +static struct sdca_entity *entity_ot236_sources[] =3D { &wcd9378_sdca_enti= ties[QSJ_IT33] }; + +static struct sdca_control entity_ot236_controls[] =3D { + { .sel =3D 0x4, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D 0x4, .cn_list= =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_ot236_usage_= data }, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_ot236_latency_vals, .has_fixed =3D true, .label =3D SD= CA_CTL_LATENCY_NAME }, + { .sel =3D 0x11, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D 0x4, .cn_list= =3D 0x1, + .values =3D ctrl_ot236_dp_vals, .has_fixed =3D true, + .range =3D { .cols =3D 0x10, .rows =3D 0x4, .data =3D range_ot236_dp_da= ta }, + .label =3D SDCA_CTL_DATAPORT_SELECTOR_NAME }, +}; + +/* Entities Array (see index map at top of file) */ +static struct sdca_entity wcd9378_sdca_entities[] =3D { + /* [0] E001: IT 41 - PDM render stream input */ + { .id =3D 0x1, .label =3D "IT 41", .type =3D SDCA_ENTITY_TYPE_IT, + .iot =3D { .type =3D 0x0191, .is_dataport =3D true, .clock =3D &wcd9378= _sdca_entities[QSJ_CS41] }, + .num_controls =3D ARRAY_SIZE(entity_it41_controls), .controls =3D entit= y_it41_controls }, + /* [1] E002: CS 41 */ + { .id =3D 0x2, .label =3D "CS 41", .type =3D SDCA_ENTITY_TYPE_CS, + .cs =3D { .type =3D 0x0 }, + .num_controls =3D ARRAY_SIZE(entity_cs41_controls), .controls =3D entit= y_cs41_controls }, + /* [2] E003: MFPU 21 */ + { .id =3D 0x3, .label =3D "MFPU 21", .type =3D SDCA_ENTITY_TYPE_MFPU, + .num_controls =3D ARRAY_SIZE(entity_mfpu21_controls), .controls =3D ent= ity_mfpu21_controls, + .num_sources =3D ARRAY_SIZE(entity_mfpu21_sources), .sources =3D entity= _mfpu21_sources }, + /* [3] E004: XU 42 */ + { .id =3D 0x4, .label =3D "XU 42", .type =3D SDCA_ENTITY_TYPE_XU, + .num_controls =3D ARRAY_SIZE(entity_xu42_controls), .controls =3D entit= y_xu42_controls, + .num_sources =3D ARRAY_SIZE(entity_xu42_sources), .sources =3D entity_x= u42_sources }, + /* [4] E007: SU 43 - render selector (headset path), driven by GE 35 jack= detection */ + { .id =3D 0x7, .label =3D "SU 43", .type =3D SDCA_ENTITY_TYPE_SU, + .group =3D &wcd9378_sdca_entities[QSJ_GE35], + .num_controls =3D ARRAY_SIZE(entity_su43_controls), .controls =3D entit= y_su43_controls, + .num_sources =3D ARRAY_SIZE(entity_su43_sources), .sources =3D entity_s= u43_sources }, + /* [5] E008: SU 45 - render selector (headphone path), driven by GE 35 ja= ck detection */ + { .id =3D 0x8, .label =3D "SU 45", .type =3D SDCA_ENTITY_TYPE_SU, + .group =3D &wcd9378_sdca_entities[QSJ_GE35], + .num_controls =3D ARRAY_SIZE(entity_su45_controls), .controls =3D entit= y_su45_controls, + .num_sources =3D ARRAY_SIZE(entity_su45_sources), .sources =3D entity_s= u45_sources }, + /* [6] E009: PDE 47 - render power domain */ + { .id =3D 0x9, .label =3D "PDE 47", .type =3D SDCA_ENTITY_TYPE_PDE, + .pde =3D { .num_managed =3D ARRAY_SIZE(entity_pde47_managed), .managed = =3D entity_pde47_managed, + .num_max_delay =3D ARRAY_SIZE(pde47_delays), .max_delay =3D pde47_del= ays }, + .num_controls =3D ARRAY_SIZE(entity_pde47_controls), .controls =3D enti= ty_pde47_controls }, + /* [7] E00A: OT 43 - Headphone on jack */ + { .id =3D 0xA, .label =3D "OT 43", .type =3D SDCA_ENTITY_TYPE_OT, + .iot =3D { .type =3D 0x06C0 }, + .num_sources =3D ARRAY_SIZE(entity_ot43_sources), .sources =3D entity_o= t43_sources }, + /* [8] E00B: OT 45 - Headset output on jack */ + { .id =3D 0xB, .label =3D "OT 45", .type =3D SDCA_ENTITY_TYPE_OT, + .iot =3D { .type =3D 0x06D0 }, + .num_sources =3D ARRAY_SIZE(entity_ot45_sources), .sources =3D entity_o= t45_sources }, + /* [9] E00C: GE 35 - jack detection group entity */ + { .id =3D 0xC, .label =3D "GE 35", .type =3D SDCA_ENTITY_TYPE_GE, + .ge =3D { .num_modes =3D ARRAY_SIZE(ge35_modes), .modes =3D ge35_modes = }, + .num_controls =3D ARRAY_SIZE(entity_ge35_controls), .controls =3D entit= y_ge35_controls }, + /* [10] E00D: IT 131 - optimization stream input */ + { .id =3D 0xD, .label =3D "IT 131", .type =3D SDCA_ENTITY_TYPE_IT, + .iot =3D { .type =3D 0x0190, .is_dataport =3D true, .clock =3D &wcd9378= _sdca_entities[QSJ_CS131] }, + .num_controls =3D ARRAY_SIZE(entity_it131_controls), .controls =3D enti= ty_it131_controls }, + /* [11] E00E: CS 131 */ + { .id =3D 0xE, .label =3D "CS 131", .type =3D SDCA_ENTITY_TYPE_CS, + .cs =3D { .type =3D 0x0 }, + .num_controls =3D ARRAY_SIZE(entity_cs131_controls), .controls =3D enti= ty_cs131_controls }, + /* [12] E00F: IT 33 - headset mic input */ + { .id =3D 0xF, .label =3D "IT 33", .type =3D SDCA_ENTITY_TYPE_IT, + .iot =3D { .type =3D 0x06D0 }, + .num_controls =3D ARRAY_SIZE(entity_it33_controls), .controls =3D entit= y_it33_controls }, + /* [13] E010: PDE 34 - mic power domain */ + { .id =3D 0x10, .label =3D "PDE 34", .type =3D SDCA_ENTITY_TYPE_PDE, + .pde =3D { .num_managed =3D ARRAY_SIZE(entity_pde34_managed), .managed = =3D entity_pde34_managed, + .num_max_delay =3D ARRAY_SIZE(pde34_delays), .max_delay =3D pde34_del= ays }, + .num_controls =3D ARRAY_SIZE(entity_pde34_controls), .controls =3D enti= ty_pde34_controls }, + /* [14] E011: FU 33 - mic feature unit */ + { .id =3D 0x11, .label =3D "FU 33", .type =3D SDCA_ENTITY_TYPE_FU, + .num_sources =3D ARRAY_SIZE(entity_fu33_sources), .sources =3D entity_f= u33_sources }, + /* [15] E012: SU 35 - mic selector */ + { .id =3D 0x12, .label =3D "SU 35", .type =3D SDCA_ENTITY_TYPE_SU, + .num_controls =3D ARRAY_SIZE(entity_su35_controls), .controls =3D entit= y_su35_controls, + .num_sources =3D ARRAY_SIZE(entity_su35_sources), .sources =3D entity_s= u35_sources }, + /* [16] E013: XU 36 - mic extension unit */ + { .id =3D 0x13, .label =3D "XU 36", .type =3D SDCA_ENTITY_TYPE_XU, + .num_controls =3D ARRAY_SIZE(entity_xu36_controls), .controls =3D entit= y_xu36_controls, + .num_sources =3D ARRAY_SIZE(entity_xu36_sources), .sources =3D entity_x= u36_sources }, + /* [17] E015: CS 36 */ + { .id =3D 0x15, .label =3D "CS 36", .type =3D SDCA_ENTITY_TYPE_CS, + .cs =3D { .type =3D 0x0 }, + .num_controls =3D ARRAY_SIZE(entity_cs36_controls), .controls =3D entit= y_cs36_controls }, + /* [18] E016: OT 36 - PDM mic capture output */ + { .id =3D 0x16, .label =3D "OT 36", .type =3D SDCA_ENTITY_TYPE_OT, + .iot =3D { .type =3D 0x0191, .is_dataport =3D true, .clock =3D &wcd9378= _sdca_entities[QSJ_CS36] }, + .num_controls =3D ARRAY_SIZE(entity_ot36_controls), .controls =3D entit= y_ot36_controls, + .num_sources =3D ARRAY_SIZE(entity_ot36_sources), .sources =3D entity_o= t36_sources }, + /* [19] E017: MFPU 236 - optimization TX processing */ + { .id =3D 0x17, .label =3D "MFPU 236", .type =3D SDCA_ENTITY_TYPE_MFPU, + .num_controls =3D ARRAY_SIZE(entity_mfpu236_controls), .controls =3D en= tity_mfpu236_controls }, + /* [20] E018: CS 236 */ + { .id =3D 0x18, .label =3D "CS 236", .type =3D SDCA_ENTITY_TYPE_CS, + .cs =3D { .type =3D 0x0 }, + .num_controls =3D ARRAY_SIZE(entity_cs236_controls), .controls =3D enti= ty_cs236_controls }, + /* [21] E019: OT 236 - optimization stream capture output */ + { .id =3D 0x19, .label =3D "OT 236", .type =3D SDCA_ENTITY_TYPE_OT, + .iot =3D { .type =3D 0x0190, .is_dataport =3D true, .clock =3D &wcd9378= _sdca_entities[QSJ_CS131] }, + .num_controls =3D ARRAY_SIZE(entity_ot236_controls), .controls =3D enti= ty_ot236_controls, + .num_sources =3D ARRAY_SIZE(entity_ot236_sources), .sources =3D entity_= ot236_sources }, + /* Entity 0 (Function) */ + { .id =3D 0x0, .label =3D "entity0", + .num_controls =3D ARRAY_SIZE(entity0_controls), .controls =3D entity0_c= ontrols }, +}; + +/* Clusters */ +static struct sdca_channel cl1_channels[] =3D { /* CL01 - render (HPH) ste= reo */ + { .id =3D 0x1, .purpose =3D 0x1, .relationship =3D 0x2 }, /* Left */ + { .id =3D 0x2, .purpose =3D 0x1, .relationship =3D 0x3 }, /* Right */ +}; + +static struct sdca_channel cl2_channels[] =3D { /* CL02 - mic capture mono= */ + { .id =3D 0xFF, .purpose =3D 0x1, .relationship =3D 0x1 }, +}; + +static struct sdca_channel cl3_channels[] =3D { /* CL03 - optimization RX = */ + { .id =3D 0xFF, .purpose =3D 0x1, .relationship =3D 0x1 }, /* Mono */ + { .id =3D 0x1, .purpose =3D 0x1, .relationship =3D 0x2 }, /* Left */ + { .id =3D 0x2, .purpose =3D 0x1, .relationship =3D 0x3 }, /* Right */ +}; + +static struct sdca_channel cl5_channels[] =3D { /* CL05 - optimization TX = mono */ + { .id =3D 0xFF, .purpose =3D 0x1, .relationship =3D 0x1 }, +}; + +static struct sdca_cluster wcd9378_sdca_clusters[] =3D { + { .id =3D 0x1, .num_channels =3D ARRAY_SIZE(cl1_channels), .channels =3D = cl1_channels }, + { .id =3D 0x2, .num_channels =3D ARRAY_SIZE(cl2_channels), .channels =3D = cl2_channels }, + { .id =3D 0x3, .num_channels =3D ARRAY_SIZE(cl3_channels), .channels =3D = cl3_channels }, + { .id =3D 0x5, .num_channels =3D ARRAY_SIZE(cl5_channels), .channels =3D = cl5_channels }, +}; + +/* + * Init Table (from QcSimpleJack.asl BUF0). + * + * 32-bit register addresses with single-byte values, transcribed from the + * factory ACPI initialization table. + */ +static struct sdca_init_write wcd9378_sdca_init_table[] =3D { + { .addr =3D 0x401804F0, .val =3D 0x00 }, /* DIGITAL_PLATFORM_CTL */ + { .addr =3D 0x4018046E, .val =3D 0x10 }, /* DIGITAL_INTR_MODE */ + { .addr =3D 0x0000004D, .val =3D 0x01 }, /* SWRS_SCP_BUSCLOCK_BASE */ + { .addr =3D 0x00000062, .val =3D 0x02 }, /* SWRS_SCP_BUSCLOCK_SCALE_BANK = */ + { .addr =3D 0x4018016A, .val =3D 0x80 }, /* CP_DTOP_CTRL_14 */ + { .addr =3D 0x40180165, .val =3D 0x6b }, /* CP_DTOP_CTRL_9 */ + { .addr =3D 0x40180103, .val =3D 0x1E }, /* SLEEP_CTL BG_CTL (0.9V) */ + { .addr =3D 0x40180103, .val =3D 0x9E }, /* SLEEP_CTL BG_EN */ + { .addr =3D 0x40180103, .val =3D 0xDE }, /* SLEEP_CTL LDOL_BG_SEL */ + { .addr =3D 0x40180029, .val =3D 0xB5 }, /* BIAS_VBG_FINE_ADJ */ + { .addr =3D 0x40180001, .val =3D 0x80 }, /* ANA_BIAS ANALOG_BIAS_EN */ + { .addr =3D 0x40180001, .val =3D 0xC0 }, /* ANA_BIAS PRECHRG_EN(1) */ + { .addr =3D 0x40180001, .val =3D 0x80 }, /* ANA_BIAS PRECHRG_EN(0) */ + { .addr =3D 0x4018007B, .val =3D 0xA2 }, /* TX_COM_TXFE_DIV_CTL SEQ_BYPAS= S */ + { .addr =3D 0x40180465, .val =3D 0x17 }, /* PDM_WD_CTL0 TIME_OUT_SEL_PCM = */ + { .addr =3D 0x40180466, .val =3D 0x17 }, /* PDM_WD_CTL1 TIME_OUT_SEL_PCM = */ + { .addr =3D 0x4018006C, .val =3D 0x01 }, /* MICB1_TEST_CTL_2 IBIAS_LDO_DR= IVER */ + { .addr =3D 0x40180072, .val =3D 0x81 }, /* MICB3_TEST_CTL_2 IBIAS_LDO_DR= IVER */ + { .addr =3D 0x401800CE, .val =3D 0x38 }, /* HPH_OCP_CTL OCP_FSM_EN */ + { .addr =3D 0x401800CE, .val =3D 0x3A }, /* HPH_OCP_CTL SCD_OP_EN */ + { .addr =3D 0x401800D4, .val =3D 0xE1 }, /* HPH_L_TEST OCP_DET_EN */ + { .addr =3D 0x401800D7, .val =3D 0xE1 }, /* HPH_R_TEST OCP_DET_EN */ + { .addr =3D 0x4018044E, .val =3D 0x04 }, /* CDC_HPH_GAIN_CTL HPHL_RX_EN */ + { .addr =3D 0x4018044E, .val =3D 0x0C }, /* CDC_HPH_GAIN_CTL HPHR_RX_EN */ + { .addr =3D 0x4018000F, .val =3D 0x0C }, /* ANA_TX_CH2 GAIN (18.0dB) */ + { .addr =3D 0x40180133, .val =3D 0x84 }, /* HPH_NEW_INT_RDAC_HD2_CTL_L */ + { .addr =3D 0x40180136, .val =3D 0x84 }, /* HPH_NEW_INT_RDAC_HD2_CTL_R */ + { .addr =3D 0x401800D9, .val =3D 0x19 }, /* HPH_RDAC_CLK_CTL1 OPAMP_CHOP_= CLK_EN */ + { .addr =3D 0x40180132, .val =3D 0x50 }, /* HPH_NEW_INT_RDAC_GAIN_CTL RDA= C_GAINCTL(0.55) =E2=80=94 validated spec */ + { .addr =3D 0x401800A5, .val =3D 0xE0 }, /* FLYBACK_VNEG_CTRL_1 */ + { .addr =3D 0x401800A8, .val =3D 0x70 }, /* FLYBACK_VNEG_CTRL_4 */ + { .addr =3D 0x4018013A, .val =3D 0xFC }, /* HPH_NEW_INT_HPH_TIMER1 */ + { .addr =3D 0x401801C5, .val =3D 0x13 }, /* PDM_WD_CTL0 (HPHR) */ + { .addr =3D 0x401801C6, .val =3D 0x13 }, /* PDM_WD_CTL1 (HPHL) */ + { .addr =3D 0x40180510, .val =3D 0x05 }, /* SEQR_CTRL HPH_UP_T0 */ + { .addr =3D 0x40180519, .val =3D 0x05 }, /* SEQR_CTRL HPH_UP_T9 */ + { .addr =3D 0x4018051B, .val =3D 0x06 }, /* SEQR_CTRL HPH_DN_T0 */ + { .addr =3D 0x40180414, .val =3D 0x02 }, /* CDC_COMP_CTL_0 HPHL_COMP_EN */ + { .addr =3D 0x40180414, .val =3D 0x03 }, /* CDC_COMP_CTL_0 HPHR_COMP_EN */ + { .addr =3D 0x401804F2, .val =3D 0x80 }, /* DRE_DLY_VAL SWR_HPHL(0) */ + { .addr =3D 0x401804F2, .val =3D 0x00 }, /* DRE_DLY_VAL SWR_HPHR(0) */ + { .addr =3D 0x40180501, .val =3D 0x01 }, /* SEQR_CTRL SYS_USAGE_CTRL */ + /* + * DEVICE_DET (0x40180601): re-added. The validation team's + * tambora_reg_writes.xlsx does NOT write this register, but the + * original ASL init table (QcSimpleJack.asl BUF0 line 131) does. + * With DEVICE_DET=3D0x01 and the firmware in SDCA-mode MBHC reporting, + * physical jack insertion should assert SDCA_4 (GE_DETECTED_MODE). + * Now that the SDCA interrupt dispatch chain works (post MCLK + + * use_domain_irq fixes), test whether this write is what enables the + * firmware's MBHC state machine on our part. + */ + { .addr =3D 0x40180601, .val =3D 0x01 }, /* MBHC_CTRL DEVICE_DET */ + { .addr =3D 0x40180414, .val =3D 0x00 }, /* CDC_COMP_CTL_0 */ + { .addr =3D 0x401804F2, .val =3D 0x88 }, /* DRE_DLY_VAL */ + { .addr =3D 0x40180517, .val =3D 0x07 }, /* SEQR_CTRL HPH_UP_T7 */ + { .addr =3D 0x4018051C, .val =3D 0x07 }, /* SEQR_CTRL HPH_DN_T1 */ + { .addr =3D 0x401800CE, .val =3D 0x28 }, /* HPH_OCP_CTL */ + { .addr =3D 0x401800D4, .val =3D 0xe0 }, /* HPH_L_TEST */ + { .addr =3D 0x401800D7, .val =3D 0xe0 }, /* HPH_R_TEST */ + { .addr =3D 0x40180510, .val =3D 0x07 }, /* SEQR_CTRL HPH_UP_T0 */ + { .addr =3D 0x40C80008, .val =3D 0x01 }, /* SMP_JACK_CTRL FUNC_ACT (RESET= _FUNCTION_NOW) */ + { .addr =3D 0x40C00008, .val =3D 0x02 }, /* SMP_JACK_CTRL CMT_GRP_MASK */ + { .addr =3D 0x40C80000, .val =3D 0xFF }, /* SMP_JACK_CTRL FUNC_STAT */ + { .addr =3D 0x00000000, .val =3D 0x08 }, /* clear DP0 INT status SDCA_CAS= CADE */ + { .addr =3D 0x00000041, .val =3D 0x08 }, /* SCP_INT_STATUS_MASK_1 PORT_0_= CASCADE_3 */ + { .addr =3D 0x000000f4, .val =3D 0xff }, /* SWRS_SCP_SDCA_INTRTYPE_1 */ + { .addr =3D 0x000000f8, .val =3D 0x0b }, /* SWRS_SCP_SDCA_INTRTYPE_2 */ + { .addr =3D 0x000000fc, .val =3D 0xff }, /* SWRS_SCP_SDCA_INTRTYPE_3 */ + /* + * INTMASK: only SDCA_4 (GE_DETECTED_MODE) unmasked. Validation dump + * enables SDCA_5-8/18/19 too (HPH OCP/CNP/surge) but they cause an + * interrupt storm during HPH power-up: the SoundWire alert cascade + * fires but regmap_irq_thread never dispatches (INTSTAT_1..4 at + * 0x58-0x5B are never read on our platform, possibly due to the + * "no bus MCLK, cannot set SDW_SCP_BUS_CLOCK_BASE" bus-init failure + * that returns -22 from sdw_initialize_slave). Without a working + * dispatch path, unmasking these bits means the cascade never + * clears -> MAX_RETRY spam. Keep them masked until the underlying + * bus-init/PM issue is resolved. + */ + { .addr =3D 0x0000005C, .val =3D 0x10 }, /* INTMASK_1 SDCA_4 (GE_DETECTED= _MODE) */ + { .addr =3D 0x4018016A, .val =3D 0x00 }, /* CP_DTOP_CTRL_14 */ + { .addr =3D 0x40180165, .val =3D 0x6b }, /* CP_DTOP_CTRL_9 */ + /* ANA_MBHC_MECH must NOT be written here: enabling L_DET_EN before the + * machine card registers causes continuous SDCA_4 interrupts that block + * the deferred card probe. */ +}; + +/* Function Descriptor */ +static struct sdca_function_desc wcd9378_sdca_desc =3D { + .adr =3D 0x3, + .type =3D SDCA_FUNCTION_TYPE_SIMPLE_JACK, + .name =3D SDCA_FUNCTION_TYPE_SIMPLE_NAME, +}; + +/* Main Function Data */ +static struct sdca_function_data wcd9378_sdca_data =3D { + .desc =3D &wcd9378_sdca_desc, + .num_entities =3D ARRAY_SIZE(wcd9378_sdca_entities), + .entities =3D wcd9378_sdca_entities, + .num_clusters =3D ARRAY_SIZE(wcd9378_sdca_clusters), + .clusters =3D wcd9378_sdca_clusters, + .num_init_table =3D ARRAY_SIZE(wcd9378_sdca_init_table), + .init_table =3D wcd9378_sdca_init_table, + .reset_max_delay =3D 100000, /* 100ms =E2=80=94 WCD9378 power-on reset c= ompletes well within this */ +}; + +/* + * IT33 (headset mic input terminal) SDCA control for the AMIC2 bias + * rail. The framework's write_defaults programs 2V75 into the cache at + * probe, but the codec's RESET_FUNCTION_NOW during class boot clears + * the hardware value while the cache remains valid, so no PDE-time + * write ever reaches the codec. Drop the cache and re-issue the write + * from pde_pre_pmu to ensure the bias rail is up before mic capture. + */ +#define WCD9378_IT33_ENTITY_ID 0x0F +#define WCD9378_IT33_MICBIAS_SEL 0x03 + +/* PDE34 (entity_id=3D0x10) manages the headset-mic (IT33/AMIC2) power dom= ain */ +#define WCD9378_PDE34_ENTITY_ID 0x10 + +/* PDE47 (entity_id=3D0x09) manages the headphone (HPH L/R) power domain */ +#define WCD9378_PDE47_ENTITY_ID 0x09 + +/* + * FU42 vendor Feature Unit =E2=80=94 mute (CH1/CH2) and 16-bit Q7.8 dB ch= annel + * volume. Writes to the immediate FU42 alias are ignored by the codec; + * state changes only latch through the _CN (BIT(14)) alias followed by + * SoundWire SCP_COMMIT, and the codec re-mutes FU42 on every PDE47 + * PS3->PS0 cycle so the sequence has to run from pde_post_pmu. + * TODO: model FU42 as a proper SDCA Feature Unit entity once the SDCA + * framework supports DUAL-mode writes via the NEXT alias + SCP_COMMIT + * and re-applies defaults on PDE power-up. + */ +#define WCD9378_FU42_MUTE_CH1_ADDR 0x40c04309 +#define WCD9378_FU42_MUTE_CH2_ADDR 0x40c0430a +#define WCD9378_FU42_MUTE_UNMUTE 0x00 +#define WCD9378_FU42_CH_VOL_CH1_MSB_ADDR 0x40c06311 +#define WCD9378_FU42_CH_VOL_CH1_LSB_ADDR 0x40c04311 +#define WCD9378_FU42_CH_VOL_CH2_MSB_ADDR 0x40c06312 +#define WCD9378_FU42_CH_VOL_CH2_LSB_ADDR 0x40c04312 +#define WCD9378_FU42_CH_VOL_UNITY_BYTE 0x00 + +/* + * Entity_0 Commit_Group_Count. Must be written before the staged FU42 + * writes go on the bus so the codec latches the count first. Value 2 + * groups the FU42 mute and volume writes into a single SCP_COMMIT. + */ +#define WCD9378_ENT0_COMMIT_GROUP_COUNT_ADDR 0x40c00008 +#define WCD9378_ENT0_COMMIT_GROUP_COUNT_TWO 0x02 + +/* + * ANA_MBHC_MECH configures the mechanical jack-detect comparator. Value + * 0xB5 sets L_DET_EN, MECH_DET_TYP, HPHL_PLUG_TP, + * HS_L_DET_PULLUP_COMP_CTRL and SW_HPH_LP_100K_TO_GND =E2=80=94 the stand= ard + * enable pattern for a 3-pole/4-pole detect. + */ +#define WCD9378_ANA_MBHC_MECH_ADDR 0x40180014 +#define WCD9378_ANA_MBHC_MECH_ENABLE 0xB5 + +/* Vendor-specific SCP register: enable host clock divide-by-2 (bank 1 sha= dow) */ +#define WCD9378_SCP_HOST_CLK_DIV2_CTL_B1 0xF0 + +/* Slave ports 1..7 are mapped to master ports via qcom,port-mapping */ +#define WCD9378_SDCA_MAX_PORTS 7 + +static const char * const wcd9378_sdca_supplies[] =3D { + "vdd-buck", "vdd-rxtx", "vdd-io", "vdd-mic-bias", +}; + +static int wcd9378_sdca_sdw_read_prop(struct sdw_slave *slave) +{ + struct sdw_slave_prop *prop =3D &slave->prop; + struct device *dev =3D &slave->dev; + struct sdw_dpn_prop *sink, *src; + int ret; + + ret =3D sdca_class_read_prop(slave); + if (ret) + return ret; + + /* Configure SoundWire slave properties missing from DT/DisCo data */ + prop->simple_clk_stop_capable =3D true; + prop->paging_support =3D true; + prop->clock_reg_supported =3D true; + prop->lane_control_support =3D true; + + /* Source ports: DP2 (headset mic), DP5 (optimisation TX). */ + prop->source_ports =3D BIT(2) | BIT(5); + /* Sink ports: DP6 (HPH audio), DP7 (HPH envelope), DP8 (optimisation RX)= . */ + prop->sink_ports =3D BIT(6) | BIT(7) | BIT(8); + + src =3D devm_kcalloc(dev, 2, sizeof(*src), GFP_KERNEL); + if (!src) + return -ENOMEM; + + src[0].num =3D 2; + src[0].type =3D SDW_DPN_SIMPLE; + src[0].simple_ch_prep_sm =3D true; + src[0].ch_prep_timeout =3D 10; + src[0].max_ch =3D 1; + src[0].min_ch =3D 1; + + src[1].num =3D 5; + src[1].type =3D SDW_DPN_SIMPLE; + src[1].simple_ch_prep_sm =3D true; + src[1].ch_prep_timeout =3D 10; + src[1].max_ch =3D 1; + src[1].min_ch =3D 1; + + prop->src_dpn_prop =3D src; + + sink =3D devm_kcalloc(dev, 3, sizeof(*sink), GFP_KERNEL); + if (!sink) + return -ENOMEM; + + sink[0].num =3D 6; + sink[0].type =3D SDW_DPN_SIMPLE; + sink[0].simple_ch_prep_sm =3D true; + sink[0].ch_prep_timeout =3D 10; + sink[0].max_ch =3D 2; + sink[0].min_ch =3D 1; + + sink[1].num =3D 7; + sink[1].type =3D SDW_DPN_FULL; + sink[1].simple_ch_prep_sm =3D true; + sink[1].ch_prep_timeout =3D 10; + sink[1].max_ch =3D 1; + sink[1].min_ch =3D 1; + + sink[2].num =3D 8; + sink[2].type =3D SDW_DPN_REDUCED; + sink[2].simple_ch_prep_sm =3D true; + sink[2].ch_prep_timeout =3D 10; + sink[2].max_ch =3D 2; + sink[2].min_ch =3D 1; + + prop->sink_dpn_prop =3D sink; + + if (device_property_read_u32_array(dev, "qcom,port-mapping", + &slave->m_port_map[1], + WCD9378_SDCA_MAX_PORTS)) + dev_dbg(dev, "qcom,port-mapping not found, using default\n"); + + return 0; +} + +/* + * Convert a MICB rail voltage in microvolts to the SDCA MIC_BIAS + * usage enum understood by IT-family entities. WCD9378 supports a + * fixed set of bias voltages; any unsupported value is rejected so + * the DT stays honest. + */ +static int wcd9378_sdca_micbias_uv_to_sdca(u32 uv) +{ + switch (uv) { + case 1800000: return 0x03; + case 2500000: return 0x04; + case 2750000: return 0x05; + default: return -EINVAL; + } +} + +static int wcd9378_sdca_hw_init(struct sdw_slave *slave) +{ + struct device *dev =3D &slave->dev; + struct gpio_desc *reset; + u32 micbias_uv; + int ret; + + /* + * Compute-mode WCD9378 has no SPMI parent, so the supplies, reset + * GPIO and mic-bias voltages all sit on this SoundWire slave's own + * DT node (gated by qcom,compute-mode). Own them here. + */ + ret =3D devm_regulator_bulk_get_enable(dev, + ARRAY_SIZE(wcd9378_sdca_supplies), + wcd9378_sdca_supplies); + if (ret) + return dev_err_probe(dev, ret, "failed to enable supplies\n"); + + reset =3D devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(reset)) + return dev_err_probe(dev, PTR_ERR(reset), + "failed to get reset GPIO\n"); + + if (reset) { + gpiod_set_value(reset, 1); + /* 20us assert per WCD9378 reset sequence */ + usleep_range(20, 30); + gpiod_set_value(reset, 0); + /* 20us settle after deassert */ + usleep_range(20, 30); + } + + ret =3D device_property_read_u32(dev, "qcom,micbias2-microvolt", + &micbias_uv); + if (ret) + return dev_err_probe(dev, ret, + "qcom,micbias2-microvolt missing\n"); + + ret =3D wcd9378_sdca_micbias_uv_to_sdca(micbias_uv); + if (ret < 0) + return dev_err_probe(dev, ret, + "unsupported qcom,micbias2-microvolt %u\n", + micbias_uv); + ctrl_it33_micbias_vals[0] =3D ret; + + /* + * Vendor SCP bank-1 shadow that clocks the TX PDM path. SCP + * registers survive PDE cycles, so the one-time write here is + * enough for every subsequent mic capture. The trailing + * SCP_COMMIT swaps the bank in =E2=80=94 safe to do at hw_init since no + * stream is running that could underflow. + */ + ret =3D sdw_write_no_pm(slave, WCD9378_SCP_HOST_CLK_DIV2_CTL_B1, 0x01); + if (ret) + return dev_err_probe(dev, ret, + "HOST_CLK_DIV2_CTL_B1: %d\n", ret); + + ret =3D sdw_write_no_pm(slave, SDW_SCP_COMMIT, 0x02); + if (ret) + return dev_err_probe(dev, ret, + "SCP_COMMIT: %d\n", ret); + + return 0; +} + +static struct sdca_function_data *wcd9378_sdca_get_function_data(unsigned = int *num) +{ + *num =3D 1; + return &wcd9378_sdca_data; +} + +static int wcd9378_sdca_pde_pre_pmu(struct sdw_slave *slave, + struct regmap *regmap, + unsigned int function_id, + unsigned int entity_id) +{ + struct sdca_class_drv *core =3D dev_get_drvdata(&slave->dev); + int ret; + + if (!core || !core->dev_regmap) + return 0; + + if (entity_id =3D=3D WCD9378_PDE34_ENTITY_ID) { + unsigned int mic_bias =3D SDW_SDCA_CTL(function_id, + WCD9378_IT33_ENTITY_ID, + WCD9378_IT33_MICBIAS_SEL, 0); + + regcache_drop_region(regmap, mic_bias, mic_bias); + ret =3D regmap_write(regmap, mic_bias, ctrl_it33_micbias_vals[0]); + if (ret) + dev_err(&slave->dev, "IT33 MIC_BIAS: %d\n", ret); + } else if (entity_id =3D=3D WCD9378_PDE47_ENTITY_ID) { + /* Announce commit-group count for the FU42 writes in pde_post_pmu. */ + ret =3D regmap_write(core->dev_regmap, + WCD9378_ENT0_COMMIT_GROUP_COUNT_ADDR, + WCD9378_ENT0_COMMIT_GROUP_COUNT_TWO); + if (ret) + dev_err(&slave->dev, "Commit_Group_Count: %d\n", ret); + + /* Let the master's WR FIFO drain before PDE47_REQ_PS=3D0. */ + usleep_range(2000, 2500); + } + + return 0; +} + +static int wcd9378_sdca_pde_post_pmu(struct sdw_slave *slave, + struct regmap *regmap, + unsigned int function_id, + unsigned int entity_id) +{ + struct sdca_class_drv *core =3D dev_get_drvdata(&slave->dev); + int ret; + + if (entity_id !=3D WCD9378_PDE47_ENTITY_ID) + return 0; + + if (!core || !core->dev_regmap) + return 0; + + /* Wait for the SEQR sequencer to finish the HPH bring-up before + * re-applying FU42 state; the codec re-mutes FU42 on every PDE47 + * PS3->PS0 cycle so the sequence has to wait for the transition. */ + msleep(30); + + /* + * Unmute FU42 CH1/CH2 and stage 0 dB volume via the _CN (NEXT) alias + * so all four staged writes activate together on the SCP_COMMIT + * below. Writes go to the vendor slave regmap because FU42 + * addresses are outside the SDCA class regmap's routing. + */ + ret =3D regmap_write(core->dev_regmap, WCD9378_FU42_MUTE_CH1_ADDR, + WCD9378_FU42_MUTE_UNMUTE); + if (ret) + dev_err(&slave->dev, "FU42 MUTE_CH1: %d\n", ret); + + ret =3D regmap_write(core->dev_regmap, WCD9378_FU42_MUTE_CH2_ADDR, + WCD9378_FU42_MUTE_UNMUTE); + if (ret) + dev_err(&slave->dev, "FU42 MUTE_CH2: %d\n", ret); + + ret =3D regmap_write(core->dev_regmap, WCD9378_FU42_CH_VOL_CH1_MSB_ADDR, + WCD9378_FU42_CH_VOL_UNITY_BYTE); + if (ret) + dev_err(&slave->dev, "FU42 CH1_MSB: %d\n", ret); + ret =3D regmap_write(core->dev_regmap, WCD9378_FU42_CH_VOL_CH1_LSB_ADDR, + WCD9378_FU42_CH_VOL_UNITY_BYTE); + if (ret) + dev_err(&slave->dev, "FU42 CH1_LSB: %d\n", ret); + ret =3D regmap_write(core->dev_regmap, WCD9378_FU42_CH_VOL_CH2_MSB_ADDR, + WCD9378_FU42_CH_VOL_UNITY_BYTE); + if (ret) + dev_err(&slave->dev, "FU42 CH2_MSB: %d\n", ret); + ret =3D regmap_write(core->dev_regmap, WCD9378_FU42_CH_VOL_CH2_LSB_ADDR, + WCD9378_FU42_CH_VOL_UNITY_BYTE); + if (ret) + dev_err(&slave->dev, "FU42 CH2_LSB: %d\n", ret); + + ret =3D sdw_write_no_pm(slave, SDW_SCP_COMMIT, 0x02); + if (ret) + dev_err(&slave->dev, "FU42 SCP_COMMIT: %d\n", ret); + + return 0; +} + +static const struct sdca_class_hw_ops wcd9378_sdca_hw_ops =3D { + .hw_init =3D wcd9378_sdca_hw_init, + .get_function_data =3D wcd9378_sdca_get_function_data, + .pde_pre_pmu =3D wcd9378_sdca_pde_pre_pmu, + .pde_post_pmu =3D wcd9378_sdca_pde_post_pmu, +}; + +static int wcd9378_sdca_sdw_probe(struct sdw_slave *slave, + const struct sdw_device_id *id) +{ + struct device *dev =3D &slave->dev; + + /* + * The WCD9378 SoundWire class ID sdw20217011000 matches in both + * mobile and SDCA / compute modes. qcom,compute-mode on the slave + * DT node distinguishes them: this driver serves compute-mode + * peripherals only, so bail out with -ENODEV for mobile-mode + * slaves (a mobile-mode driver will pick them up). + */ + if (!device_property_read_bool(dev, "qcom,compute-mode")) + return -ENODEV; + + return sdca_class_probe(slave, &wcd9378_sdca_hw_ops); +} + +static const struct sdw_slave_ops wcd9378_sdca_sdw_ops =3D { + .read_prop =3D wcd9378_sdca_sdw_read_prop, +}; + +static const struct sdw_device_id wcd9378_sdca_sdw_id[] =3D { + SDW_SLAVE_ENTRY(0x0217, 0x0110, 0), + {} +}; +MODULE_DEVICE_TABLE(sdw, wcd9378_sdca_sdw_id); + +static struct sdw_driver wcd9378_sdca_sdw_driver =3D { + .driver =3D { + .name =3D "wcd9378-sdca", + .pm =3D pm_ptr(&sdca_class_pm_ops), + }, + .probe =3D wcd9378_sdca_sdw_probe, + .id_table =3D wcd9378_sdca_sdw_id, + .ops =3D &wcd9378_sdca_sdw_ops, +}; +module_sdw_driver(wcd9378_sdca_sdw_driver); + +MODULE_DESCRIPTION("Qualcomm SimpleJack (Tambora/WCD9378) SDCA codec"); +MODULE_AUTHOR("Qualcomm Technologies, Inc."); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_IMPORT_NS("SND_SOC_SDCA_CLASS"); --=20 2.53.0