From nobody Thu Sep 24 23:33:30 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 20E074F3EA2 for ; Fri, 18 Sep 2026 13:19:32 +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=1789737575; cv=none; b=TuC6GSdHDecS+nt7W8Dz2/yKIcNP8832db4ckrIUnsOM6DG+AGF2da9Ri2fWelJ/JBGMlZ80yDWbfc59TAjoDbiPIlALeuwWyu3DToiwehNqLhkBZI8tY/SIwT2FDVkhW1U+QlaXuq1E4pGDwWq3FK6wpWelR+S5lRXJEGC+R98= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789737575; c=relaxed/simple; bh=xEA5Mk7c5Lfp+mhJS1CZAxH/COdBNxDQFdboHwJ6tfU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=im3dyUD2LhgO8s/QH0v1qlN5GwmPkD4pi7ya9e8A5H1xKb+jzpiOBYgMyZ9KMXohkPt8Gu9qWonF2KwRRICXkyFBYDw1qLucXbknNFJAZs30ivvFmx1G8OZoGQKqVi7mk61f5bzUnXKaYJ9PnMl9TATbdVbpBhRLNwp+PNpd/NU= 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=GrwdJnBy; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=VNEZCDTt; 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="GrwdJnBy"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="VNEZCDTt" 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 68ICuEBU1650044 for ; Fri, 18 Sep 2026 13:19:31 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=gHRWnsaqzVv rj/VfSil1Z7BTKXXu2Ot1oVvsS3nZvA4=; b=GrwdJnByo5ysRxPAlqZXP+nPedX xnEKf2eBVbEXQgS615HEA7AbTYIfpKUuxv+ii/z3vipgmPXpmdOrpxbUEHOKtMOb cHmluvI5sIGVif9AzIpTGUMsBY+T4YJMo0Aonqf+g9vmxfU+0zCjDt/rIzwhl30x jqezEN86tZGD1hKyRr29nPUMyj3sMa7ltf0ZBl0a+WIp7y33mLqjGycYonWUhqir b/+6+M/idopoDpPZneIo9ERCrReJK26EK413b5ChvL0O3H+X5rylUVJKdWSGboQU jhV1hIkfPSd/fkoH2MYMDPg+LD1cr+xM5rIXuK97Ex1NRbqfna4MkzfGlZg== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4grrg43an5-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 18 Sep 2026 13:19:31 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-93909014c85so141526985a.0 for ; Fri, 18 Sep 2026 06:19:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789737570; x=1790342370; 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=gHRWnsaqzVvrj/VfSil1Z7BTKXXu2Ot1oVvsS3nZvA4=; b=VNEZCDTtEGQ63k9XtN8vZvl+bkC6aTjE9kwU0H46PmJw41MPlr/nQdp01EeCdFSUjZ bkBiKeEZYczDUSiuFEJiRKgy7ow/AShVz/T0lM2wXdZqejMnqLzf/93ukXOjtq/wpp4h DyE9Q3swk2rfmZ/KZZbjkDgNSB9wXkNo6+i1i8mi6nlNBtDxIr2aPHPvQgjhVtLw2y1S /nIsUB+BVGlFs+v6hAboDa+CEL/GJvXU008J344DaSBSUNRacyd6hMufhwEeT6vvNLNP DEjT8c4gUNNEuPV5wPMG3ExBSdgmxVwa6tgwSqcD7YBEVTDXVPwt2S8tF3f0OXCz+n5f wQrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789737570; x=1790342370; 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=gHRWnsaqzVvrj/VfSil1Z7BTKXXu2Ot1oVvsS3nZvA4=; b=1z/oooubccb6UImyyufyp8VgV8VNSDbLSuMazFJ1n0TMnJI1vqhT7dU+x9zbdVkLX8 x1pgVnsyU8B1pJkT27no2pW2ZDB63dJO5e62iV8WGOBYqJ8xK5wPoHxDU49cAqU9ZedT 7G46GVXx3W3wDcT73gCxcBI1lEcISbNWAVSAxNZPP7go1m9+9mCiHYtVhbstPDGU/DkV 18olIFDcBhQWaC+FnjRSQpsnksESx3LxcHKLV6A4MP8HDTHqfKQHM8trhI4yAxg50Ieq jUVn5YmwsFwz24QcJQclE3pvbgTdCPr3fh6eY2ytaocKDD0w9amX3pJ7prc64bZRcrP7 fFYg== X-Forwarded-Encrypted: i=1; AKwUvByRVs2Xvg1k24JqHD6bB9eY8BCjyAdBcYPiSz79UBZecnkPxlSC+UH9qlqakLXg0jGXosToEbLa/kz5bQ4=@vger.kernel.org X-Gm-Message-State: AFuF++k85kiJpho4+Kd0XBKXjid5Ymisuzj42VDJLI8bqutIqUPvW7St KCjp8SH41bbpSMSVK6kPyYDaT68yxbfEcZgFXAsP2ku8NHCUf9wGzNoMl1i1KfxE5jF9tfPfTbg C25F2y7jgsXEpel1iSrCZ+j0X6m5OT6Bk63FPrO++WiHCLjYyD5OA4kqEN4jpqjtzWMs= X-Gm-Gg: AYBFou3Y/NtA4fTZ5h/BrxrJQBpyecEYzoUuCO7QarCFTzU9Bd6TyrqLLSiYEhncUSE Hrt0ktAj5Rwh5nVB2/e1S5fch0fqHtNubI489E4QXuATwzVPOBb9W9n1GQvwl/0ozyCMQQAkRes iqJTANLZkCOtR3Z6iT3wYHK5rhS/hlFx0hkJP/sh7GuOvXnTzGSkyG2iVclQp747BpcR89CFShB IhzvkTZ6iExS6J+91fF3co81jDTWFMnoU5lpOFildGG4MRmXYsUA40BpT6O61yWLmZG0PDYcm6a KXLnc2dXXUfZmZdAKQopT8JBqjw+WoYOAUxS7sy/jaKsAmiqikwyr1+ui2tDRzXp/8kQfK8R0pf h77sozqgSY7Yf5g== X-Received: by 2002:a05:620a:4512:b0:93b:d7b0:c96b with SMTP id af79cd13be357-93bdca329e2mr323685785a.76.1789737570037; Fri, 18 Sep 2026 06:19:30 -0700 (PDT) X-Received: by 2002:a05:620a:4512:b0:93b:d7b0:c96b with SMTP id af79cd13be357-93bdca329e2mr323682085a.76.1789737569601; Fri, 18 Sep 2026 06:19:29 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fc7cebae2sm48254015e9.8.2026.09.18.06.19.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 06:19:28 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bard Liao , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek Cc: linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, patches@opensource.cirrus.com, Srinivas Kandagatla Subject: [PATCH v4 1/8] ASoC: SDCA: allow building without ACPI Date: Fri, 18 Sep 2026 14:19:06 +0100 Message-ID: <20260918131914.681588-2-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918131914.681588-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260918131914.681588-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: xQpr_EbOnqANJDLkI4u8jEdzf8KGzCdX X-Authority-Analysis: v=2.4 cv=ZO9CCn7b c=1 sm=1 tr=0 ts=6aad3a63 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=RY6toyVs4qztpF5PSasA:9 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-ORIG-GUID: xQpr_EbOnqANJDLkI4u8jEdzf8KGzCdX X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfXwuIMp5dLQ34w 1DEp96v98YUU02oQlV8l9BV7BblMIZJpztu/9o5quDv7XgEPlUkGyYVRFH67AZIYXX1WYQ0B3sK naCKl/6QGTuXMZJKJzOlCePOIt/z5c4W4jjB796MUkoAovpJgpR7o6e1ardX73hLCs6n/DEI3r8 l1MZV/KTuKNFgRWadj2ngK9mBhRCpNjEgc4VS/bI0vsiJl76eh9dDhYo8o2a95f/1vXW9l/o+nD 9w3zWX13qc8LOIouF1Hie3bth6MlnwSvuBvTzXi2LHLn6JolJzEQJqXKP45SEc7UAY/EZNtTlPh vLSpnf+oGrH7I4QRLhF6vX1bQAr4DkqPsalqC9aRGmXG0b+F0DtjaXKcszR3d6qb9FWMURod4d+ 2jAbo7PGby+s1TLYgffTDJE3Tsj2zG7aUxBwQTmkj62YUl45zvjDVZPmLFhujFseAnk7J11GgV2 bMi/slBhYmhFAt1GRaQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX6ngVncHSW3VF WEMtLeBSz/feq5Shr8G9H2eR4DALwsD65BWzAI/stzbl6gxQrrkiIj9miBQezirSojOD+0p/8JS 28OA8Iye5W0EKe4c+EfrSGEi1TsUjWU= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 phishscore=0 priorityscore=1501 suspectscore=0 adultscore=0 spamscore=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180189 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. Signed-off-by: Srinivas Kandagatla --- include/sound/sdca.h | 23 ++++++++++++++++++----- sound/soc/sdca/Kconfig | 6 ++++-- sound/soc/sdca/sdca_device.c | 4 ++++ sound/soc/sdca/sdca_functions.c | 2 ++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/include/sound/sdca.h b/include/sound/sdca.h index 2bdf4e333e04..db2672b3aae2 100644 --- a/include/sound/sdca.h +++ b/include/sound/sdca.h @@ -60,20 +60,16 @@ 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); -void sdca_lookup_interface_revision(struct sdw_slave *slave); bool sdca_device_quirk_match(struct sdw_slave *slave, enum sdca_quirk quir= k); int sdca_dev_register_functions(struct sdw_slave *slave); void sdca_dev_unregister_functions(struct sdw_slave *slave); =20 #else =20 -static inline void sdca_lookup_functions(struct sdw_slave *slave) {} static inline void sdca_lookup_swft(struct sdw_slave *slave) {} -static inline void sdca_lookup_interface_revision(struct sdw_slave *slave)= {} static inline bool sdca_device_quirk_match(struct sdw_slave *slave, enum s= dca_quirk quirk) { return false; @@ -88,4 +84,21 @@ static inline void sdca_dev_unregister_functions(struct = sdw_slave *slave) {} =20 #endif =20 +/* + * Called from the SoundWire bus during peripheral enumeration; gated on + * ACPI to avoid a soundwire_bus <-> snd_soc_sdca module cycle on DT builds + * (where the bodies are stubs anyway). + */ +#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SDCA) + +void sdca_lookup_functions(struct sdw_slave *slave); +void sdca_lookup_interface_revision(struct sdw_slave *slave); + +#else + +static inline void sdca_lookup_functions(struct sdw_slave *slave) {} +static inline void sdca_lookup_interface_revision(struct sdw_slave *slave)= {} + +#endif + #endif diff --git a/sound/soc/sdca/Kconfig b/sound/soc/sdca/Kconfig index 4c0dcb9ff3b9..72c02943c49e 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.populate_function. =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 4bcd8d1fdff8..3f302bfa5457 100644 --- a/sound/soc/sdca/sdca_device.c +++ b/sound/soc/sdca/sdca_device.c @@ -15,6 +15,7 @@ #include #include =20 +#if IS_ENABLED(CONFIG_ACPI) void sdca_lookup_interface_revision(struct sdw_slave *slave) { struct fwnode_handle *fwnode =3D slave->dev.fwnode; @@ -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 f39008ac0e7d..1eb6418e132d 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) { /* @@ -201,6 +202,7 @@ void sdca_lookup_functions(struct sdw_slave *slave) acpi_dev_for_each_child(adev, find_sdca_function, &slave->sdca_data); } EXPORT_SYMBOL_NS(sdca_lookup_functions, "SND_SOC_SDCA"); +#endif =20 struct raw_init_write { __le32 addr; --=20 2.53.0 From nobody Thu Sep 24 23:33:30 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 EA20D4F5E14 for ; Fri, 18 Sep 2026 13:19:33 +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=1789737578; cv=none; b=vEs/Jni00RnIozsPU2pU83FX2K2+VmFlHp2TauvaT/OUGQJhVFrRfB9JyYX2pER4kieG8NN/gobNUx3qz6Sibbz1p2XSTxNwzerYB02VEBo+cKNMrKANRHncwklX/wfcHl2Jvrf2vZg+HVaE0e8yjcv4EoAKKIOM2ivLhMkYM6o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789737578; c=relaxed/simple; bh=DX/k2+cTu6rvPz9eR+rvoARBCOb7oGx3eJBOQvcqBx8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u+7grCwk/81BKnGbz5dEvvRo6z9n3rwN5nITbJysqQ5FA0+/2Y1UNbXum3KG6YAB2VfmDIQ+hz5EQUyYmQyWBsjDW0XWivhoutoZtvFfW8QRGe32MPdLieu4J5VoRn4naVQw9XueZWXeTaYU0qt83ha9BV8vLvmEJNjWbHIjHNo= 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=nii4CUWj; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=DE19lT6c; 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="nii4CUWj"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="DE19lT6c" 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 68ICu1gq819756 for ; Fri, 18 Sep 2026 13:19:33 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=AAXGraH2Q+c EaofkWeUO4doE1Ao8y1Vg8kmDtzDBeow=; b=nii4CUWj8WbCxPkAWdf2bEU/VoF rg7eX/S4pZUEiT56LBWT5LxSliMJ/QiPyswGFaUSHXxEhKhzUEmsN1cLbFs7Og+n GJ8rkGQOyQfpITChxvWPfJ9PQUEj+kyWsSMBU8iZav8FnE5gMXdbtPX51hNLj0F9 KGLZt9sja3q11iIf9oLl5Ji6FwjR62xK95IbwAEsVdq+s3GwD7FmTgD4ySGbrYiq PB/D2mOqzbcdh03tDbP0JbQy6El0HjWrzwk8uQfWzRTTMwCs1S9t8NiODwDA0g0W kbrmj92hcjyGAZOHP7joCcYVwMSEUmElGh2JWr/bt3JQ1mybvPltnXyvxeg== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4grwxrt2vq-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 18 Sep 2026 13:19:32 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-93a08ff8451so122696885a.2 for ; Fri, 18 Sep 2026 06:19:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789737572; x=1790342372; 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=AAXGraH2Q+cEaofkWeUO4doE1Ao8y1Vg8kmDtzDBeow=; b=DE19lT6cNXK7HufNih5FhK0EbHhluLxlhm2G2TnDNEz/+rqqZLTPmT6FpDpflgeL6x ztn3FErRkGuSVhmFmaT78tZbHDUmoaSA1X9KqI+qPIYUHOxMyN1MTacYkqjsVzEK2RWj Yn1108MWhaPD67Sw7QAMk8nv3FIkh22YdeunwnFrcDvLY5lxYOLun1+5RgNduiFeUP9+ +ATajoD0CmnAFoiinVgL0/8/VAfqtrR1faZWSZtpP0n276jloT83RHWLazCFsM1PF9hy SrMdLvpAVuQY8KSydiKYreGg3qDDEzhHtKEntIEDXhMMFn7M7SemCRYxQ1nulgSCiM+v itfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789737572; x=1790342372; 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=AAXGraH2Q+cEaofkWeUO4doE1Ao8y1Vg8kmDtzDBeow=; b=u1mk61+u+nH/o5kw+0zb1XV7Yqt1N+F4TYAyq8pgqV6jvQxNRgIz9eFFDP68lmyxf+ Fo293zMjjjAxPMZ1pXHGZjls9OAPX6LDzQXuda8F7vEt40fEZspiEjqVkKh6oXNN/JXu SFsKkQoGdXzxEtkE7Psz7GMccEYC7C42LFrLK8l96WXBjeYoYWlZepjsIgWGi1bo6fAg PPp/TBaKz4c03mWc9c4i1E5vbX+w1RM/YmW+ahkX42b+eExByp2l0HHX6nRYzm7kG9Fa buL8I4K09VWHQWYQPco2DKCHf1RU3LTG/7d/53W3U5xPOGFuC3h/vZqWwEbHAhSDUv91 G9GA== X-Forwarded-Encrypted: i=1; AKwUvBw7VUGJrJ5AQBNbSBJvA1eiIAe865s2zi55fPSMsfmrhhsXxRPs7NXHWzYiZBqLHuX8k7GF8q3NNJDrjnA=@vger.kernel.org X-Gm-Message-State: AFuF++lymKYgnvFrLfE/YLgpSqJyQDecKPdvnPoKlYImMOzIUOHRUANV otJZJ2gBZ7etF9gqSSVIP9pzc8+dGtqO+b1gwl6foBPYzAXtmPUIsPjDxvwN+Tu9JF7bbTfhnwK JfsC+YNS2FE4fMD6nJAXvwEe5DIwfsDceKQroDzPS8Jo6eN7wJAyNeIAtV9zfrMzQRnY= X-Gm-Gg: AYBFou2WWtsjLc6RfF5OJUZZquatu/SqF7GNzfPZQptt8wcyeVrs5tHIkIzLe3dHJ50 Uhqv2i95+i6WArHm9gEMH271OazBaH/rNW6CsBJkQPThYWHG3eBZ4jZVVXXNPLA23eOhPfYfiBX at36gxqZHbeFhzi++h12U4s7Dpd8Om1c9b5nXFDHBiPwM56EtDYLSfg3vvcaxWwJWoSx1dfMXkK SLLAm+hnK1q71sc+uBMNg8uQs3FvVwrbPjLsajMaVAn+YRgr69fyxqU5bFXwojzuHmmQSthjBnZ oTmXrA4p8G8sya6bosHl0UI1CkxAwW/t4z7XsM9j7vAgFBf5xFTEY2zTgBSbXI5kkmfQxTcjFRe UhDUjfIlZeGeDZA== X-Received: by 2002:a05:620a:268d:b0:939:abe1:ed1b with SMTP id af79cd13be357-93bdc468cd5mr318317385a.0.1789737571766; Fri, 18 Sep 2026 06:19:31 -0700 (PDT) X-Received: by 2002:a05:620a:268d:b0:939:abe1:ed1b with SMTP id af79cd13be357-93bdc468cd5mr318310885a.0.1789737571204; Fri, 18 Sep 2026 06:19:31 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fc7cebae2sm48254015e9.8.2026.09.18.06.19.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 06:19:30 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bard Liao , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek Cc: linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, patches@opensource.cirrus.com, Srinivas Kandagatla Subject: [PATCH v4 2/8] ASoC: SDCA: export PM helpers keyed on sdca_class_drv Date: Fri, 18 Sep 2026 14:19:07 +0100 Message-ID: <20260918131914.681588-3-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918131914.681588-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260918131914.681588-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=EMWTQFZC c=1 sm=1 tr=0 ts=6aad3a64 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=3PQulrMEHypX3zRcvmEA:9 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NyBTYWx0ZWRfX6pAmFVjivFN3 ZlezmEpfmzWKT2H3kgqYcbhkqpAbVqk8rS58gvRxcrIdA8DLkQnm6q4koDpTGcgYHy/Cicx+ccA mKaq7s1/lTByMoodhDVOTbfWsAZ9XAl/fxtRkl9Ouk8ipfKRQeeI45nDktInuZdCSDGrNnxNvun k6K67HFn0hpSIJIFQvdW1bGi6ubZ+Er3V588rTt0LBA2/G6mW6IoHTeB/Wf9RoAqdzv5mUYdqNQ pVMv7MrIO+iuMxlrGiZsjEzW0cRK6wrIhiVtKBWSv0f7AUl+V3csjB3E1KzExkd7NqXqab4C1Qo UfSYYXTEzAoGnePfA1/BUTKfkdrBJ4xz8SaAfMcPaIW62oJpOTi+Y0fNg0e+s78EM78J1VaeNSZ m9TwZKkW4pFkJq84a5EJs4fBHsx6trViewgONYcSd+yX15W4HKe3jRCoyBI6ySzShzIAI11sqm2 rvIXTGOJ8a3mmx1ILAw== X-Proofpoint-GUID: ukAsU3ceSNywlhXukAfPFHBpUve7sXwT X-Proofpoint-ORIG-GUID: ukAsU3ceSNywlhXukAfPFHBpUve7sXwT X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NyBTYWx0ZWRfX8bL934vt9CjP vuaVejZUn8xF7gEBziEiLAwrIAdeVn4cPuxJOdTUSqBQ3yvvg2XNcdah2ENUIuh3xVu85H1yJly UmL9fN/jTxYL3j0pP/NAIA9gZwS+U5g= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 spamscore=0 malwarescore=0 impostorscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180187 Content-Type: text/plain; charset="utf-8" The class PM callbacks pull sdca_class_drv out of drvdata, so the built-in class_sdw_driver owns the drvdata slot. That works for the generic case but blocks codec drivers that want to embed sdca_class_drv in their own private struct -- they need drvdata for their codec priv. Split the four callbacks into exported helpers that take a struct sdca_class_drv * directly: sdca_class_system_suspend() sdca_class_system_resume() sdca_class_runtime_suspend() sdca_class_runtime_resume() Codec drivers can now compose these into their own dev_pm_ops without going through drvdata. For the built-in class_sdw_driver, add small dev_pm_ops wrappers that fetch drv from drvdata, wire them into sdca_class_pm_ops, and export the ops so any generic SDCA slave can pick them up as-is. No functional change: the built-in class_sdw_driver keeps the same PM semantics; only the internal plumbing shifts to operate on sdca_class_drv instead of struct device *dev. Signed-off-by: Srinivas Kandagatla --- .../soc/sdca =3D> include/sound}/sdca_class.h | 15 ++++ sound/soc/sdca/sdca_class.c | 81 ++++++++++++++----- sound/soc/sdca/sdca_class_function.c | 2 +- 3 files changed, 79 insertions(+), 19 deletions(-) rename {sound/soc/sdca =3D> include/sound}/sdca_class.h (57%) diff --git a/sound/soc/sdca/sdca_class.h b/include/sound/sdca_class.h similarity index 57% rename from sound/soc/sdca/sdca_class.h rename to include/sound/sdca_class.h index 57f7f8d08f49..ce2ed5f33e7a 100644 --- a/sound/soc/sdca/sdca_class.h +++ b/include/sound/sdca_class.h @@ -15,6 +15,7 @@ #include =20 struct device; +struct dev_pm_ops; struct regmap; struct sdw_slave; struct sdca_function_data; @@ -32,4 +33,18 @@ struct sdca_class_drv { struct work_struct boot_work; }; =20 +/* + * PM helpers. Codec drivers embed sdca_class_drv in their own priv, + * own dev_set_drvdata(), and compose these into their own dev_pm_ops: + * + * static int wcd_runtime_suspend(struct device *dev) { + * struct wcd_priv *priv =3D dev_get_drvdata(dev); + * return sdca_class_runtime_suspend(&priv->class); + * } + */ +int sdca_class_runtime_suspend(struct sdca_class_drv *drv); +int sdca_class_runtime_resume(struct sdca_class_drv *drv); +int sdca_class_system_suspend(struct sdca_class_drv *drv); +int sdca_class_system_resume(struct sdca_class_drv *drv); + #endif /* __SDCA_CLASS_H__ */ diff --git a/sound/soc/sdca/sdca_class.c b/sound/soc/sdca/sdca_class.c index d7444f442c71..a092ebaa620a 100644 --- a/sound/soc/sdca/sdca_class.c +++ b/sound/soc/sdca/sdca_class.c @@ -20,7 +20,7 @@ #include #include #include -#include "sdca_class.h" +#include =20 #define CLASS_SDW_ATTACH_TIMEOUT_MS 5000 =20 @@ -194,30 +194,41 @@ static void class_sdw_remove(struct sdw_slave *sdw) cancel_work_sync(&drv->boot_work); } =20 -static int class_suspend(struct device *dev) +/** + * sdca_class_system_suspend - SDCA class system suspend helper + * @drv: caller-owned sdca_class_drv. + * + * Codec drivers compose this into their own dev_pm_ops. Disables the + * SoundWire interrupt and forces runtime suspend of the underlying + * class regmap. + */ +int sdca_class_system_suspend(struct sdca_class_drv *drv) { - struct sdca_class_drv *drv =3D dev_get_drvdata(dev); int ret; =20 disable_irq(drv->sdw->irq); =20 - ret =3D pm_runtime_force_suspend(dev); + ret =3D pm_runtime_force_suspend(drv->dev); if (ret) { - dev_err(dev, "failed to force suspend: %d\n", ret); + dev_err(drv->dev, "failed to force suspend: %d\n", ret); return ret; } =20 return 0; } +EXPORT_SYMBOL_NS_GPL(sdca_class_system_suspend, "SND_SOC_SDCA_CLASS"); =20 -static int class_resume(struct device *dev) +/** + * sdca_class_system_resume - SDCA class system resume helper + * @drv: caller-owned sdca_class_drv. + */ +int sdca_class_system_resume(struct sdca_class_drv *drv) { - struct sdca_class_drv *drv =3D dev_get_drvdata(dev); int ret; =20 - ret =3D pm_runtime_force_resume(dev); + ret =3D pm_runtime_force_resume(drv->dev); if (ret) { - dev_err(dev, "failed to force resume: %d\n", ret); + dev_err(drv->dev, "failed to force resume: %d\n", ret); return ret; } =20 @@ -225,11 +236,14 @@ static int class_resume(struct device *dev) =20 return 0; } +EXPORT_SYMBOL_NS_GPL(sdca_class_system_resume, "SND_SOC_SDCA_CLASS"); =20 -static int class_runtime_suspend(struct device *dev) +/** + * sdca_class_runtime_suspend - SDCA class runtime suspend helper + * @drv: caller-owned sdca_class_drv. + */ +int sdca_class_runtime_suspend(struct sdca_class_drv *drv) { - struct sdca_class_drv *drv =3D dev_get_drvdata(dev); - /* * Whilst the driver doesn't power the chip down here, going into runtime * suspend lets the SoundWire bus power down, which means the driver @@ -239,10 +253,14 @@ static int class_runtime_suspend(struct device *dev) =20 return 0; } +EXPORT_SYMBOL_NS_GPL(sdca_class_runtime_suspend, "SND_SOC_SDCA_CLASS"); =20 -static int class_runtime_resume(struct device *dev) +/** + * sdca_class_runtime_resume - SDCA class runtime resume helper + * @drv: caller-owned sdca_class_drv. + */ +int sdca_class_runtime_resume(struct sdca_class_drv *drv) { - struct sdca_class_drv *drv =3D dev_get_drvdata(dev); int ret; =20 ret =3D sdw_slave_wait_for_init(drv->sdw, CLASS_SDW_ATTACH_TIMEOUT_MS); @@ -265,10 +283,37 @@ static int class_runtime_resume(struct device *dev) =20 return ret; } +EXPORT_SYMBOL_NS_GPL(sdca_class_runtime_resume, "SND_SOC_SDCA_CLASS"); + +/* + * Convenience dev_pm_ops used by the built-in class_sdw_driver, which + * stashes its sdca_class_drv in drvdata directly. Codec drivers that + * embed sdca_class_drv in their own priv compose their own dev_pm_ops + * using the sdca_class_*_suspend/resume helpers above. + */ +static int class_pm_system_suspend(struct device *dev) +{ + return sdca_class_system_suspend(dev_get_drvdata(dev)); +} + +static int class_pm_system_resume(struct device *dev) +{ + return sdca_class_system_resume(dev_get_drvdata(dev)); +} + +static int class_pm_runtime_suspend(struct device *dev) +{ + return sdca_class_runtime_suspend(dev_get_drvdata(dev)); +} + +static int class_pm_runtime_resume(struct device *dev) +{ + return sdca_class_runtime_resume(dev_get_drvdata(dev)); +} =20 -static const struct dev_pm_ops class_pm_ops =3D { - SYSTEM_SLEEP_PM_OPS(class_suspend, class_resume) - RUNTIME_PM_OPS(class_runtime_suspend, class_runtime_resume, NULL) +static const struct dev_pm_ops sdca_class_pm_ops =3D { + SYSTEM_SLEEP_PM_OPS(class_pm_system_suspend, class_pm_system_resume) + RUNTIME_PM_OPS(class_pm_runtime_suspend, class_pm_runtime_resume, NULL) }; =20 static const struct sdw_device_id class_sdw_id[] =3D { @@ -282,7 +327,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_function.c b/sound/soc/sdca/sdca_cla= ss_function.c index 1d7fd6603882..411e3d717bb6 100644 --- a/sound/soc/sdca/sdca_class_function.c +++ b/sound/soc/sdca/sdca_class_function.c @@ -26,7 +26,7 @@ #include #include #include -#include "sdca_class.h" +#include #include "sdca_function_device.h" =20 struct class_function_drv { --=20 2.53.0 From nobody Thu Sep 24 23:33:30 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 9C62E4F68AC for ; Fri, 18 Sep 2026 13:19: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=1789737579; cv=none; b=p9FXtTBrfnSSzWgVAJvrzXxEwuSvLAWGmlYQvSQUXjgonyPJMMk4v9ZMUuHKFN6hoeYucZY+J6kP/J50lxM8TVtbv5twHlqMRi3cHwRU55NfAmzdnJKOw/lqfsmjTR8ggDmh8qmFVNNkuwxA0N60KIRoKJ+zdlrTuY1sZI/vInU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789737579; c=relaxed/simple; bh=i+O7cZGqDHF9oCN3XLT5p5vttilZ9SLFPpmi99WMzqc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m5HxJdaKgkZVLWgNQ45JahfWdvKt2I/pMOJAJrU6T0xfCVkabWeIc/Q2jXbXQxrn6rjCd7CE9DZ9l2pniEG4tDiYRKyLcOiVLMil4J1afP2TvuarpwsrjivSLYxSibnXv3sCf+l5TAvkhCBBAcyb59TOvIyGFRA05ChF6EGF8EQ= 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=MW/to48S; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=M/9Uprm/; 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="MW/to48S"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="M/9Uprm/" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68ICtqFw1836647 for ; Fri, 18 Sep 2026 13:19:34 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=XrwBpas1mTr Y7PaKJXk9LXDg4hKLTOIWwidZcoVKoms=; b=MW/to48SB18tqKYkapF49++gw8o ccV5S6BTy0OT1gQnoG6uswFcLbCg4hlS8hBo0lAFffZ7uZrC11whInUlQobLmfIk t6naN7med9lRKzMsVY8ASFcbW01UPq8PO6h2irIsHHVRZYGUUZdNwVh0t4q2pybw gnGghnHuMPyw1OqdFoDjrMIFn5HRAxOavFGbTd/gBQBWbc/yKPW9VEg/ioEshexb nEvVgSqxhwfBvCXPVzrVRaJWIW7CBbKfp75jtfWbsAJDepGdMAHiTKVlAH5oIpd1 teRyXf5V5gIvcpzeRcUmzQ20HEhgm/i2jRDI9tuEiKMg7dSl+Mmbezfnykg== Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4grtdpttbq-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 18 Sep 2026 13:19:34 +0000 (GMT) Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-93a1bffc2eeso205521785a.2 for ; Fri, 18 Sep 2026 06:19:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789737574; x=1790342374; 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=XrwBpas1mTrY7PaKJXk9LXDg4hKLTOIWwidZcoVKoms=; b=M/9Uprm/Dmt1Mv202qF9tvZ7RG9p1ueGKlrUum2eaGosmIqaMDFv5VGICWsxaNgUcl 0tTIkwH/ny3O0ztR4sPzJm0e9HtqEaRu/GkyMjuMbSgVWQgPnahcbOM03B45qHT2lFS9 EOfYDTlmyReesB8lbpdGdLsVHsVHxLc/a4ICsNTPRcf9Znao9PJt0jx+NofcYRVdYKxU a4z545UHFW2zIs6ZfSeWtOlHAmntWBCq61obdKvv8WXyiJhSJjKrf0WYfdsFnJr+IYXH 3LAvr31KoZ+DEYsF9Wd8kx7YNn5mAY2pHzi4Y8t80Mhdv8mqOCCA9G5asDjHbgv03HTz +BDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789737574; x=1790342374; 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=XrwBpas1mTrY7PaKJXk9LXDg4hKLTOIWwidZcoVKoms=; b=rkFn5u6yF0i9oUixIWVlCuBYNmOIWDydn0pr5xj/bonvWmHuGXw1hQfVYKDUjQjq/w MTVykZsAvtDOo1LnOQhnNwN50pVzFQEt5Yzggb0dn+wW/HZvS5FNzPUcdF8Fzf34ASsl 27egRIMR8yI2UHaarfI7eJXaSvq0B5I0/xITa/6WGUoYPcaJWCTaWRRXqieHBkZwdMlj oD3uTtMT0qM/8QNRfpoOrsVxSbC93yOQthZz/lbth8LjUShkX/3qo+35mL8hGk2f/wle bnoK+ZjVgkd3nPn/rMjLXNaw8IwC6YgtZyknYd2dKVjF5Db5iTCAhQ+caxe4ElC48h22 G2mQ== X-Forwarded-Encrypted: i=1; AKwUvBwEjp+Skwhl3N3nJERPaNqyJtYzrrCIf2ks7lFIA0awSEa3BF3FI3lxS5TuMboFnhKk1VaR9H4cZLAa0Zw=@vger.kernel.org X-Gm-Message-State: AFuF++nAqtVDdvzlbB37/ffbt/X0WNp/IvT82ea7BhANCGNviWgSJqsc CW4Q+h33eGJj1DiyMGgyi1oRniAQrj9fD+AGiU1XIeLjkI+3Odmmg+zYtlQ8LGO7Sa3kOxpuXs8 g+mo9j1A9wQz8bPOHpkveJDimJMhjjkdkdM7WCEEgqHavXiCbEhn7sPpPaz/fHCfvlwE= X-Gm-Gg: AYBFou36ttoQGeWzJcimWIRdU1Bs5lF2RTutqNLB/npWCf787TSxeX7BS/6s+Jb47Do qw1XN1C09FYZYkhMwF+Q9yGnJ3225avD2KCzMFsUUg4T7dzFgBrRABLQpT3elQ5LnhtknOU2j5l 912l83c6lU7MmjOcEHOAh/Qc9voNNBI02EefF5ukgYW6wBYASBbWfUCxx43N5n7c0yUusdxKuip jFU70RS5ge4jhyZZtqgXhw+OPz1Bh90s020wET4/l51GfkRQ4JVd45mO8bkx3tCXthG7mn9md9v BhFCkaqs+ZYr8vAMKYoMKaVLvj/faXyrldKHfqtCuGbaTe+rBZMZ+LHq+StMshc0QK4i/fAri8x bB7qe3UFW62nSmQ== X-Received: by 2002:a05:620a:45ab:b0:939:4a34:621e with SMTP id af79cd13be357-93bdc702c8bmr348740885a.28.1789737573504; Fri, 18 Sep 2026 06:19:33 -0700 (PDT) X-Received: by 2002:a05:620a:45ab:b0:939:4a34:621e with SMTP id af79cd13be357-93bdc702c8bmr348733385a.28.1789737572805; Fri, 18 Sep 2026 06:19:32 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fc7cebae2sm48254015e9.8.2026.09.18.06.19.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 06:19:31 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bard Liao , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek Cc: linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, patches@opensource.cirrus.com, Srinivas Kandagatla Subject: [PATCH v4 3/8] ASoC: SDCA: expose class SoundWire probe/remove as library Date: Fri, 18 Sep 2026 14:19:08 +0100 Message-ID: <20260918131914.681588-4-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918131914.681588-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260918131914.681588-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: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX9BocaobyijCE jALRFsOA1ra8dIA/bBbQ1L4xyQE8NLGO7RubImpGYA0wiDPWlIkEP8uBx7nXftthx4KuiUX9J5P xQXupSZIxcyq8TEUeApjMxxwWKEmqR4P+gzCvuKh7ARbVznPWly3jx+q0dEXurFH+676YDyVCmh Qg8nlS2gAlwMi1CQlGKThdB7TsMGSwzkamhhjZ0hZOEgaz5iMMV3xuv2FYOjNa3rqKsYvwjBUyg HksR+R7E4k2TICGyyL/SmaCH8eIF/vb6IfJAYm2D8lP7P7nTYGGSunoQohdPMII9di5Q7O5PrkW 7MGYZ7IQd7HJdypM7Lv5eEAm3C5dxCPt6HDjr+UFwvVeaT3qUUH2VCwnlxbvVSN1rA7vo4tiZ6N +yihrxzeyQk5g4B1klxndFDcwXPWdtRvLHE0ffN40Cccqcs9ZyyNMtlT8A5nVt4xLmIqLG5g6ze 3QYUIR4rEukNplXSz3g== X-Authority-Analysis: v=2.4 cv=N+e8hG9B c=1 sm=1 tr=0 ts=6aad3a66 cx=c_pps a=qKBjSQ1v91RyAK45QCPf5w==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=EUspDBNiAAAA:8 a=mVpuNYMqi7MQLQPxcREA:9 a=NFOGd7dJGGMPyQGDc5-O:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX3Dftceu4Yr85 AxEGkMTFCrlQlezdYQC9eDR8vVGtlOj6OQ7Rhf3VlGLA39QmN+bp+s70tzKTpliG2ERJpyrCrep fWj8lpkOBhyGZbtFTkxpxZgGkGxO5k8= X-Proofpoint-ORIG-GUID: 7TcbK7-KzuQ7XyrW7pIb3uxPqy7Jn-jC X-Proofpoint-GUID: 7TcbK7-KzuQ7XyrW7pIb3uxPqy7Jn-jC X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 clxscore=1015 spamscore=0 adultscore=0 impostorscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180189 Content-Type: text/plain; charset="utf-8" Split the internal class_sdw_probe/class_sdw_remove functions into caller-friendly library helpers: sdca_class_probe(sdw, drv) sdca_class_remove(drv) The class_sdw_probe/class_sdw_remove callbacks of the built-in class_sdw_driver are now thin wrappers that allocate a bare sdca_class_drv, stash it in drvdata, and defer to the exported helpers. The exported sdca_class_probe() takes a caller-owned struct sdca_class_drv * so codec-specific SoundWire drivers can embed the class state in their own priv struct, own dev_set_drvdata() themselves, and avoid a second allocation. No functional change for the built-in driver. This lays the groundwork for codec-specific SDCA SoundWire drivers that want to compose the class-side probe with their own quirks; the next patches add the class_ops mechanism on top. Signed-off-by: Srinivas Kandagatla --- include/sound/sdca_class.h | 4 +++ sound/soc/sdca/sdca_class.c | 62 +++++++++++++++++++++++++++++++------ 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/include/sound/sdca_class.h b/include/sound/sdca_class.h index ce2ed5f33e7a..9e6b0eab8a0e 100644 --- a/include/sound/sdca_class.h +++ b/include/sound/sdca_class.h @@ -33,6 +33,10 @@ struct sdca_class_drv { struct work_struct boot_work; }; =20 +/* Library helpers used by codec-specific SDCA SoundWire drivers. */ +int sdca_class_probe(struct sdw_slave *sdw, struct sdca_class_drv *drv); +void sdca_class_remove(struct sdca_class_drv *drv); + /* * PM helpers. Codec drivers embed sdca_class_drv in their own priv, * own dev_set_drvdata(), and compose these into their own dev_pm_ops: diff --git a/sound/soc/sdca/sdca_class.c b/sound/soc/sdca/sdca_class.c index a092ebaa620a..0e6dead41495 100644 --- a/sound/soc/sdca/sdca_class.c +++ b/sound/soc/sdca/sdca_class.c @@ -136,18 +136,31 @@ 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 + * @drv: caller-allocated sdca_class_drv storage. The caller (a codec + * driver, or the built-in class_sdw_driver in this file) owns the + * allocation and sets its own dev_set_drvdata() -- the framework + * does not touch drvdata. Typically embedded in the codec's own + * priv struct so codec drivers can keep per-slave state. + * + * Codec-specific SoundWire drivers call this from their .probe after + * allocating a struct sdca_class_drv (usually embedded in their own + * priv) and setting drvdata to their priv. The framework fills in the + * sdca_class_drv fields, sets up the class regmap, and queues the + * deferred boot work. + */ +int sdca_class_probe(struct sdw_slave *sdw, struct sdca_class_drv *drv) { struct device *dev =3D &sdw->dev; struct regmap_config *dev_config; - struct sdca_class_drv *drv; int ret; =20 sdca_lookup_swft(sdw); =20 - drv =3D devm_kzalloc(dev, sizeof(*drv), GFP_KERNEL); if (!drv) - return -ENOMEM; + return -EINVAL; =20 dev_config =3D devm_kmemdup(dev, &class_dev_regmap_config, sizeof(*dev_config), GFP_KERNEL); @@ -159,8 +172,6 @@ static int class_sdw_probe(struct sdw_slave *sdw, const= struct sdw_device_id *id mutex_init(&drv->regmap_lock); mutex_init(&drv->init_lock); =20 - dev_set_drvdata(drv->dev, drv); - INIT_WORK(&drv->boot_work, class_boot_work); =20 dev_config->lock_arg =3D &drv->regmap_lock; @@ -185,14 +196,47 @@ static int class_sdw_probe(struct sdw_slave *sdw, con= st struct sdw_device_id *id =20 return 0; } +EXPORT_SYMBOL_NS_GPL(sdca_class_probe, "SND_SOC_SDCA_CLASS"); =20 -static void class_sdw_remove(struct sdw_slave *sdw) +static int class_sdw_probe(struct sdw_slave *sdw, const struct sdw_device_= id *id) { - struct device *dev =3D &sdw->dev; - struct sdca_class_drv *drv =3D dev_get_drvdata(dev); + struct sdca_class_drv *drv; + + /* + * Pure-generic SDCA parts: no codec priv to embed, so allocate a + * bare sdca_class_drv here and stash it in drvdata for the + * built-in PM ops to fetch. + */ + drv =3D devm_kzalloc(&sdw->dev, sizeof(*drv), GFP_KERNEL); + if (!drv) + return -ENOMEM; =20 + dev_set_drvdata(&sdw->dev, drv); + + return sdca_class_probe(sdw, drv); +} + +/** + * sdca_class_remove - SDCA class SoundWire slave remove helper + * @drv: caller-owned sdca_class_drv (the one handed to sdca_class_probe()= ). + * + * Cancels the deferred boot work so devres can safely free @drv and the + * embedding codec priv without racing class_boot_work. Codec-specific + * SoundWire drivers that call sdca_class_probe() must call this from + * their .remove with the same drv pointer they passed to probe. + */ +void sdca_class_remove(struct sdca_class_drv *drv) +{ cancel_work_sync(&drv->boot_work); } +EXPORT_SYMBOL_NS_GPL(sdca_class_remove, "SND_SOC_SDCA_CLASS"); + +static void class_sdw_remove(struct sdw_slave *sdw) +{ + struct sdca_class_drv *drv =3D dev_get_drvdata(&sdw->dev); + + sdca_class_remove(drv); +} =20 /** * sdca_class_system_suspend - SDCA class system suspend helper --=20 2.53.0 From nobody Thu Sep 24 23:33:30 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 0423B4F796E for ; Fri, 18 Sep 2026 13:19:38 +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=1789737581; cv=none; b=a97uSXo7B7hh95MhkEtaIF9yscu+1uYP4BW6sYN8aEtru1WQjzqgMjgluJVyDLnO9miJk56ET/JkuaE+tFykh7zhnN7J23C1j/0OitqIAr+ssa+Z0w0UmepbLBU5OSpjxbm3VgHr8oHD+/OYgcvj7s387sv14QiBUE4cPuyKu5Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789737581; c=relaxed/simple; bh=sTtAcC6DTgTsyia/QnLhKcG49gomKemayk5z0N7ppgc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ca1QWS2d8cz1bKlSH3LoqUcjkbUK1PVKvQlZZ9aJAgeEQ8CK1xXvGcXKtsj/jTkCbk7LZVLuHJseugULBgqtY9Fk20MHh8JzYiY1d7Tp7XVBpa0+52cMAfdSD1/7F0MH0wHW0rz8kY+0sDtlcJqOcPvde/R6Em38/Etp5GvRkaU= 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=TEHxDQUS; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=YDsVYeU5; 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="TEHxDQUS"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="YDsVYeU5" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68ICtv311291617 for ; Fri, 18 Sep 2026 13:19:37 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=xB2gDVEaK5Q aG7cBbuSlX5M4RqhKQThd1pOV5mauDU4=; b=TEHxDQUSuk8pVqu2FLWz+zV9Co2 fBsy7HYnK+E036ypihcHZTaaHUF9I33nQI9FdBm+aDcFfPNtGpCRjVNEE4sigIxk Rl4e3Ubyx2ImRffUkjlfk/Y9PQujLU41MyQnp5sYP1nkkfGmIHyp1+NZYEdumpqA xovUI33QjdoA6rfd/gJ1ZFdNaKgiW4NcjxOVCqMCGrjIBJ10laR4WQ4+fPbm3Rmd 2B9NnT/iKICeEjHSHkudwAO1bzAglIr844ue3dDtvD21N6AHDgGiBHP+G+p7rTDN 6SRh2vPfiIt9L+gxni+3fHY2svCh8+b5amez2wKGmbwf3N79xZDrJqtTEtg== Received: from mail-ua1-f72.google.com (mail-ua1-f72.google.com [209.85.222.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gs2hv8vr1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 18 Sep 2026 13:19:37 +0000 (GMT) Received: by mail-ua1-f72.google.com with SMTP id a1e0cc1a2514c-9806756ea40so471852241.1 for ; Fri, 18 Sep 2026 06:19:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789737577; x=1790342377; 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=xB2gDVEaK5QaG7cBbuSlX5M4RqhKQThd1pOV5mauDU4=; b=YDsVYeU5f91XXLifWF5yJnoteTzGqLsJQPtyarQMjGuaVDAEwKYs1htUsT0IbfngS9 BleQVzoa3uj9cp1YmIfYFqD4d75hX88vIiEvNuURA5CiaOvCBScbim+BJmX9lp7QpR4p gWzBQBCoOCWo9TNmffIeBCZEjDaIELOSrwJBKaGrfGLdmo1N7w877vJqJStrEoD4VjdP XKyyhQuLW9XqvEjHLBGrdYUDIgEsyGeMMx5GYacO1Jd6dB9id2ukljul993Sp3XqO+5+ l4+eBfrFJuGcsCxk2ynpIBhJbwElUWE310pZwkEgVSsOnzLYQ26uv/FZoAg1oK2xcHtO U4JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789737577; x=1790342377; 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=xB2gDVEaK5QaG7cBbuSlX5M4RqhKQThd1pOV5mauDU4=; b=2N98zR9sa4t61auWBBOXFZrD35hXA2kEOwMWVzhspvcyzTlF2tMGnCvlYPzNCJaOdu R+zCZwXj4y2UjDdWAtSe9fO8R644Sf3Zr3bk6Ow73YuFRtVGQluRAtasxroalLpvjAoo A7DZjPGgjU/F+m2gkfiy9ez2TzIy6zj0kHo8yzhtUyNhOuBwHBDz9IRRXfEs3yeIVBvZ +jAylgBXPWSzf/OGHxj7Gfw1Aak1Z5sfOiggG9ZhbXba1GTsx/gfBgxihCCIoY13PGbS Jyh7pavhjL9DhYayvRqCGx6GtY7PqfI7ZeDBvyw/VAPPylM2Wy7mmxKbROzYnyWDq09h pSLA== X-Forwarded-Encrypted: i=1; AKwUvBwF4oQAN0qSoGmR68xzvyXsRdCJqbHIGS+KcBcG3Sa+CAJtg1UcPz7GzLeTvPPQc6r1mZoiZCYkUIqAXB0=@vger.kernel.org X-Gm-Message-State: AFuF++njlgQN0w98jI2oVLKMEGF4afxnz8pKqgzlwSIb3WfSkRLEfaXs uOwDbu1RhD6EKzYtcYC5x3Gbe1SffOFZbZA2pXKGb06Rd89rvdVBYxzHHeYySfjo0qyJtg31urW /sekIEiwxsHqcI8I5ukENhjiIXEL8ezLDu5gw2pLPIDOpk2NW7pVmpZ6Na2KL64yOvlY= X-Gm-Gg: AYBFou1TRs8s0sngBwJR/RjiDqGsQSnyouQ0iklA+4XB0rvy2Ci4cvze2iq2t4KLxYe n6RrAZh53Fmg+Mn8T+G7a2tej8KOJ0hB08p4Ga2Tc99uPyDsYqR2xO7naxzREf3MqMx8FlG8EL3 sSsnanv4yg4KrR3XQaRqWgtkNuR6Z7EjtUIOhnO+3bidxZLq0nnaECKL86nzFiZjdCo93IPXv/q f7BXZsOH3dje0kRzZIWHTuFknW1g1m4OoXEjVS9KJylpdEf31q32x8jPk54xeBFPbp7fzcjcPeu lhfVe2Asb0jFXMoN+8zm+kIAD7CRyzfie8t552duNw098rdVIQtJJrjoe8kjkbYxJ7x3RDmPl84 Wkj6LOB2kl8pDSA== X-Received: by 2002:a05:6102:54a4:b0:79e:221f:704 with SMTP id ada2fe7eead31-7a55ad375b7mr1085352137.7.1789737577129; Fri, 18 Sep 2026 06:19:37 -0700 (PDT) X-Received: by 2002:a05:6102:54a4:b0:79e:221f:704 with SMTP id ada2fe7eead31-7a55ad375b7mr1085296137.7.1789737574250; Fri, 18 Sep 2026 06:19:34 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fc7cebae2sm48254015e9.8.2026.09.18.06.19.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 06:19:33 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bard Liao , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek Cc: linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, patches@opensource.cirrus.com, Srinivas Kandagatla Subject: [PATCH v4 4/8] ASoC: SDCA: add class_ops with populate_function Date: Fri, 18 Sep 2026 14:19:09 +0100 Message-ID: <20260918131914.681588-5-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918131914.681588-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260918131914.681588-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: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX+YymINWFTkBe tzbrywJE1NOmb+JW7HCbblKeJp6/6CtgUCS/xbjTdRAScs8IcKGe1ICQjXWXoa7zsa6VnO1cNFb pcx8gQEdzbwCiuQ77owoMcaCRwZM4Hw= X-Authority-Analysis: v=2.4 cv=IOWXmQvG c=1 sm=1 tr=0 ts=6aad3a69 cx=c_pps a=ULNsgckmlI/WJG3HAyAuOQ==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=RDHKc21CrRhZfFRGvR4A:9 a=O8hF6Hzn-FEA:10 a=1WsBpfsz9X-RYQiigVTh:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX+l+8GVcWUPGS u+tDbq5kbjzgmPLfgD1bGyrCQIC78ZccGXtgYxJYi2iaXdjjMFb9YvqB2ZnRfKtlBg+BNsrf3GE 3Ub71pq20ombQzxfKlCaI1My72SyZs3WDb6GOb19Fhj7+69AnScQOWNDunFIS4wAiGAuULkYz0c D5Juf7eaFG4tvg/tbaqtPEGZ1kjxDw/jkQBd/yYedWgv9uT5fC1qubX2rXix9YNin4Ghx5Zs8cy +ToKHSRKbPH4zfLTvxmw+b0AzQg7TWEh5nd8LIrLja5GvZhRwKgw7TwakEpFGCkqSXKxqxdAO+2 Rv+Uqhz9qtIGsRsNSfJBzabvCdz6X9J05a3Ha0oQVlirc58sthbnDbvaebe1Rtb7G6wttckMHnL 13mBBCXLEkQKm3EwQNJe47lGRx1k9UpfbbGYRrIZOTVASuzjV8PHSK7GJ1SCzbgjrjPqaODYtYs WqV2LOjf0/IYYgAzmRQ== X-Proofpoint-ORIG-GUID: OxHaU5qh8HqLoQ-Vzu3GTssAmi8UQiDq X-Proofpoint-GUID: OxHaU5qh8HqLoQ-Vzu3GTssAmi8UQiDq X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 adultscore=0 malwarescore=0 bulkscore=0 spamscore=0 suspectscore=0 phishscore=0 clxscore=1015 lowpriorityscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180189 Content-Type: text/plain; charset="utf-8" Add struct sdca_class_ops with a populate_function callback that lets codec drivers supply the SDCA topology (entities, clusters, init_table, ...) from static tables in place of sdca_parse_function() on DT/non-DisCo platforms. The callback is a pure data source and performs no bus I/O. Codec drivers embed sdca_class_drv in their own priv and register their populate_function through class_ops passed to sdca_class_probe(). Signed-off-by: Srinivas Kandagatla --- include/sound/sdca_class.h | 18 +++++++++++++++++- sound/soc/sdca/sdca_class.c | 9 +++++++-- sound/soc/sdca/sdca_class_function.c | 9 ++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/include/sound/sdca_class.h b/include/sound/sdca_class.h index 9e6b0eab8a0e..90af5b914ba3 100644 --- a/include/sound/sdca_class.h +++ b/include/sound/sdca_class.h @@ -20,6 +20,18 @@ struct regmap; struct sdw_slave; struct sdca_function_data; =20 +/** + * struct sdca_class_ops - optional codec-provided class callbacks + * @populate_function: fill @function (entities, clusters, init_table, ...) + * from static tables in place of sdca_parse_function() on + * DT/non-DisCo platforms. Pure data source; performs no + * bus I/O. Return 0 on success or a negative errno. + */ +struct sdca_class_ops { + int (*populate_function)(struct sdw_slave *slave, + struct sdca_function_data *function); +}; + struct sdca_class_drv { struct device *dev; struct regmap *dev_regmap; @@ -27,6 +39,8 @@ struct sdca_class_drv { =20 struct sdca_interrupt_info *irq_info; =20 + const struct sdca_class_ops *ops; + struct mutex regmap_lock; /* Serialise function initialisations */ struct mutex init_lock; @@ -34,7 +48,9 @@ struct sdca_class_drv { }; =20 /* Library helpers used by codec-specific SDCA SoundWire drivers. */ -int sdca_class_probe(struct sdw_slave *sdw, struct sdca_class_drv *drv); +int sdca_class_probe(struct sdw_slave *sdw, + struct sdca_class_drv *drv, + const struct sdca_class_ops *ops); void sdca_class_remove(struct sdca_class_drv *drv); =20 /* diff --git a/sound/soc/sdca/sdca_class.c b/sound/soc/sdca/sdca_class.c index 0e6dead41495..79fdb672be1d 100644 --- a/sound/soc/sdca/sdca_class.c +++ b/sound/soc/sdca/sdca_class.c @@ -144,6 +144,8 @@ static void class_boot_work(struct work_struct *work) * allocation and sets its own dev_set_drvdata() -- the framework * does not touch drvdata. Typically embedded in the codec's own * priv struct so codec drivers can keep per-slave state. + * @ops: optional codec-provided class callbacks (may be NULL for + * pure-generic SDCA parts that need no quirks) * * Codec-specific SoundWire drivers call this from their .probe after * allocating a struct sdca_class_drv (usually embedded in their own @@ -151,7 +153,9 @@ static void class_boot_work(struct work_struct *work) * sdca_class_drv fields, sets up the class regmap, and queues the * deferred boot work. */ -int sdca_class_probe(struct sdw_slave *sdw, struct sdca_class_drv *drv) +int sdca_class_probe(struct sdw_slave *sdw, + struct sdca_class_drv *drv, + const struct sdca_class_ops *ops) { struct device *dev =3D &sdw->dev; struct regmap_config *dev_config; @@ -169,6 +173,7 @@ int sdca_class_probe(struct sdw_slave *sdw, struct sdca= _class_drv *drv) =20 drv->dev =3D dev; drv->sdw =3D sdw; + drv->ops =3D ops; mutex_init(&drv->regmap_lock); mutex_init(&drv->init_lock); =20 @@ -213,7 +218,7 @@ static int class_sdw_probe(struct sdw_slave *sdw, const= struct sdw_device_id *id =20 dev_set_drvdata(&sdw->dev, drv); =20 - return sdca_class_probe(sdw, drv); + return sdca_class_probe(sdw, drv, NULL); } =20 /** diff --git a/sound/soc/sdca/sdca_class_function.c b/sound/soc/sdca/sdca_cla= ss_function.c index 411e3d717bb6..d83be8474e7b 100644 --- a/sound/soc/sdca/sdca_class_function.c +++ b/sound/soc/sdca/sdca_class_function.c @@ -329,7 +329,14 @@ 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, drv->function); + if (core->ops && core->ops->populate_function) { + ret =3D core->ops->populate_function(core->sdw, drv->function); + } else if (drv->function->desc->node) { + ret =3D sdca_parse_function(dev, drv->function); + } else { + dev_err(dev, "no firmware node and no populate_function hook\n"); + return -ENOENT; + } if (ret) return ret; =20 --=20 2.53.0 From nobody Thu Sep 24 23:33:30 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 B20424E3769 for ; Fri, 18 Sep 2026 13:19:40 +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=1789737582; cv=none; b=CAj9ELQNIsKh5+zJ5101swUwKt/Jj1gqOs7Bf72isMzntZxcPKD/tdNLv/Bi9MovRAbiCLse5TrY7IDLpDmTjUiSnDX/7D5MwV50RoTjf58504vnSETgwKChZwuYWjTrngH/u8ctt3oeH9lOfDZeq3fCwj7e929ccq9CMAfZCGI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789737582; c=relaxed/simple; bh=3JoZslnkrMsaU3dbbMDWnwmTMC8zQq0qdN+qFoCdvA0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JHgxxmDzL8vncWybttomJWEoTOhn5KHCNLVA2pZR7zETD2wmjGE0p2Mj2EZ+91ywozqb93ukZG3QlyCew5zlKMMDSaJjrSsdJEcTEmWlSpnwCA9zEz5b3DytRjbtRDcSVpk/wdZRLi/gDJkftXPIWCguCLOPwQo+PS3jO+qpP6U= 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=ZfZEpdQq; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=KDLQStil; 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="ZfZEpdQq"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="KDLQStil" 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 68ICuDP2153220 for ; Fri, 18 Sep 2026 13:19:40 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=fN1FhCnQZY6 7jtn7cG6ZH44bflXnGtosQXBJzsdeJFo=; b=ZfZEpdQqJikAZ6BqmlDvdUPdZul MgfFTTjKzfv3F5S4cQ89zFtyNK7+kXjI9UXwX8MeHXk08vEweXaaEM5L2YvfRjEr Q35joJOQuO46MQ7E3rsE7fQ65tc1HZUpsoO3KMgyyYYPf0SbC5hFs8MO+gKLCpyu 6cvMMlHJu/kwU4t1eBKzaXan+14NLl5vaXUaiEUNwZCt5KDMBwg9DldK/5SGpQMg XRRYUi5gmdEGW0I95gP7zDdzAvpPvJIpvaasxsdrRfdbrWBIkN2IvenexRBPkBMF mU4wwccoUS1Vvx5UqXNIpv15tU9jmRsnA4QbaX+P5LsNK9Ndm09U1XtqF/A== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4grrjdua92-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 18 Sep 2026 13:19:39 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-93909014c85so141558485a.0 for ; Fri, 18 Sep 2026 06:19:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789737579; x=1790342379; 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=fN1FhCnQZY67jtn7cG6ZH44bflXnGtosQXBJzsdeJFo=; b=KDLQStilkHTYuu/6+0m5Gi8ULUInDlMMtWAtw8bXubCAj2rdQQ6ii2F5o+C+BJbrsi 6GeY1mwEv6g92VTeZlZ07M8vPImO7Q6B4HMe53Tzh59SuT3Z1BZhHU3H93KYl3gQh3xT QU/M8jl3rfv8ov/AC5aHwNMXMbdoAVyqsAenXsSpSFqjqo1KmSIAvaAupkBL3m0yfrK6 /NZSbkydQ+mubouh/Ww1vQ1MaujdHKBbkF1G7ySlzJDVZ3o8LrkwMFRX44QASAQUJ03n /uYLehA9Gj/WseS72uuZHWS8JLDpjifhZ0QEoxAH+cbQHuv9ISW2BbWnxcOWC1MyC1Nj ddKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789737579; x=1790342379; 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=fN1FhCnQZY67jtn7cG6ZH44bflXnGtosQXBJzsdeJFo=; b=CDlUQ2lP5FbYSw0ZgfUSrpbiF6V2v0/jib28E1/bqVUBg3weo8njxxIfpzUb7NMONj z6K/wDEngTUq4aL8tAptFp2+Tudcxl82PrsKB0L4c2Fm+wLXrnG5LtalM0iZqCgN808a bk3CTzdjwZbAdgUCZ4ZrvwDtch8x/+sWQhBJPh4VgRb0y+/eDCc6rUgLBccKfS5lU3fI 1a2LCi60S1fen6MHmvSqM5F7PH0h97XoP65HEk7dTCl4xxaGp1xvO3rqJiYILPIAG3eM 7ixpRXpHTcPqAxsEX/xJM/QAy+OyG1DHu6iBg45Qacgsi6lSUl4qSt2Pygtnu6wTQ/jD 5d/g== X-Forwarded-Encrypted: i=1; AKwUvBypIJzmVktt4uEX5tJX1iQCavwLSmQn/bcAIbnGAzTHaxisOud58lsswcT259yA7SM/giL7nt3vEHV8ElI=@vger.kernel.org X-Gm-Message-State: AFuF++nFCXuDEqycuutxtXPftHIY57Ohr1ITfLWUYXqnSf8o8EQlTtmB bNenv0UUASU5B+cxXyI3iHHfRG0Wbu66dJhEqx5RAYzdrPhQYw8GvoISSxs/EpCR+Q6Y70kpd90 2XMAjhcUDzb8xnNbLQkq8FXcmAnGmCgm9rdHeMMtJnK7ypcyZCtiUmQbUejr6+mYTDjM= X-Gm-Gg: AYBFou3dkoHo7wiPiYU69lOjEn8HHfqcrA38MZdSoFh8CZK2NYqYLbqQmNOZ2N7Rb47 SJI3M+KSfkmNEmzVOJRr8HZuvI7wMwsEjp7rYlQbra83L6Mq7+H/DfCJg0br3Mtrrof1w3qt9TA eQCU8L6tEuIXoL369v6htrGpKdLGu6GcfbMoHNh9GK2E36TVdieVOUoMjFRz5lS1g76Wy9SXR31 aZ3m8K5w0tDJTNFKNAdNBGUL1H8nrNJ0X7VfwrvaIphdbGj78m/VS5mBrXYDcET3eLspJwQFhwo SrHBJhb8hyNGO/GRYsLZJBSBCHTpb5r9roINQ+Y/9UZQI8rD1j96F7Y73tLRGo1lXg+vOIrwtYr QCkpLrhZ5DPQhBQ== X-Received: by 2002:a05:620a:439e:b0:93b:d7b3:3bdc with SMTP id af79cd13be357-93bdca3e1damr311781385a.85.1789737578633; Fri, 18 Sep 2026 06:19:38 -0700 (PDT) X-Received: by 2002:a05:620a:439e:b0:93b:d7b3:3bdc with SMTP id af79cd13be357-93bdca3e1damr311776085a.85.1789737578062; Fri, 18 Sep 2026 06:19:38 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fc7cebae2sm48254015e9.8.2026.09.18.06.19.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 06:19:37 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bard Liao , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek Cc: linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, patches@opensource.cirrus.com, Srinivas Kandagatla Subject: [PATCH v4 5/8] ASoC: SDCA: class_function: xlate sound-dai cell by entity index Date: Fri, 18 Sep 2026 14:19:10 +0100 Message-ID: <20260918131914.681588-6-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918131914.681588-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260918131914.681588-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: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX0HngydnpOm8W oY96blaFlLNjTHwOlPZ5TSp3M+XXh+fft4tXWhCTOQ2c9Skae3CO6x2GpKx4ZTLY/aXvVkw8gFv S4e6ABqQLqL5gx+qwe+MjtoGvugCwkoBWeDpdE3pzdERknidOeHeFIOnfuA94f9QCjchsFUzQA1 tLRIrXkIOpRgOQgY4LsJDnPW1Z4eZpqRx8qzxqhIkQIi+5Si+gfiNlWnX4vyL1oCR3b/T32TwK/ bmSjXG8WU4sJfSyBtiRdfdTGQJrhmqtGvsyYsfyJI5ruy9MA2UKhcOBGKbkz4PuBzq80PxpvRmp IfIlehmTJogiK+ml5EC6/1GuQ+RbJh0Gq3Pog9b7Uqpmk7lo+AlVWpV/fe4zv/1SlJWDDPZ0Aa6 IUOMb2PziQRp5zUI7Su+azBnqSzSAb0oL/aNldqrvJUAmQ5danjV6euYCshW8MdXbPJ8nwcD1Ow LXIhSY9c+ClTm7twB1A== X-Proofpoint-ORIG-GUID: DbLJF4r3y0OlF01uapdtOLnNcON1qQ9_ X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX4Kp1BENNRxsk Vejeo8LDVoPU05HLJwZLdLFnEtaWiaElET8oiKneetXcZxomKOSnq24stKcvLTG3GtRJhdiketP /VJsTZvh3Yt84LSl0gwfFmsO9VRrZz0= X-Authority-Analysis: v=2.4 cv=J9Q/fwnS c=1 sm=1 tr=0 ts=6aad3a6b cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=D7LRd5SpCY7MsyqoJ6wA:9 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-GUID: DbLJF4r3y0OlF01uapdtOLnNcON1qQ9_ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 impostorscore=0 clxscore=1015 suspectscore=0 phishscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180189 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. Signed-off-by: Srinivas Kandagatla --- sound/soc/sdca/sdca_class_function.c | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/sound/soc/sdca/sdca_class_function.c b/sound/soc/sdca/sdca_cla= ss_function.c index d83be8474e7b..328c667edfd9 100644 --- a/sound/soc/sdca/sdca_class_function.c +++ b/sound/soc/sdca/sdca_class_function.c @@ -216,9 +216,43 @@ static int class_function_set_jack(struct snd_soc_comp= onent *component, return sdca_jack_set_jack(core->irq_info, jack); } =20 +/* + * DT phandle cell is the SDCA entity index (matches dais[].id), not the + * positional DAI index the default xlate assumes. + */ +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; + struct sdca_entity *entity; + u32 target; + + if (args->args_count !=3D 1) + return -EINVAL; + + target =3D args->args[0]; + if (target >=3D function->num_entities) + goto err; + + entity =3D &function->entities[target]; + if ((entity->type !=3D SDCA_ENTITY_TYPE_IT && + entity->type !=3D SDCA_ENTITY_TYPE_OT) || !entity->iot.is_dataport) + goto err; + + *dai_name =3D entity->label; + return 0; +err: + dev_err(component->dev, "xlate: no dataport entity at index %u (num_entit= ies=3D%d)\n", + target, function->num_entities); + return -EINVAL; +} + static const struct snd_soc_component_driver class_function_component_drv = =3D { .fixup_controls =3D class_function_component_fixup_controls, .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 Thu Sep 24 23:33:30 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 8D6A74FC8C5 for ; Fri, 18 Sep 2026 13:19:41 +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=1789737585; cv=none; b=jJ5OI7ERHxOu7Wtt9dFBC5ptaLvXe9/Hs3EyW/YCV6jscxxZq+1M/xdhWxh2oNp6XeFpW5wat4Xopmc2sNpYwwjhuKOfBoT3ATrlKvvvGGbCzU0AyjUCQgT2ueKSFNc2DOeSEDKQQc1tom8t4tvlTW9yDmk3ZnYGWRQgMwNTkRs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789737585; c=relaxed/simple; bh=/H9GH/lQ1ALwgeqTcIx0s7pOIycSN6qFIhiEh+CM8vU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nF3tyF+OMek1AiNTNBZ0QhG9OCRCEPnhL9MVEIEhaKOvmtRmYnVKAmHbzx2OACV4tOhCq1SGTvudPpMUEtkh+qRDlizs24dFpnYefxbGW4Vpy4FiuFP2Svpbk1b7Mww+W/5LDJ2my9i9NY7mh9DuHCV5fpSRye3Qk12YidQ9ndw= 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=GfPgHwED; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=V1DGplZ7; 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="GfPgHwED"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="V1DGplZ7" 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 68ICu2ug819764 for ; Fri, 18 Sep 2026 13:19: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=oSYrXj0qRL6 iijgn56YH1Ou/LIGAHpwxuNfyBoq9ZJA=; b=GfPgHwEDrBvFZI67n/zEdowmwF1 FaDnjg3TdnKvnMejAyNyorfPdy+L5T1ofcRy1V8S0ew3+4BE5iJ+rBB6bfNTMvUr 2BIp2rzyaUPhNFWWYhYr/toNjsz6pm2pgcIRpeyegV8dF3mB4suX72vWWKAEOcCF D+/UdtlPva67+EIZlWH9ntmPJy3IU73LYFMHhVdNIbJquCNGhUqnZXHJXWuP7035 nNLfU+Q/QFJeo3+sl9PDrxeRdnXKIt8Q4bSU9hxGAADBBtZb9klyLa+iJJhdTK4a u0CJJ+PN+gw52TM9oxFJdwBo6zBpD3ks9JW4x8HOruF9q/hffdTt5IV2m2g== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4grwxrt2wg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 18 Sep 2026 13:19:40 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-93a1b824e84so144305585a.2 for ; Fri, 18 Sep 2026 06:19:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789737580; x=1790342380; 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=oSYrXj0qRL6iijgn56YH1Ou/LIGAHpwxuNfyBoq9ZJA=; b=V1DGplZ7c8skyDQ7OJYVbCDdMiya7VCGittmvnDIZkmHpeQWn/k1mNTuJJtEPNaoI3 DTPztBS2JqWaBryWRKzug/RXohzchcVpSlbQtFEcJPa5UpbaojWQG7zCqlEU5rw57cJf 4OFrm6yUFr99xvMoLoGLb8uScdM8l+iU1BVv7FgrnHcK6+LgKRCWf5Mgw228Gjg3ZtrL 3IDTGx8fdhb0u+EiAuepTFTQ6PlRlUyWhUzZbVQoRI/InrOi5x9atoKHc3YRmR32+8VQ AadYuNRdrTA6gd26XJKox5ANHwFwrQRmJ1/Oni5+ELihlzqiO7UtAgIu02Q037OMHk39 SQKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789737580; x=1790342380; 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=oSYrXj0qRL6iijgn56YH1Ou/LIGAHpwxuNfyBoq9ZJA=; b=QRzmwCtL8W+w6473SXRx7JaTvj9UakkIIqZNQUOQM2NTUJHMISh493997evPvQxtHR xXW4sB0jNYGeq5U4tGtEmW46c2hEbvwuZnAO6c2/A0VXHeTUzl4+hHqamUuxlBCtXwCK ivMEL2cghHy4ieZEYLAV/gJrELxywxXfJGcKtwNubCq7HbE0TJ6z5bM0wUmp+dipmci7 QbiksY1x+ZMqLLgvnhGDIBQ7RbS9ZBV8R0Phv7Z7bz1uWd61hDiOgPncV6bwfWKbffwM y4l/VpWc1kmd715J3dKcd/sut0vavlybl6TUrBzPN4HFWcONE5KC3gVbxjV/fkgIER8o Fm1Q== X-Forwarded-Encrypted: i=1; AKwUvBwAMs7cULabyxbBtlWpkGTTvUM9Tt1eG2Gl+unIovYTtkWT4mnreNZK0eJjHAKVsO/HCrqBTOQpiDM9UYY=@vger.kernel.org X-Gm-Message-State: AFuF++m7Y7jIO417xz0I9hERt5B/VveBxphKi0/YTZRpn8HLQqaB0pyb N9WLkXykxQvG81Rot58bN4k3tvC6G6qSqOr1K6/Ak9mCdQiXl2kAoBIsK/xbiy+oL4XLhUpMHSU RAXa1xnJMWwKW5LkaispMS3lUYim41ENmp/W4Q7yxCTqXTeTU7JsKj8WEkXXHb8x7qIY= X-Gm-Gg: AYBFou07YH5DtbuocAFJUQlbCDaEbsP+zUpYUwd5HKehTDyLz33wFRf/5p0lT0RxF0V 1rG6M36IpxFPaa6+YHxqsZ6QLiWHxNrkZRiaBVNocvAI9gxpvSjIvI+tSDmgHR/qkNu9nUiMoE0 UhzEaciditUivnVdFt2cPkuwAy27NwCMCiXrqiYuF3Z9z7AfypmT0Rmfh88jpFWu31iqQbJMPJn RL9cam0oLJqqKK65liDg7qKjDHgSRKmYYWQpTTIO6lCu8gePDN0RjSuqfnheBZtpXK4RyT2ZrOM TtrTFeqmi0bktX26mpoWZIFh06VdUFHJvt5eEP8UjB9vgqxCPP3Ssul5fJq24wioTFPemkXtLob O6ICLWS7if/8E3g== X-Received: by 2002:a05:620a:838e:b0:93b:6113:218 with SMTP id af79cd13be357-93bdc6974a9mr313704785a.12.1789737579991; Fri, 18 Sep 2026 06:19:39 -0700 (PDT) X-Received: by 2002:a05:620a:838e:b0:93b:6113:218 with SMTP id af79cd13be357-93bdc6974a9mr313699385a.12.1789737579470; Fri, 18 Sep 2026 06:19:39 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fc7cebae2sm48254015e9.8.2026.09.18.06.19.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 06:19:38 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bard Liao , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek Cc: linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, patches@opensource.cirrus.com, Srinivas Kandagatla Subject: [PATCH v4 6/8] ASoC: SDCA: add sdca_apply_default_control_classifiers() helper Date: Fri, 18 Sep 2026 14:19:11 +0100 Message-ID: <20260918131914.681588-7-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918131914.681588-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260918131914.681588-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=EMWTQFZC c=1 sm=1 tr=0 ts=6aad3a6c cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=V3wSzEE_ktrjQKcqLJ0A:9 a=O8hF6Hzn-FEA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfXxrlGfbJuaFT+ Ay30nW98PdNvFZTBUYLVxhEC1PC0GXq0OuPPqPPZlQ6D0br6e+fhrpNxWoPnWoVxMp2cQQsxpGY c4xyCnMaKRf2VyryZq2R1XoKdgw8tRB1oNqxeOfbz+rQ1X9kvb5eubvOPFvcit7fpAuJJK0djEc 0JWnLZ5o77V3/pjrhGfgtco/5LoGuKwoW6fDNGP5Iq+uOHlUhKaxwZYiTbGUJT9154MAf5suVMg LnPrCy/EgvnPCVziekDqe1RSLNwtkP6dR3+HKa2IIfRhb+TKGv3Dhgt2KhNu7nuxjrWhdOTLVYa ysgkEV+nNXoZekZV+/ZHcXwPhaTO/5/vtG1sFXt+kYC9WMo97iQ7lAWeFIQe+lDlURs0Ihn9m1h H61oeIpbotHeMfmDBxs1rEFDJmOpubfLKOLUhNlHFeCNcSQxqoQdO2sJ5ZCdtTh0LEpG+LxTz2i 5JXLT9vOtz4A/SoDBbA== X-Proofpoint-GUID: jZ13SpwpKas92Nt62ABI8mTzlZ9Lt_VD X-Proofpoint-ORIG-GUID: jZ13SpwpKas92Nt62ABI8mTzlZ9Lt_VD X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX3ywYsg4coYIy Sxp1/DDJeiFPfjFYqNdpExEuOkiGxYaCd1chxUTsh3+82pG+K3C0aR7hkQkBREdpIA1Y1QVv5Kt 1FRJoO3u0FK8H6Qkzu+tWttHmHtyzv8= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 spamscore=0 malwarescore=0 impostorscore=0 phishscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180189 Content-Type: text/plain; charset="utf-8" sdca_parse_function() derives is_volatile (see c7b6c6b60594) and the spec-defined reset value (see 02d851b46b36) from each Control's (entity type, selector, access mode). Codecs that ship static SDCA tables via populate_function skip that path, so RW1S action Controls end up with is_volatile=3D0 and get replayed on every regcache_sync. Add sdca_apply_default_control_classifiers() to re-run those two classifiers over a Function. Elevate-only, so codec-set flags win. Call from the tail of populate_function. Signed-off-by: Srinivas Kandagatla --- include/sound/sdca_function.h | 2 ++ sound/soc/sdca/sdca_functions.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/sound/sdca_function.h b/include/sound/sdca_function.h index e580201d69d5..d3d77d8bb7cd 100644 --- a/include/sound/sdca_function.h +++ b/include/sound/sdca_function.h @@ -1464,6 +1464,8 @@ static inline u32 sdca_range_search(struct sdca_contr= ol_range *range, =20 int sdca_parse_function(struct device *dev, struct sdca_function_data *fun= ction); =20 +void sdca_apply_default_control_classifiers(struct sdca_function_data *fun= ction); + const char *sdca_find_terminal_name(enum sdca_terminal_type type); =20 struct sdca_control *sdca_selector_find_control(struct device *dev, diff --git a/sound/soc/sdca/sdca_functions.c b/sound/soc/sdca/sdca_function= s.c index 1eb6418e132d..52ce9355a22d 100644 --- a/sound/soc/sdca/sdca_functions.c +++ b/sound/soc/sdca/sdca_functions.c @@ -2266,6 +2266,35 @@ int sdca_parse_function(struct device *dev, struct s= dca_function_data *function) } EXPORT_SYMBOL_NS(sdca_parse_function, "SND_SOC_SDCA"); =20 +/** + * sdca_apply_default_control_classifiers - apply framework-known Control = fields + * @function: Function populated via static tables (populate_function path= ). + * + * Runs the same per-Control classifiers as sdca_parse_function() so both + * entry paths land on identical @is_volatile and @has_reset/@reset fields. + * Elevate-only: codec-set flags/values are preserved. + */ +void sdca_apply_default_control_classifiers(struct sdca_function_data *fun= ction) +{ + int i, j; + + for (i =3D 0; i < function->num_entities; i++) { + struct sdca_entity *entity =3D &function->entities[i]; + + for (j =3D 0; j < entity->num_controls; j++) { + struct sdca_control *control =3D &entity->controls[j]; + + if (!control->is_volatile) + control->is_volatile =3D + find_sdca_control_volatile(entity, control); + + if (!control->has_reset) + find_sdca_control_reset(entity, control); + } + } +} +EXPORT_SYMBOL_NS(sdca_apply_default_control_classifiers, "SND_SOC_SDCA"); + const char *sdca_find_terminal_name(enum sdca_terminal_type type) { switch (type) { --=20 2.53.0 From nobody Thu Sep 24 23:33:30 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 8B6EE4FD26B for ; Fri, 18 Sep 2026 13:19: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=1789737586; cv=none; b=ijxgf31jNowk5B+jaO2x6E54pmaQxKL3N04Gs/xm4uWvNCxwbPoLH31v/tgG5DxolFNWONSNtvusA587t9oSqkWLqK2cSIoY9JYwSEFbtq3qL1vtNkCGclA1KAARgryVLfAnsBOdSnpqhS7IfWfGujOISXJIiYZpea7A33jTyl8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789737586; c=relaxed/simple; bh=MU0rmSfq8z627CzeHXf/aw3fNFEvcLWJdhX6oXFHzCk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=n9MmSjL9/phb2EhySy22d7Zxx9KeGYaoDQ2TSj1nhBAGd5bx+785mJvdMRFRxoQZK2J8mtyYn/rJvvjy9g2pV0v7x0HUh8b9+9hu21TgEty3w9X1dH0cbrUgM6UeVRPCGs3n5Zcf5t80BXKV2dnTR0hPmeZH/u7tHQ8bTnE5qe0= 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=jgSZz3lE; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=OwcKc4al; 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="jgSZz3lE"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="OwcKc4al" 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 68ICuDHx153228 for ; Fri, 18 Sep 2026 13:19: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=o8tgPrluC9c kzRzhPb6V5SaRrtpKQumwcAGbMPyJNCY=; b=jgSZz3lE8WtC227RRf7n+MTwtv8 9GycrP918+r8Y99G7rF/Amffn2+SJDxjqmJeWiwk2CtQEu/5pTxWtlnKmYy0l1dg trXHuMZ8dY0jdpoNSyERhnzp1lsCWz1ktDrq+HgpxA0E2fqS33YQKvcDq9HdQ3/i 4oTW7RcuXDL09I/xZEb7yGQDOjKaloRD+BFRF4sV1hlP5QmSmYSj2CqbDqFAbfZf s+EJ79DmwWIB2faaTxW6gtORj0kP1AgVlN+IG5eE507zuue2laujKsD51wKsUcP6 JlnhBuqpWmplIRZP9MtB722+I0pPWGajj0QPYGIyedptMnaj/8iOTyOrj6g== Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4grrjdua9g-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 18 Sep 2026 13:19:42 +0000 (GMT) Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-93a2d361e1aso168777285a.1 for ; Fri, 18 Sep 2026 06:19:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789737582; x=1790342382; 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=o8tgPrluC9ckzRzhPb6V5SaRrtpKQumwcAGbMPyJNCY=; b=OwcKc4alz5HXo0/n1iRv4uScRL3tGXdEvuaalnMzM06qDcauOJNNsQyE8+G1BmfLQR TsjWB37FfZ7CDo7Ibt9RN2oB++hTM/KNyh9Ww3aUsWjokc45D0xlRGOGl7m2sHGnnNir CYMXIC66CexVYlRHrnSIFD8WGdtXlxhg7fSaU2FsHwTzX04nmceAVMCcjw90Zy18ASIA ccNtWOJ4VynmBaeyBBwUfHN9CBU4SaGI/sptRfP+A+IoaQMMNcDKdrJ28s5MtAc7A1rl M5BrYMns3Qe3uE2mD/do4Y3MzBkYcKKAWu/lwK2uUKCJy6hrbPcA8hPz6RINl7vQzE2/ 5qkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789737582; x=1790342382; 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=o8tgPrluC9ckzRzhPb6V5SaRrtpKQumwcAGbMPyJNCY=; b=s90z1C27ZnRmTqSnByFtpBkoLeAce17Rm6S+jAVSs1NDlqQbKYC62D28pHNpepg4pv to83bhbkND+lmw6bv9LJqOmsyXCBkqBasTcVDKCBcoTtcrwmlY+ALIXQFdBW8Gf2Yv91 u5iDIe0RIS5cpbfXY3hAeo8ihoi20ZhchMN1W16QwH36uNAqPD31g3upAniPeHryE/yO 8rY5DzwMyYQzR5FHhKd+YcLreLB035oZ3nNo9BexQcuHMkGznWzNeY9tA6cXzJ2nN6L2 9uWEIlWiW/Nlv8+swddYecuTGXA/WRjkgvGDzXqq8rznJB4oLWYUo15iCsSXvLzIBLV8 gEiA== X-Forwarded-Encrypted: i=1; AKwUvBwkQIzrdfzecwbho9pF/xbmMakKQSwiwFPSpiVm1TzDIbyWjE43U/Tr8sl+dU6TVT/MLZ6GHNnIV87wCaI=@vger.kernel.org X-Gm-Message-State: AFuF++m2TLzdAp9FBB1kwi+6y+7R9pgDb8TjKmWVkU5IW6/hP135JnKf V5W/3AjktXUlSBZGMoriCHpxmv8IPxggm1yiHTzlv151tXTybIlu+RfAervzz37B4/Sq5jGKjh1 yKV8GG8FwbiDn2Up4EQWeFqJMkRE5gRCgDFOiBXOErlQG+KSBnbUXEEIm/bsa/BjSEcw= X-Gm-Gg: AYBFou1oMCb8gEIavbbnoBFAQDzKmM0PA83lGiDTnRzjeiZxRs/1EJCBKy03IxIAEbm NbP+TFVM6uJMlaxJWLxl5jIAolrHRIZubgYI1ULZEhvNiqLXJEtnu2jZdFLpTsjmkLRi4wHJqGX EXJ+GN4mqYiDVtbSRwFxGSGVjRxJzVtxcUHFAgkCcFU8b8B9XRFHN2WBIzQg7pZxt32fA1INTfW vO18obVX2KTjM0qYB68equDE2Q/SDtW2OsHPEuL+PIP5E870J0DGypJS+x+Ym5dSTHy9pqwIgRn 0GLakyngREfNouZ80rAYXqDSTWNTxQXtpCuI6R8x1toHMLBKVMRkv4BG6REuDnok0eg45nkNxVT jNUSDT+DsElhXmQ== X-Received: by 2002:a05:620a:4686:b0:939:707b:ec10 with SMTP id af79cd13be357-93bdc9fdefdmr324190585a.52.1789737581702; Fri, 18 Sep 2026 06:19:41 -0700 (PDT) X-Received: by 2002:a05:620a:4686:b0:939:707b:ec10 with SMTP id af79cd13be357-93bdc9fdefdmr324183985a.52.1789737581179; Fri, 18 Sep 2026 06:19:41 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fc7cebae2sm48254015e9.8.2026.09.18.06.19.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 06:19:40 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bard Liao , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek Cc: linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, patches@opensource.cirrus.com, Srinivas Kandagatla Subject: [PATCH v4 7/8] dt-bindings: sound: qcom: add Tambora WCD9378 SDCA codec Date: Fri, 18 Sep 2026 14:19:12 +0100 Message-ID: <20260918131914.681588-8-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918131914.681588-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260918131914.681588-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: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX05rxO9wm2MGR OaLp6mUT4+d4koLBPUAmZDoCsDDPI1FPyC7hyZh4QwNJ2+5usLJ2ZfAxVYRIBCT6tjiMuLa4t92 OV8m8P8xYwIp7egGixRBg83tER+maG8oLicBosu14f10vRlD6BivJyahejem3+fA14/qh5iEnqW WwmNO69XzJkisc/+vy6tnbDoEz0FHKR9VuGYUFa1WBTi8TnxsQMW8JUu7MMngfjfHOJqMPBgtGT meogfUVrF3t60/I9vuYLtUH3tGyegk3Ilfzn9E2JhewKZN0rb3D6gGDanGWTXEgbsw1sFqf81EC inj5JC8i7PQFSpfvir9y054VS6M7LMEfywq/9zhwS3pSFd1dRkFhQJ5gZweIGWGOh+SGT6Qmo+u 3oaMwpyC+Ck/0bb7UGWlsIUqThFXgHyYJKZscF7d7PGsJeGlTe5jTb84Jl2mvtgO3o5hBfJGAR9 5Lynl27RjRCrxsJmSKA== X-Proofpoint-ORIG-GUID: uWCB_aWoKDDrDxUJxTZfkg2Y5MomiEyr X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX5o0ZeMLrkGM4 67J0TcxXMs5s+kvbL5pP54d0eNUmy2hMqMh18WW713wwUR0dUX5y7AEbjU1lSyDlJ6rxIefewOC ULgak3fwTepocQ+zYqso41cfmnruj90= X-Authority-Analysis: v=2.4 cv=J9Q/fwnS c=1 sm=1 tr=0 ts=6aad3a6e cx=c_pps a=qKBjSQ1v91RyAK45QCPf5w==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=gEfo2CItAAAA:8 a=EUspDBNiAAAA:8 a=fAJwNmJgYEpPzymNVfgA:9 a=NFOGd7dJGGMPyQGDc5-O:22 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-GUID: uWCB_aWoKDDrDxUJxTZfkg2Y5MomiEyr X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 impostorscore=0 clxscore=1015 suspectscore=0 phishscore=0 priorityscore=1501 bulkscore=0 malwarescore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180189 Content-Type: text/plain; charset="utf-8" Describe the WCD9378 SoundWire peripheral which is SDCA compatible soundwire device. It provides SDCA SimpleJack for headphone playback headset mic capture and MBHC jack detection. The same silicon is integrated in two ways and enumerates with the same SoundWire class ID: mobile mode: two slaves (tx, rx) on separate SoundWire masters. SDCA / compute mode: one aggregated slave on a multi-lane master. Note: both of them have different bus toplogies 1 device vs 2 devices. Currently only compute mode is supported by this bindings, mobile mode will extend this binding as required. Signed-off-by: Srinivas Kandagatla --- .../bindings/sound/qcom,wcd9378-sdw.yaml | 102 ++++++++++++++++++ 1 file changed, 102 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..33fcd0f191ec --- /dev/null +++ b/Documentation/devicetree/bindings/sound/qcom,wcd9378-sdw.yaml @@ -0,0 +1,102 @@ +# 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 WCD9378 (Tambora) SoundWire codec + +maintainers: + - Srinivas Kandagatla + +description: + Qualcomm WCD9378 (Tambora) SoundWire codec. The same silicon can be + fused for a mobile (non-SDCA) mode or an SDCA-compliant mode; the + qcom,sdca-compliant property selects the latter and is required by + this driver. + +properties: + compatible: + const: sdw20217011000 + + reg: + maxItems: 1 + + qcom,sdca-compliant: + description: + Present when the codec is fused as SDCA-compliant. The mobile + (non-SDCA) variant carries the same class-ID compatible and is + handled by a different driver. + type: boolean + + qcom,port-mapping: + description: + Each entry maps a slave data port to a master data port. + Entries are in order starting from slave port 1; slave port 0 + is reserved and not represented. SDCA-compliant mode uses 8 + entries covering DP1..DP8. + $ref: /schemas/types.yaml#/definitions/uint32-array + minItems: 8 + maxItems: 8 + + reset-gpios: + description: GPIO used to release the codec from reset. + maxItems: 1 + + vdd-buck-supply: + description: 1.8 V analog buck supply. + + vdd-rxtx-supply: + description: 1.8 V RX/TX supply. + + vdd-io-supply: + description: Digital I/O supply. + + vdd-mic-bias-supply: + description: Mic bias supply. + + '#sound-dai-cells': + const: 1 + +required: + - compatible + - reg + - qcom,sdca-compliant + - qcom,port-mapping + - reset-gpios + - vdd-buck-supply + - vdd-rxtx-supply + - vdd-io-supply + - vdd-mic-bias-supply + - '#sound-dai-cells' + +additionalProperties: false + +examples: + - | + #include + + soundwire@7630000 { + reg =3D <0x07630000 0x10000>; + #address-cells =3D <2>; + #size-cells =3D <0>; + + wcd9378c_sdw: audio-codec@0,3 { + compatible =3D "sdw20217011000"; + reg =3D <0 3>; + + qcom,sdca-compliant; + + 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>; + + #sound-dai-cells =3D <1>; + }; + }; +... --=20 2.53.0 From nobody Thu Sep 24 23:33:30 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 234DA4FD7A4 for ; Fri, 18 Sep 2026 13:19:47 +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=1789737594; cv=none; b=Reilf4AEeUXaP0gqiRaDZaGZlHD2KbXNF8Wf/GcsdcMK3wEGvMcUfgLBb83/R5IPyR5W12sI4O0f5Kqui3pkCHNWaLGhYwFhP7q6IfgWgmwqR6UOxDWSXZzZA9e6oXgSzWXHo7XTtL/igmUzpx0FaTaKavpaZ0TX6VA30iV79+0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789737594; c=relaxed/simple; bh=dmsr/ox5voaM293WLYQJDqU8Yye9jFh6ujzd2JPdwh8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=BVGvribN+DxzZIWGdNp+Hcu1Kv3GCR6Hp5SEDjxfT6dajPEhRJHgxezZ+EOSojiN4ch3+a+Sc2wJOyuXWNOj5Al26DixvopZ8YEqBtosqOKbr/ylEylezsGnTEfTE2lrbdCYVkEJzUMpE8vfX6NoyeNlpnYwgJXvPYO8lMB18wA= 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=fDiOU1vN; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=LrrqSRUT; 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="fDiOU1vN"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="LrrqSRUT" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68ICttqd3584158 for ; Fri, 18 Sep 2026 13:19: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= 1hlEgY4x8gPu8zkAIhHa2W1euxyEiuIjuI8Aa6S3V0w=; b=fDiOU1vNnnLn/mPk emvb1jM9WxpAelpuH1sXLWKXLhTfAGb0gKYNQdFzgih+mLxBssRtHcoG6+0MP3Kc JKO3sS1D05FcguMt3kmjz11pVonXy/+AWEIHyJfd1Lz8aHXc1pcooY8CnLlqRKJi NHKkmr5MMOJrd2HIRvwjOnsk3Q7TglCgucSphW7CAVJ4CoXv0CiOuxMW4LnjX0vz kvbGDutJ1E+LxuYmgaO0uiR+e/0rVNJk2Ww/cp1D9ZLC9kf9FoEio9Dw4b7YKvV/ f5xn4iGwo1NzxnJHaveDVPUfRzfe0MJmOc0MEYW4rjWJ6gUeyjY5YnGgmzklS/8l YR/urQ== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gs37dgpsw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 18 Sep 2026 13:19:45 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-93a00c70d28so112405585a.0 for ; Fri, 18 Sep 2026 06:19:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789737585; x=1790342385; 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=1hlEgY4x8gPu8zkAIhHa2W1euxyEiuIjuI8Aa6S3V0w=; b=LrrqSRUTfEMlq1Xcy9Tdm3Y22aV9u8fS1QJjEWExH3MqidS4Yg3s4xr6Q0sDMSxFOb Keqi4vir5lfmWRwNO+PKtlOLM4uxMgwGylHAOUaPtWR3Z0L4FE0bafGqJxAHCjZ0P+SA 87gfOMx6u0nVEiVAxvkKC2eSeAukjWShP6naLsh9gmUWlXb0KG6dDOrsUpTplf2W9dra 04FBOfzqXKGBf4gEds5m+BcLSh94D71f8XM14uOayNNsJyhBvs7NIJTRMWr9B8kAAkIp oUOuSdnbn5Iz+lVCnICoLXmusRnxzJIUvzuZm/9yVmI8IPFFzDZE/u86L/azdpzMHzBT d2fQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789737585; x=1790342385; 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=1hlEgY4x8gPu8zkAIhHa2W1euxyEiuIjuI8Aa6S3V0w=; b=PGaHhkiRIEHtezLGs5Qxp99rrL6YPQHXEfPD1dIzfDpugpI3/zAM1PYbchcE1evNcJ JIw/U5hTJTGqqef1q5zYVnmGdvVBbRNvByMBB6AbplsgxOAhmThDGASIonmRGU+iW+Q0 uTgdQx6DqMcI+LjzBoygNsaCjMNB8Ty3GD8Z/GRQbxwwcnTDakz7D4/BKN3OZTIf2fLH p69sMB+Vhtx6N8KQnpx/iNKdL0KJaVmQW2zhWtVsur+P7u/xO8cdbyYKfav2ESOKuGkn mfw38dqEcI4gMRKHyEnAQZWv1zFB8HMB1H00elbNqsgcgRwjRXIXLELqnhCJIgVK9acY i9pQ== X-Forwarded-Encrypted: i=1; AKwUvBwBx2WXSm5RpJzaxJcHrHKAyJvAWRECCCe9UzFgKJabkKzJ2O8R1z2BglSn9ansOiPOBRTDddp77GzzdIY=@vger.kernel.org X-Gm-Message-State: AFuF++nHs2FlzTZJxrJeJ+uq8vYoOXkxrIIzHUTNy9F9IPr8xf/PQ+78 8zmPUd+SSeCOGFKF+Q/5RaqvVHwEkL+1QcU9IOetQBT9sEJ1hoEoeWIsrMQgs47uvsB0ID032+8 y1oo9lI9MBT4KDqJSc4PhHUGLRdRh/oOZMhFw4JHfdDysMEznrqM9KLv85Dgb+wg3/3Q= X-Gm-Gg: AYBFou2+coXoMed4mDCsCB/KWk1MIZuMVMtGBVyX8zBmx4sepU5nuOHs8OZ1fIwFAHH 87JZp9cFVTq1LxldTk7KnmOeGaNllPRujxHYnmqTkVBND3/mx9mqO9PGIePJ9nfOVq8BODngptx TbICjMHhZNFHtLOqVUOVjHfbEOAKopPBRwgUSMd1Kjm44fCe7v3zCgQaPBe2zr735b+EbiTZezv WFA+FngIRITzf7YzNZaXpC8JWMOhpILbnVkgRUA5cN60+EgR59YIKby2/Vwb18nXKquG6HQaN6H qyZEWOLL3UYnj9Xii5cMD7z6rpKmxhAFji2gYHOaJCuBNOLxnoiavnrHYbviceljoBKIAoynWrT fWwSAWD8eSCTl1Q== X-Received: by 2002:a05:620a:688a:b0:939:6dfa:495b with SMTP id af79cd13be357-93bdc8c795fmr358647085a.52.1789737583767; Fri, 18 Sep 2026 06:19:43 -0700 (PDT) X-Received: by 2002:a05:620a:688a:b0:939:6dfa:495b with SMTP id af79cd13be357-93bdc8c795fmr358639285a.52.1789737582864; Fri, 18 Sep 2026 06:19:42 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49fc7cebae2sm48254015e9.8.2026.09.18.06.19.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 06:19:41 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bard Liao , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek Cc: linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, patches@opensource.cirrus.com, Srinivas Kandagatla Subject: [PATCH v4 8/8] ASoC: codecs: add Qualcomm Tambora (WCD9378) SDCA codec Date: Fri, 18 Sep 2026 14:19:13 +0100 Message-ID: <20260918131914.681588-9-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918131914.681588-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260918131914.681588-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-Info: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfX/PLIVRbCQsTg m+26ScN8jJDFC3ZGBBkqjuzzgrlIHTN3LIy6t05n7HNLydCn1bioHEBPFELTizqBZ21GwYzN9Tv xvLb/SwC+t/YC9n+reo98xon6XKeH58= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4OSBTYWx0ZWRfXxqpHp+hFj6OX 7O9izgRFsk74bI1rSlu3TFR6h5KWXJ/5K693fAPMD54MhTfvvBG/L80D4GqJ5OVlnjtqYr+UsXu BwR8y2ukPNAB+KTutAFVQjkTwnmP/zGixdHuvmUuJLgVXNdtbLCW+SVsOdge3AWadyiWsQAfgQf dyqnzfJYAKrf61Ql7GubFrTiBexqZ6hy8UgAF01ylkJ4jTQMBkTEd7O1bunjudXPkU3XBkNmPz3 6xNBbXP0sNtkxDGa6mZDC66dtPuA2S5NKWm5S6MDMDFE8iA3EKefzy9gPCjuXFU/S74REqf0Lcv NYzg4QrS7Sbq2249xGije757DwOKi2vy0PYHHwVFB7m4mUNh0558uC4I/g9dMWM4kYqm9QGbi+P K8sBh2jJaGW2hFvNSQQSHTo4Buz6h8/A4xiuLVTv4vr69NhYyD2qA1nr2DRgXbMbfmGse6tYOGq RN8fkMhKfikcBc3EpEQ== X-Proofpoint-GUID: 8X9Lp0XLJFbtTaRocdqtt4RPD92j2Qls X-Proofpoint-ORIG-GUID: 8X9Lp0XLJFbtTaRocdqtt4RPD92j2Qls X-Authority-Analysis: v=2.4 cv=R+mWitRX c=1 sm=1 tr=0 ts=6aad3a72 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=Fo3qPETqG8zvJd-ZIJEA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=O8hF6Hzn-FEA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 bulkscore=0 impostorscore=0 clxscore=1015 spamscore=0 suspectscore=0 malwarescore=0 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180189 Add support for the Qualcomm Tambora (WCD9378) headset codec in SDCA mode over SoundWire. On ARM/DT platforms without ACPI/DisCo firmware the SDCA topology and SoundWire port properties are supplied as static data through the codec driver. The codec exposes a single SimpleJack SDCA Function providing: - Headphone playback via FU 6 (mute + Q7.8 volume) and OT 43/45. - Headset mic capture via IT 33 with MICB2 bias derived from DT (qcom,micbias2-microvolt). - MBHC-based headset jack detection. Implements: - sdw_slave_ops.read_prop: SoundWire slave properties and dpn caps for the compute-mode dataports. - sdca_class_hw_ops.populate_function: fills the SDCA Function data (entities, clusters, init_table) from static tables and patches the IT 33 MIC_BIAS default with the DT-derived per-slave value. Binds SoundWire slave id 0x0217:0x0110 when qcom,compute-mode is set on the DT node. Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Srinivas Kandagatla --- sound/soc/codecs/Kconfig | 11 + sound/soc/codecs/Makefile | 2 + sound/soc/codecs/wcd9378-sdca.c | 1058 +++++++++++++++++++++++++++++++ sound/soc/codecs/wcd9378-sdca.h | 20 + sound/soc/codecs/wcd9378-sdw.c | 51 ++ 5 files changed, 1142 insertions(+) create mode 100644 sound/soc/codecs/wcd9378-sdca.c create mode 100644 sound/soc/codecs/wcd9378-sdca.h create mode 100644 sound/soc/codecs/wcd9378-sdw.c diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index e78d725e61e2..4191fe244151 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -2540,6 +2540,17 @@ config SND_SOC_WCD939X_SDW The WCD9390/9395 is a audio codec IC Integrated in Qualcomm SoCs like SM8650. =20 +config SND_SOC_WCD9378_SDCA + tristate "Qualcomm Tambora (WCD9378) SDCA codec" + depends on SOUNDWIRE + depends on SND_SOC_SDCA_CLASS + 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_WM0010 tristate depends on SPI_MASTER diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index 9287a602d41e..2a6b3168a410 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -368,6 +368,7 @@ snd-soc-wcd938x-y :=3D wcd938x.o snd-soc-wcd938x-sdw-y :=3D wcd938x-sdw.o snd-soc-wcd939x-y :=3D wcd939x.o snd-soc-wcd939x-sdw-y :=3D wcd939x-sdw.o +snd-soc-wcd9378-y :=3D wcd9378-sdw.o wcd9378-sdca.o snd-soc-wm-adsp-y :=3D wm_adsp.o snd-soc-wm-adsp-test-y :=3D wm_adsp_fw_find_test.o snd-soc-wm0010-y :=3D wm0010.o @@ -823,6 +824,7 @@ ifdef CONFIG_SND_SOC_WCD939X_SDW # avoid link failure by forcing sdw code built-in when needed obj-$(CONFIG_SND_SOC_WCD939X) +=3D snd-soc-wcd939x-sdw.o endif +obj-$(CONFIG_SND_SOC_WCD9378_SDCA) +=3D snd-soc-wcd9378.o obj-$(CONFIG_SND_SOC_WM0010) +=3D snd-soc-wm0010.o obj-$(CONFIG_SND_SOC_WM1250_EV1) +=3D snd-soc-wm1250-ev1.o obj-$(CONFIG_SND_SOC_WM2000) +=3D snd-soc-wm2000.o diff --git a/sound/soc/codecs/wcd9378-sdca.c b/sound/soc/codecs/wcd9378-sdc= a.c new file mode 100644 index 000000000000..f1f94c13cba5 --- /dev/null +++ b/sound/soc/codecs/wcd9378-sdca.c @@ -0,0 +1,1058 @@ +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) +// Copyright (c) 2025 Qualcomm Technologies, Inc. All rights reserved. + +/* + * WCD9378 (Tambora) SDCA SimpleJack codec. Supplies the static SDCA + * topology on DT platforms where no ACPI/DisCo enumeration exists. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "wcd9378-sdca.h" + +struct wcd9378_priv { + struct sdca_class_drv class; +}; + +static struct sdca_entity wcd9378_sdca_entities[]; +/* + * Entity array index map. Order matches the ASL entity-id-list; + * Function (Entity 0) is last. + * + * [0] E001 IT 41 (0x1) [12] E00F IT 33 (0xF) + * [1] E002 CS 41 (0x2) [13] E010 PDE 34 (0x10) + * [2] E003 MFPU 21 (0x3) [14] E011 FU 33 (0x11) + * [3] E004 XU 42 (0x4) [15] E012 SU 35 (0x12) + * [4] E007 SU 43 (0x7) [16] E013 XU 36 (0x13) + * [5] E008 SU 45 (0x8) [17] E015 CS 36 (0x15) + * [6] E009 PDE 47 (0x9) [18] E016 OT 36 (0x16) + * [7] E00A OT 43 (0xA) [19] E017 MFPU 236 (0x17) + * [8] E00B OT 45 (0xB) [20] E018 CS 236 (0x18) + * [9] E00C GE 35 (0xC) [21] E019 OT 236 (0x19) + * [10] E00D IT 131 (0xD) [22] E006 FU 6 (0x6) + * [11] E00E CS 131 (0xE) [23] 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 +#define QSJ_FU6 22 + +/* Range data: {cols, rows, data[cols*rows]}, transcribed from ASL. */ + +/* IT 41 Usage: HIFI (0x2). ULP (0x3) does not route to the HPH analog dri= ver. */ +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, +}; + +static u32 range_it41_cluster_data[] =3D { 0x1, 0x1 }; + +/* IT 41 DataPort selector: DP6 (HPH render). */ +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 +}; + +/* CS 41 SampleRateIndex: 1 -> 48kHz PCM. */ +static u32 range_cs41_sr_data[] =3D { 0x1, 0xBB80 }; + +/* SU selector: disconnected / connected. */ +static u32 range_su_sel_data[] =3D { 0x0, 0x1 }; + +/* PDE Requested_PS: PS0 / PS3. */ +static u32 range_pde_req_ps_data[] =3D { 0x0, 0x3 }; + +/* + * GE 35 SelectedMode -> terminal type. + * + * Tambora MBHC only handles mechanical detection; ADC HP/HS + * discrimination is not implemented, so modes 0 (Unplugged) and 1 + * (Unknown) are aliased to Headphone (mode 4) to keep the DAPM path + * alive. Mode 2 (Line-out) is not fitted on this board. + */ +static u32 range_ge35_mode_data[] =3D { + 0x0, 0x6C0, /* Unplugged -> HPH (alias) */ + 0x1, 0x6C0, /* Unknown -> HPH (alias) */ + 0x3, 0x6D0, /* Headset */ + 0x4, 0x6C0, /* Headphone */ +}; + +/* IT 131 Usage: optimization render stream at 192kHz. */ +static u32 range_it131_usage_data[] =3D { + 0x3, 0x334, 0x2EE00, 0x8, 0x0, 0x0, 0x0, +}; + +static u32 range_it131_cluster_data[] =3D { 0x1, 0x3 }; + +/* IT 131 DataPort selector: 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 +}; + +/* CS 131 SampleRateIndex: 1 -> 192kHz. */ +static u32 range_cs131_sr_data[] =3D { 0x1, 0x2EE00 }; + +/* IT 33 MIC_BIAS default: 2.75V (patched per-slave in populate_function).= */ +static u32 range_it33_micbias_data[] =3D { 0x5 }; + +static u32 range_it33_usage_data[] =3D { + 0x1, 0x2C6, 0x0, 0x0, 0x0, 0x0, 0x0, +}; + +static u32 range_it33_cluster_data[] =3D { 0x1, 0x2 }; + +static u32 range_cs36_sr_data[] =3D { 0x1, 0xBB80 }; + +/* OT 36 Usage: PDM capture, host-visible 48kHz/16-bit PCM. */ +static u32 range_ot36_usage_data[] =3D { + 0x1, 0x2C6, 0xBB80, 0x10, 0x0, 0x0, 0x0, +}; + +/* OT 36 DataPort selector: DP2. */ +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 +}; + +static u32 range_cs236_sr_data[] =3D { 0x1, 0xBB80 }; + +/* OT 236 Usage: optimization capture at 192kHz (clocked by CS 131). */ +static u32 range_ot236_usage_data[] =3D { + 0x1, 0x334, 0x2EE00, 0x8, 0x0, 0x0, 0x0, +}; + +/* OT 236 DataPort selector: DP5. */ +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 +}; + +/* 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 }; + +/* IT 33 MIC_BIAS: fixed 2.75V (SDCA MIC_BIAS index 0x5), reapplied by PDE= 34. */ +static int ctrl_it33_micbias_vals[] =3D { 0x5 }; +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_bypass_vals[] =3D { 0x1 }; +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 SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_COMMIT_GROUP_MASK_NAME }, + { .sel =3D 0x4, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .values =3D ctrl_fun_sdca_ver_vals, .has_fixed =3D true, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_FUNCTION_SDCA_VERSION_NAME }, + { .sel =3D 0x5, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .values =3D ctrl_fun_type_vals, .has_fixed =3D true, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_FUNCTION_TYPE_NAME }, + { .sel =3D 0x6, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .values =3D ctrl_fun_man_id_vals, .has_fixed =3D true, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_FUNCTION_MANUFACTURER_ID_NAME }, + { .sel =3D 0x7, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .values =3D ctrl_fun_id_vals, .has_fixed =3D true, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_FUNCTION_ID_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .values =3D ctrl_fun_ver_vals, .has_fixed =3D true, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_FUNCTION_VERSION_NAME }, + { .sel =3D 0x9, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_FUNCTION_EXTENSION_ID_NAME }, + { .sel =3D 0xA, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_FUNCTION_EXTENSION_VERSION_NAME }, + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_RW1C, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .is_volatile =3D true, .label =3D SDCA_CTL_FUNCTION_STATUS_NAME }, + { .sel =3D 0x11, .mode =3D SDCA_ACCESS_MODE_RW1S, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_FUNCTION_ACTION_NAME }, + { .sel =3D 0x2C, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_DEVICE_MANUFACTURER_ID_NAME }, + { .sel =3D 0x2D, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_DEVICE_PART_ID_NAME }, + { .sel =3D 0x2E, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_DEVICE_VERSION_NAME }, + { .sel =3D 0x2F, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS= _LAYER_CLASS, .cn_list =3D 0x1, + .values =3D ctrl_dev_sdca_ver_vals, .has_fixed =3D true, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_it41_usage_d= ata }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_CLUSTERINDEX_NAME }, + { .sel =3D 0x11, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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= }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_LA= YER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_LA= YER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_BYPASS_NAME }, + { .sel =3D 0x7, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS_LA= YER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_LA= YER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 = }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 = }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_SELECTOR_NAME }, +}; + +/* + * PDE 47 manages the HPH render path (OT 43, OT 45). FU 6 is listed + * so its cached mute/volume are reasserted on PS0 entry. + */ +static struct sdca_entity *entity_pde47_managed[] =3D { + &wcd9378_sdca_entities[QSJ_FU6], + &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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .is_volatile =3D true, .label =3D SDCA_CTL_ACTUAL_PS_NAME }, + /* + * HPH protection IRQs (OCP/CNP/SURGE) fire in codec HW but are + * not exposed to Linux; needs an SDCA framework interface for + * standalone status-bit IRQs. Wire up in a follow-up. + */ +}; + +/* OT 43 (Headphone), OT 45 (Headset): no controls. */ +static struct sdca_entity *entity_ot43_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_IT41] }; +static struct sdca_entity *entity_ot45_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_IT41] }; + +/* + * GE 35 mode -> SU selector. Modes 0/1 alias to Headphone (see + * range_ge35_mode_data). SU 45 =3D source 1 (XU 42) for HPH paths, + * SU 43 =3D source 1 (XU 42) for Headset. + */ +static struct sdca_ge_control ge35_mode0_controls[] =3D { + { .id =3D 0x8, .sel =3D 0x1, .cn =3D 0x0, .val =3D 0x1 }, +}; + +static struct sdca_ge_control ge35_mode1_controls[] =3D { + { .id =3D 0x8, .sel =3D 0x1, .cn =3D 0x0, .val =3D 0x1 }, +}; + +static struct sdca_ge_control ge35_mode3_controls[] =3D { + { .id =3D 0x7, .sel =3D 0x1, .cn =3D 0x0, .val =3D 0x1 }, +}; + +static struct sdca_ge_control ge35_mode4_controls[] =3D { + { .id =3D 0x8, .sel =3D 0x1, .cn =3D 0x0, .val =3D 0x1 }, +}; + +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 SDCA_ACCESS_LA= YER_CLASS, .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 SDCA_ACCESS_LA= YER_CLASS, .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 }, +}; + +static struct sdca_control entity_it131_controls[] =3D { + { .sel =3D 0x4, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_it131_usage_= data }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_CLUSTERINDEX_NAME }, + { .sel =3D 0x11, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_MIC_BIAS_NAME }, + { .sel =3D 0x4, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_it33_usage_d= ata }, + .has_reset =3D true, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .is_volatile =3D true, .label =3D SDCA_CTL_ACTUAL_PS_NAME }, +}; + +/* + * FU 6 (vendor FU42): HPH mute + Q7.8 volume. DUAL-mode CVR-alias + * writes take effect without an SCP_COMMIT. + */ +/* + * FU 6 volume range: MIN, MAX, STEP in Q7.8 (LSB =3D 1/256 dB). + * 0x8000 =3D -128 dB, 0x7FFF =3D +127.996 dB, STEP =3D 1. Framework + * sign-extends and converts to 0.01 dB TLV via (val * 100) >> 8. + */ +static u32 range_fu6_vol_data[] =3D { + 0x00008000, 0x00007FFF, 0x00000001, +}; + +static struct sdca_control entity_fu6_controls[] =3D { + { .sel =3D SDCA_CTL_FU_MUTE, .mode =3D SDCA_ACCESS_MODE_DUAL, + .layers =3D SDCA_ACCESS_LAYER_USER, .cn_list =3D 0x6, .nbits =3D 1, + .type =3D SDCA_CTL_DATATYPE_ONEBIT, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_MUTE_NAME }, + { .sel =3D SDCA_CTL_FU_CHANNEL_VOLUME, .mode =3D SDCA_ACCESS_MODE_DUAL, + .layers =3D SDCA_ACCESS_LAYER_USER, .cn_list =3D 0x6, .nbits =3D 16, + .type =3D SDCA_CTL_DATATYPE_Q7P8DB, + .range =3D { .cols =3D SDCA_VOLUME_LINEAR_NCOLS, .rows =3D 1, + .data =3D range_fu6_vol_data }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_CHANNEL_VOLUME_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 SDCA_ACCESS_LA= YER_CLASS, .cn_list =3D 0x1, + .range =3D { .cols =3D 0x1, .rows =3D 0x2, .data =3D range_su_sel_data = }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 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 SDCA_ACCESS_LA= YER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_LA= YER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_LA= YER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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= }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_SAMPLERATEINDEX_NAME }, +}; + +/* OT 36 mic capture: IT33 -> FU33 -> SU35 -> XU36 -> OT36. */ +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 SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_ot36_usage_d= ata }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_LA= YER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .range =3D { .cols =3D 0x7, .rows =3D 0x1, .data =3D range_ot236_usage_= data }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_USAGE_NAME }, + { .sel =3D 0x8, .mode =3D SDCA_ACCESS_MODE_DC, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .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 SDCA_ACCESS_L= AYER_CLASS, .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 }, + .interrupt_position =3D SDCA_NO_INTERRUPT, + .label =3D SDCA_CTL_DATAPORT_SELECTOR_NAME }, +}; + +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 }, + /* E006: FU 6 (FU42) - vendor Feature Unit; HPH mute + Q7.8 volume. */ + { .id =3D 0x6, .label =3D "FU 6", .type =3D SDCA_ENTITY_TYPE_FU, + .num_controls =3D ARRAY_SIZE(entity_fu6_controls), .controls =3D entity= _fu6_controls }, + /* 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 transcribed from ASL. */ +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) */ + { .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 */ + /* Arms MBHC: jack insertion asserts SDCA_4 (GE_DETECTED_MODE). */ + { .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 */ + /* Only SDCA_4 unmasked; protection IRQs stay masked. */ + { .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 */ + /* + * L_DET_EN is left disabled: asserting SDCA_4 before the machine + * card registers the jack blocks 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 */ +}; + +/* Vendor SCP register: host clock divide-by-2 (bank 1 shadow). */ +#define WCD9378_SCP_HOST_CLK_DIV2_CTL_B1 0xF0 + +/* Slave ports 1..8, mapped to master ports via qcom,port-mapping. */ +#define WCD9378_SDCA_MAX_PORTS 8 + +static const char * const wcd9378_sdca_supplies[] =3D { + "vdd-buck", "vdd-rxtx", "vdd-io", "vdd-mic-bias", +}; + +int wcd9378_sdca_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 sdw_slave_read_prop(slave); + if (ret) + return ret; + + prop->use_domain_irq =3D true; + prop->scp_int1_mask =3D SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY | + SDW_SCP_INT1_IMPL_DEF; + + /* Compute-mode fixed SoundWire slave properties (not described in DT) */ + 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; + + ret =3D device_property_read_u32_array(dev, "qcom,port-mapping", + &slave->m_port_map[1], + WCD9378_SDCA_MAX_PORTS); + if (ret) + return dev_err_probe(dev, ret, "qcom,port-mapping missing\n"); + + return 0; +} + +static int wcd9378_sdca_populate_function(struct sdw_slave *slave, + struct sdca_function_data *function) +{ + /* @function->desc is already set by the framework; fill payload only. */ + if (function->desc->type !=3D wcd9378_sdca_desc.type) + return -EINVAL; + + function->num_entities =3D wcd9378_sdca_data.num_entities; + function->entities =3D wcd9378_sdca_data.entities; + function->num_clusters =3D wcd9378_sdca_data.num_clusters; + function->clusters =3D wcd9378_sdca_data.clusters; + function->num_init_table =3D wcd9378_sdca_data.num_init_table; + function->init_table =3D wcd9378_sdca_data.init_table; + function->reset_max_delay =3D wcd9378_sdca_data.reset_max_delay; + + /* Elevate is_volatile / has_reset to match the DisCo/ACPI path. */ + sdca_apply_default_control_classifiers(function); + + return 0; +} + +static const struct sdca_class_ops wcd9378_sdca_class_ops =3D { + .populate_function =3D wcd9378_sdca_populate_function, +}; + +int wcd9378_sdca_probe(struct sdw_slave *slave, + const struct sdw_device_id *id) +{ + struct device *dev =3D &slave->dev; + struct sdca_device_data *data =3D &slave->sdca_data; + struct wcd9378_priv *priv; + struct gpio_desc *reset; + int ret; + + /* + * 0x0217:0x0110 covers both mobile (non-SDCA) and SDCA-compliant + * fuse variants. Only SDCA-compliant nodes bind to this driver; + * mobile-mode nodes are handled by a different driver. + */ + if (!device_property_read_bool(dev, "qcom,sdca-compliant")) + return -ENODEV; + + priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + dev_set_drvdata(dev, priv); + + /* No SPMI parent: supplies and reset live on the SoundWire DT node. */ + 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); + usleep_range(20, 30); + gpiod_set_value(reset, 0); + usleep_range(20, 30); + } + + /* SCP writes below need the slave attached. */ + ret =3D sdw_slave_wait_for_init(slave, 5000); + if (ret) + return dev_err_probe(dev, ret, + "slave attach timeout: %d\n", ret); + + /* + * TX PDM clock: bank-1 shadow + SCP_COMMIT. SCP survives PDE + * cycles; one-shot before any port is enabled. + */ + 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); + + /* DT has no DisCo enumeration; seed the descriptor here. */ + if (!data->num_functions) { + data->function[0].type =3D wcd9378_sdca_desc.type; + data->function[0].adr =3D wcd9378_sdca_desc.adr; + data->function[0].name =3D wcd9378_sdca_desc.name; + data->num_functions =3D 1; + } + + return sdca_class_probe(slave, &priv->class, &wcd9378_sdca_class_ops); +} + +void wcd9378_sdca_remove(struct sdw_slave *slave) +{ + struct wcd9378_priv *priv =3D dev_get_drvdata(&slave->dev); + + sdca_class_remove(&priv->class); +} + +int wcd9378_sdca_runtime_suspend(struct device *dev) +{ + struct wcd9378_priv *priv =3D dev_get_drvdata(dev); + + return sdca_class_runtime_suspend(&priv->class); +} + +int wcd9378_sdca_runtime_resume(struct device *dev) +{ + struct wcd9378_priv *priv =3D dev_get_drvdata(dev); + + return sdca_class_runtime_resume(&priv->class); +} + +int wcd9378_sdca_system_suspend(struct device *dev) +{ + struct wcd9378_priv *priv =3D dev_get_drvdata(dev); + + return sdca_class_system_suspend(&priv->class); +} + +int wcd9378_sdca_system_resume(struct device *dev) +{ + struct wcd9378_priv *priv =3D dev_get_drvdata(dev); + + return sdca_class_system_resume(&priv->class); +} + +/* SoundWire slave-driver plumbing lives in wcd9378-sdw.c. */ diff --git a/sound/soc/codecs/wcd9378-sdca.h b/sound/soc/codecs/wcd9378-sdc= a.h new file mode 100644 index 000000000000..6ddae9da395b --- /dev/null +++ b/sound/soc/codecs/wcd9378-sdca.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ +/* Copyright (c) 2025 Qualcomm Technologies, Inc. */ + +#ifndef _WCD9378_SDCA_H +#define _WCD9378_SDCA_H + +#include +#include + +int wcd9378_sdca_probe(struct sdw_slave *slave, + const struct sdw_device_id *id); +void wcd9378_sdca_remove(struct sdw_slave *slave); +int wcd9378_sdca_read_prop(struct sdw_slave *slave); + +int wcd9378_sdca_runtime_suspend(struct device *dev); +int wcd9378_sdca_runtime_resume(struct device *dev); +int wcd9378_sdca_system_suspend(struct device *dev); +int wcd9378_sdca_system_resume(struct device *dev); + +#endif /* _WCD9378_SDCA_H */ diff --git a/sound/soc/codecs/wcd9378-sdw.c b/sound/soc/codecs/wcd9378-sdw.c new file mode 100644 index 000000000000..52295e7646cf --- /dev/null +++ b/sound/soc/codecs/wcd9378-sdw.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) +// Copyright (c) 2025 Qualcomm Technologies, Inc. + +/* + * WCD9378 (Tambora) SoundWire driver glue for the SDCA compute-mode + * codec. The SDCA topology and hardware-specific probe logic live in + * wcd9378-sdca.c; this file carries the SoundWire slave driver plumbing + * and the module boilerplate. + */ + +#include +#include +#include +#include +#include +#include "wcd9378-sdca.h" + +static const struct dev_pm_ops wcd9378_sdw_pm_ops =3D { + SYSTEM_SLEEP_PM_OPS(wcd9378_sdca_system_suspend, + wcd9378_sdca_system_resume) + RUNTIME_PM_OPS(wcd9378_sdca_runtime_suspend, + wcd9378_sdca_runtime_resume, NULL) +}; + +static const struct sdw_slave_ops wcd9378_sdw_ops =3D { + .read_prop =3D wcd9378_sdca_read_prop, +}; + +static const struct sdw_device_id wcd9378_sdw_id[] =3D { + SDW_SLAVE_ENTRY(0x0217, 0x0110, 0), + { } +}; +MODULE_DEVICE_TABLE(sdw, wcd9378_sdw_id); + +static struct sdw_driver wcd9378_sdw_driver =3D { + .driver =3D { + .name =3D "wcd9378", + .pm =3D pm_ptr(&wcd9378_sdw_pm_ops), + }, + .probe =3D wcd9378_sdca_probe, + .remove =3D wcd9378_sdca_remove, + .id_table =3D wcd9378_sdw_id, + .ops =3D &wcd9378_sdw_ops, +}; +module_sdw_driver(wcd9378_sdw_driver); + +MODULE_DESCRIPTION("Qualcomm WCD9378 (Tambora) SoundWire codec"); +MODULE_AUTHOR("Qualcomm Technologies, Inc."); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_IMPORT_NS("SND_SOC_SDCA"); +MODULE_IMPORT_NS("SND_SOC_SDCA_CLASS"); --=20 2.53.0