From nobody Fri Sep 25 07:22:50 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 A0C584B5CC9 for ; Tue, 15 Sep 2026 16:57:16 +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=1789491439; cv=none; b=HXJhpnxar5wOIyKBO85yV9YmbzUDVTxTpcUJaRnBJHv5qq8fQ98PBEqWWNE41aqpejk2I4+/aXgnNi/BS5Zgh1tx8wREoCTvRpv6apzuubA6AX+r69b8PUVC9kK7tOjm2mrL22N4R/ccxe39vXfmFzbvEUBkGx1PqGd5usRntLA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789491439; c=relaxed/simple; bh=/FBOEcDQA091aAhbqoTJr44HTdfwyetl/ojJwn6bogI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jCpwUff5titZ8VZfvGGle/I6M6bf6cpu9lWL1ytOklsMSeA5D4dqEby/p3kFZbb5fS1toR2PJib1canNyU0wj1LHIdDwPolOiOzVQo2Xdi6xKjEmCPyLlQ71VJs3KgxJ4pv2tjpGqOjjvCM31tPjr/xUzzuRBe2Pvk5kvXhbSWM= 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=RT/AzVGv; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=PaFsRKXT; 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="RT/AzVGv"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="PaFsRKXT" 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 68FFAQRV813414 for ; Tue, 15 Sep 2026 16:57:15 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=8Lm+uA5NKEI 6jw1avVSpizSsQr8c+IrE83JBco1rBMo=; b=RT/AzVGvExfRCLvD5LkfYIpedAb 4jlBnkocelYc2Znmdcnc2OwlDZNIszdUAoc2kqFp4Xr40xY46tTaUAyYjCbQVaL9 263fBWi8kXoFo/uHzORxi3PTHiELaULDtCxRRxFT8vHVlWHTQxcLlPb0XnCmglUm deoAA73XHjstEVF0akic1CRHC3L8JYVYiJBDHu0MRwtEcbb9NpPulDG7HnOC2m2+ uvA80WqkWxSZePqRpS/PyvfS5dm1FAhxiRFMEu7keiRzRt3KVJR6Sno48z8Gij7U 8isDMSX4WdixG9t7hQ/0URV+a3JFE9QfIUc5ToOw+0YQTAusxw34rJl6R1A== Received: from mail-vs1-f70.google.com (mail-vs1-f70.google.com [209.85.217.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gq6kc1bh1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 16:57:15 +0000 (GMT) Received: by mail-vs1-f70.google.com with SMTP id ada2fe7eead31-790376c9f8cso1192499137.1 for ; Tue, 15 Sep 2026 09:57:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789491435; x=1790096235; 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=8Lm+uA5NKEI6jw1avVSpizSsQr8c+IrE83JBco1rBMo=; b=PaFsRKXTVQWmo8buwxCl29L3YFVjghKmcYRQIGF0/yYz/z7Y6L52zsFylHfgs3ANDN j8XijWskPp9BXGr8dYjeYuZMNrfxX5KcDGlX92HPKmam5z1CHoxIgTfvLkZ2g88ZCOxA 8I+KegLKgeRHdq/83dcGw3RZn90idpcmcW8O8gNOAyWHaObsxUzsLxTQopw2BbgnnUmf brGcFGAlHzGo/GCLsEF7LW1Edbxjf/lp926GlzKmM90NBG8IyTXvVn2yZvyI5iz/2Uqh CZTy5c1rHKiOulb6sr1HSGuijyWO9ND+k/zETDDa3r6vVmj3sbAzUZwe2uUcnqg7B9Nj 0IKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789491435; x=1790096235; 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=8Lm+uA5NKEI6jw1avVSpizSsQr8c+IrE83JBco1rBMo=; b=XvtSH5YN+lNDNl+E5IsjuHOInuJkKyzzSADRhuJ4UGmLnxWPFyR0ctglP3y37kvD1y L2v3vX3PsPVqPOVkSbj8JbGJQcatoQEwKRajSHhKCqhdLqSLtokHPWC9BdGM6RdaAoc7 sjSvVUqPiHxLqRgTOYai7j21Qb6LmmGEI6S4PaJjMXkmziVpFEXRLYLOatHd33fpmf6g bfgL81DoWBWZNh08J4yFbFuEDBNmeF3lwdnLV3XPjlLyIFA8t8SpL9lCqXs5BankfLaM DWbS+iMiBylyjPAuPHuTC1guNkNBYxTC1HTCxdDGAV1mwzITrXVzIpj5+fcNFYGvIFGG LYLQ== X-Forwarded-Encrypted: i=1; AKwUvBxn90BCOMxvMrv5cWxgd40zoVMCRWKGSKtJ+yrSeK+E4rdHjnFNB4kHcfKyjqoGdhCzAm9XxtPJWkmXnqc=@vger.kernel.org X-Gm-Message-State: AFuF++m5dvlYj/zM74g/rnwDvusGusH1eHTYw5wsz6eoHv/CunM2j1oR OUBo9TDh5DO15r6szVZNn4Esb1ixbDIQHGL9+MlABomLFV0bVSn5+PGl1JgR9zQH6LPWnePEqBu 4Q749ksZgFn5PF3gilDE8JwC7IsJr5IvrSny+ilvbU2L7XSRKHEZPRkyqI9jQkcZp5SA= X-Gm-Gg: AYBFou1BIHf1pMb+EmowNqx/Z55bhMHIbDKbxTjE+r5uCsTfY3YmdRxm2nEwfotU2+s N4fpLo7LtTnA7KlXXyaK4Cdsnek5PeNBxoQPvZSWQ1G6z2jUVYUUBWf/F7gwlZHHSvJyny5hHGJ 3QeLkupeS0Sb93RT2QGhFNzLYKJdkR7rd0QPA+1DYHMTCPFlsf97Vjd01n4DrocLchJz5k85ycr psZLmS7popiicB2e5pzySOkXo8fkVxGv3+SGf/1TffW3X5M57ludKiYzgv+KrGrPAPmvv0PBdhW AndRnXwpI8R4eHYiQfqB51Xqkk+R3XQhW12KhWCKuvQEbGbazXc9+S6EUAsP17hCYFN0/WAAuEG zLHvSdAcpxmhNgA== X-Received: by 2002:a05:6102:50ab:b0:784:b9ec:910b with SMTP id ada2fe7eead31-79b5caf1b6dmr9011816137.12.1789491434601; Tue, 15 Sep 2026 09:57:14 -0700 (PDT) X-Received: by 2002:a05:6102:50ab:b0:784:b9ec:910b with SMTP id ada2fe7eead31-79b5caf1b6dmr9011719137.12.1789491434035; Tue, 15 Sep 2026 09:57:14 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49e83d9057dsm4361335e9.3.2026.09.15.09.57.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:57:13 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown Cc: Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek , Bard Liao , Rob Herring , Krzysztof Kozlowski , Conor Dooley , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v3 1/8] ASoC: SDCA: allow building without ACPI Date: Tue, 15 Sep 2026 17:56:43 +0100 Message-ID: <20260915165652.914893-2-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260915165652.914893-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260915165652.914893-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: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfXzrDQZONA4rk/ /F5uZ9zcnaLiBXEY2XdHLqX+/QAs1Mwbg9M1eWHDXSTU1U5XmN4pNaQ8pVZZhezkVApPLzsc/Rq Eu+g9nJoCoaQlsTN/JPAoZLx4vIru0c= X-Proofpoint-GUID: iWmRAPYrMNHpLqM7gZt5k0FGd34vX4Wb X-Authority-Analysis: v=2.4 cv=ZINCCn7b c=1 sm=1 tr=0 ts=6aa978eb cx=c_pps a=N1BjEkVkxJi3uNfLdpvX3g==: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=QBLm4htSTobWmsIIepQA:9 a=crWF4MFLhNY0qMRaF8an:22 X-Proofpoint-ORIG-GUID: iWmRAPYrMNHpLqM7gZt5k0FGd34vX4Wb X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX5JQ8ljblYRRu NPkg0/ksOQcqD2rJBBI4PTZygNas0wqAAcYGmD9p93aqQgVq9yeXTDAFj57S3wpW9wP47m0cDKz nL5jIqqWYa+2Og5O25lVsaUMIj0xPwtFrRmDkQjvAXMZ6GqfSDY6qbLFI3TcvecujmfQUpUlQZ/ zNnQ+bTcQhYXrTDnqIVB/uxMw/7yRoQhNo6lWH7I4A6N4G1AD6hW7m23AILfYp8DGkSyBI7ViXs 9GC5p1ATG2rtBq8AppcJp/reYNx331ANU3ZxBwGwek7DI+7zUbO4KIJMV4jufjA9mZNr0rl1n/+ lGBdm3CeuG2PxEC0TwNsulaIbAppVbSlpDnuUXJhL2trIeEmmVCoI/ZITwA0xHle5xm2vfk6rVY hho6r/T5eDPXwaIcWSn4ybjQGflkovr5gcvLi5OLPAwmDO/WAreY/lW1QHbWhCVFr4p/4E8MvI/ 4cH9tAaqVP7QppyOO+Q== 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-15_04,2026-09-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 bulkscore=0 phishscore=0 priorityscore=1501 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150247 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_ops.populate_function. 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_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 b55e3ad8ea34..6eb0e1059dbd 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 Fri Sep 25 07:22:50 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 58CE84BA1D3 for ; Tue, 15 Sep 2026 16:57:18 +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=1789491442; cv=none; b=VDikRAhyYgClAnRsz/GHI7G6RqPBxmQgnwPYLUx+4EFMikaEJV2SqCykLmU0sLtAGCUTWiCkLCROTZmsiUngcQE/skc6Q0I3oKzyOetM684YfZ4zfmpBCy4uwXA5G4BWeGi9KKISR04hLFLHFPZid6igLvU5MLv07SRQZQ7iNuc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789491442; c=relaxed/simple; bh=YC5jeRdrV0bVaeAY8A16IgiStDL4XyHSM0tG/acNG/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oLQQ9at/NuYgc3g9dlzifztK3UJWqmxahHmkq+aFnmizpJb+pVsxBup+RhV6z1mTV0OzCvhmWaSOZvsCYvscuYpuMUktQue5R4JmcsyE4mdcPFK6uTsrbNtFTl8PLvNPm9ziVGlfQ9aSO/B5lOnzrJMchV0zMzg4UyTd1RzdLvg= 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=UFa/l6Ef; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=WerAeHsM; 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="UFa/l6Ef"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="WerAeHsM" 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 68FFAOUt813396 for ; Tue, 15 Sep 2026 16:57:17 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=IKUPurXyGjX q2dDSy5YrqbSiwRoZ8osae4bp8uljdHc=; b=UFa/l6Efa8gd5wsCEmc4zF6cz9i Wmn4icxVAIL2zCFuk0TJiArnAFGsh5risvSaPddWEE7QQTKy6neOzPmfSlo1DdU6 R8Qn3cIuBBAatdC4NwRiA5fcd2nj3EhEZMwl904mf/SFJD0D39hetapiirCfkIpB 9paHMRtjD9l8dJ9yJuKlxwzBpeAnANwkNikHu3mAf2/E2v9qdcr6pZ2w6rwKnczO MiP7TgHrVn+YRRdUPHKzwmWgVi/AWFjhdnw12chCBtOEzEYhbimggUvhuq+4Vvyh Z8Zrfh/F5dNndnovPGzKJzwB0JPkGDc3e+AusN+sxePMSsINmMr95S3Qz3Q== Received: from mail-vs1-f72.google.com (mail-vs1-f72.google.com [209.85.217.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gq6kc1bha-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 16:57:17 +0000 (GMT) Received: by mail-vs1-f72.google.com with SMTP id ada2fe7eead31-78f2fe53829so4020513137.2 for ; Tue, 15 Sep 2026 09:57:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789491436; x=1790096236; 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=IKUPurXyGjXq2dDSy5YrqbSiwRoZ8osae4bp8uljdHc=; b=WerAeHsMPSfCBmy+bosqP7uLRj0jxHcjB97/tvLeQGgWWaeK7JfY0akQ+Gx+4i8Zr3 yb3f0m3gZtzsBu4JmRKML9bc9kV/3pLxZCMEsPUjOwsAkof8qPc9duYWszUn5/p/zna6 e3BcSomF5zu1k0IL2Ei4j1UemJ2+qPUhHaQcLYml+zIT/qfC/zAjTxBDLRicYQUOpRD3 h6Z22hV94VdN4eoI0zBQvLciI4Ve1Nc9/ikOVRE1egZtgY/7ZgG4gk02PZnS92CFv6ld QbQPFMZXvj9cNyZd793P5Wox0K00uoHUtqIrW2WdkynQ4KOd1c6I4KPbqfwT8ulsmFii HLuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789491436; x=1790096236; 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=IKUPurXyGjXq2dDSy5YrqbSiwRoZ8osae4bp8uljdHc=; b=QM1sdcBQso492cuGEFqCEQUnN8GLPjPoNPD1AUm0XlaQhvfw8i5yOgBVR3t3C7Dyn1 0f0r8wW5EVZCv6rf1u7ronItOLXrqHQmGcWzSbFNIvUzHCZj6y2MbA7DSP0PYEzFSOgG SVD3oAVf7J2Cm4sUWcX6tRMqxTZq296Jplzu8lb30KBfLYPzrK9frFaYdk0YwBtm16zM n1fDY7TSMPNDR3zyPl4T6FN18oB5MzwX7QF77OBZfUkcGjM8bZZ0NOVeWfNiswhwdKGM fPdnwV9NmFeMjI+5YIwHI14+PxhifaJv27Q2PHW7ny5OOhjJv8LYQCiLuy4pPVuONmg4 6twQ== X-Forwarded-Encrypted: i=1; AKwUvBzAizJ3n+P9aEN3woEVJeeqtap/ZeZBD3hCs2gnEr9wcxqXHQ6RTWB2CvmQ0xV4tx0abWI1R32+UOEAWKY=@vger.kernel.org X-Gm-Message-State: AFuF++mrvVnIq2Ll8o8Mph3lZoMcLV6tcbgC9RzNLoTNLYy2motad3JG Fh5X+RXYVNh/z4p50aFkxUVCqCWxSyY9Bi2PoVQF2RZNBk9H7uClEVqEAip3sOoxMAN+DRtTjYT CiKGKZLZNv3MRf+vh0fJy3YvBCwM0vL0N7vopKhp9NrZc/e1aItUJjEyOkWY/Hz4G7lo= X-Gm-Gg: AYBFou3DlGtoMa/iX/wIQGMXXMRz//56D0Jy12NESY198qxeMT9Rbybyq5lCn4+7nMN BgKonbGQittXIqmd3rCqj8k/mSZ0kprGVLacOF8TnKJJMxd410+q+gYzoD4iQVJRj9J5cQuqp6N laieqSq41Qvao3TMdCA5G+WPAmsID2wZccOkv6SNFe+lVgz93OLP/BRxzAwKkksz3JdHVrQnpyH 4aqdG1He9lpgS2t/12OwQbdVoxTem9lLNObWjQUy0i+HQH7dnSB/juQ5/vgkF+8mfmtuz5TZ3uO QHLoBPdybKFep3CHgvFr6KV3/9l8cpoN31xDxlNntxGteHQIpYSLD2mYRL9dzcBdp/vufdxBtWS bySfdetMyfSh5VQ== X-Received: by 2002:a05:6102:2921:b0:79b:1b6c:4f66 with SMTP id ada2fe7eead31-79ed34ac6c5mr3719695137.1.1789491436009; Tue, 15 Sep 2026 09:57:16 -0700 (PDT) X-Received: by 2002:a05:6102:2921:b0:79b:1b6c:4f66 with SMTP id ada2fe7eead31-79ed34ac6c5mr3719613137.1.1789491435551; Tue, 15 Sep 2026 09:57:15 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49e83d9057dsm4361335e9.3.2026.09.15.09.57.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:57:14 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown Cc: Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek , Bard Liao , Rob Herring , Krzysztof Kozlowski , Conor Dooley , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v3 2/8] ASoC: SDCA: export PM helpers keyed on sdca_class_drv Date: Tue, 15 Sep 2026 17:56:44 +0100 Message-ID: <20260915165652.914893-3-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260915165652.914893-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260915165652.914893-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: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX9MW/UW8OZjbQ LvStPbCdXPFXFZEwB3/iIMlFlo0df3r4hGzN8JsD1In7nRynUWwBD5/CrLYsjxYgMKOYcKHO9hF PyAK6Oe8WyMJ8dctgvCAW4U31DHxnec= X-Proofpoint-GUID: Eg5qgp2z_Kd_snggwV7KPkrDpS6aiqGU X-Authority-Analysis: v=2.4 cv=ZINCCn7b c=1 sm=1 tr=0 ts=6aa978ed cx=c_pps a=DUEm7b3gzWu7BqY5nP7+9g==: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=3PQulrMEHypX3zRcvmEA:9 a=-aSRE8QhW-JAV6biHavz:22 X-Proofpoint-ORIG-GUID: Eg5qgp2z_Kd_snggwV7KPkrDpS6aiqGU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX+1FEjLVsWFJa hHAufjQJU+SGgDufMRKuz33tb39WX1I7rAuIMUYNPFDWaYGN8n/1Y0lclyWC60oksReBBInQwPB 5ZQjVp4zuj8fBIdKFkgGxSdHFqUeBk824aeMlZ1m5CdpcmuUpYxTceCdgNI935cWMf4RuP4UCCi CAjMKlGPX02X6SEKSA6HotUSOiernIY7awG/OlMfT2TaFGh0fNvBhhfxUrW9FnEmmFeY/EH9YHs WN5w9aLvp5t4V6DDwbY47HDXh11AI/r7YdDxJizC+SAX6IIqTOoblEHffcSAl+Le6hQHLl9Ak5B kk4yjx9P7Pwof0yRi26EQG0hj7by5IWOvraF6sgCv8YNCz9iNQMkEii5sofNYoudBL+feXFKk53 iH4TSrEb4fbhyLaiHkpc4Go58sSsxPyguRSlR9QOEIZSql87r8n/8RDNRGfS+oAOZdh+BUv5nVE Pq379CUzt/D+cIT6ajA== 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-15_04,2026-09-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 bulkscore=0 phishscore=0 priorityscore=1501 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150247 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 and wire them into sdca_class_pm_ops (kept static; the built-in slave is the only user). 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 Fri Sep 25 07:22:50 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 102E74B53E5 for ; Tue, 15 Sep 2026 16:57:20 +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=1789491446; cv=none; b=PpKK6gxRLs8ou8KVLYUxOut5OebdDo7BpJIPTWS+vuHVDViMZchXihTLSwwvyVX1/4QLPoGqH8ZTHKJqL3SGiWuh8P7DTanRiG0+H4K7HetlPe314ZfhcreIDU/KCq8QNtelHcJoyOtcCVr6/J/lZmfLyoKNtwgjtWJkLFaYijw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789491446; c=relaxed/simple; bh=h6+Fqs5UICNizMZu2Bg4oRbMCdcWTrt2xZG+VwgmlyM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FkKmBuieOny+TLJjFOT6IrLKDTRFe/7/Kw+1ox/V30rDCNoxV//1UgN9NMf9NMiKLrnRobM5IvabVEKtnT82HWMZtZMRNsRRE7zNlZdhhMFyVvGjdTZWp+zjlF30wUIJ3mi8pOis6WItkNkGnpiJUmuWFPvVY3f5vks7d7ulZYg= 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=e4jBOvqU; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=TOQVadJx; 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="e4jBOvqU"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="TOQVadJx" 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 68FFAQfo1014170 for ; Tue, 15 Sep 2026 16:57:18 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=e4jBOvqU2GGy4btghKJ579FA8ow +7nExM42sxcm3cpGeMNZY5jPgQLllk9Vzo98rBCpeTukKRKpsi4YQWlHgH+bFjEC aEqK++QW9x3Ui+OFMdQH+9Aq02PrIcgYCGR+W72XmusFaF+K7yQEcMiAKVtRAwtt zgohVN9811fpFWme1pab1QFpp51uBJtQAsvYpQaZIWYuc8N3yAohrAER/aHWq8Nl 8YxwjnQxPnOHWgIPcnbsbW8Dt+GmtF2ku5MAVjf1Rqm9YdznEsalGH0UzRqQNhLz /K41Z+PD0OmcbRsZ2kMqXbnop3MbE9Fc/wUHOt3r8wGaWBFf7wTkkDT6aRw== Received: from mail-ua1-f70.google.com (mail-ua1-f70.google.com [209.85.222.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gpyea32we-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 16:57:18 +0000 (GMT) Received: by mail-ua1-f70.google.com with SMTP id a1e0cc1a2514c-97e9e1dd7fbso3541306241.0 for ; Tue, 15 Sep 2026 09:57:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789491437; x=1790096237; 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=TOQVadJxVOm+tCeDTdwgi0ZPcRi22jlvqepiUCMlwW9UjhZl5sVUDu0b4ll8xIF5sn eihGM4u3dPW+VVps0x0Re8igBIfrdgKOYxkF41pjVkwIc1dWMdnVnC9i45u4jUGgWzhU LDVtGJW+0VIg1jKR859b2rTZPOQ6G/CgCNjEQrzncI8LZPp3xTwz8bd7Dl2+xYYJJU9I X5KUsoXUGL3XZfS9H5egf6Q9sHfwId0wEPUw286W6t2bZ8PBXwzAnkgLQoLUEe/G3ysC n9k+vb8z/IWUTBWqUOJVGW95AGgx9gU4M279zXvv8Sd78MgkIX603R+5+gYmZd+GEx4u 4ZrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789491437; x=1790096237; 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=z54WluZ4HOhCwhqe07Jz64O/YaEGImFixI3KNJoB0J4eL3BtVJQ27nzY7wuhl9HGwQ k3tjK/jSDe3Z6JmIYWWiIcnHLnhCn1+S7fIY5GMF+4Hd+WAAl/K5qUePdcjAhVXoWefg 1jymYsEBS+vDYQtCHTvD2kNNuDkxpGH+78Kj+pkjHD6qrrx1URawnMDoYkrPBq9uGsnl TiMX5ATXjx243JuZImO8WlhmcNHM4cVKu67UfZYldAAVM2SoH2W7ksq6zi/lHeLt2VcC M0Q5d2hyyFN7nLNh6UcH+zhi/tRIeE9H1ncMP3dI+U+EP3fdCCoKWIc4XeMXxe8XecHo WxaA== X-Forwarded-Encrypted: i=1; AKwUvByW9rV5QVZ4n25vqN9pRt0b/VbVdr+K8mDbcw+5eYROwmw0IoXuQ1gNtGhbWCg8Q+0G15FoUrbQYCkqZb4=@vger.kernel.org X-Gm-Message-State: AFuF++kFT8lTlAItWmqj26kFIfL0L1cT4OcZeVZlfUwTI4by3bN2mR8Q f8e9tqMufx5kSubA7ofppevo65cUPfQfutOQ4caxS31p8aHiKgH59K735vkKUcQ4WDIwXX37wUE fJzkjqkPWIySNxAkib6BnhrSeoiE0cF2wAEchnJl4pvybhpgEiV9ZiTMXYcX20iBNqi4= X-Gm-Gg: AYBFou22ptIJvDPrlbiS0b7TopPvsJDKzyAIpXpMWsLqKNM3ahlyeHd4e66ZLuJnS8g rfd5a9DGc+Gx03BA37qBo1+lXJ3zpOPW6n4ViIWxiDhxIq0/2UIQ3JOEU3CNXas4VGFSY0cWAq3 q0qFeM1A/k0iIuUcGZaPE6umGmD4SX8Y/yoRaI8e0eEhulJQTL1xQuZeHMZlUqLNUFGlCs21MMv ndw33xmBuS8iCCrcKmVEgglvvOxc6K0mFwHSMKrz7kF/nKu7is306NRgaq31RSYh4MccWwUeCJn 45mPoXlH5Unm7Js15GWQBim8k1OLDA51Mf7wigqnj3U1qk6AjZD7fGsMjKIW5Mn/gDnjFr/vadh XWp7Avkq08XHvDQ== X-Received: by 2002:a05:6102:3590:b0:79f:6c70:572e with SMTP id ada2fe7eead31-79f6c705d2bmr2641458137.4.1789491437410; Tue, 15 Sep 2026 09:57:17 -0700 (PDT) X-Received: by 2002:a05:6102:3590:b0:79f:6c70:572e with SMTP id ada2fe7eead31-79f6c705d2bmr2641424137.4.1789491436963; Tue, 15 Sep 2026 09:57:16 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49e83d9057dsm4361335e9.3.2026.09.15.09.57.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:57:16 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown Cc: Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek , Bard Liao , Rob Herring , Krzysztof Kozlowski , Conor Dooley , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v3 3/8] ASoC: SDCA: expose class SoundWire probe/remove as library Date: Tue, 15 Sep 2026 17:56:45 +0100 Message-ID: <20260915165652.914893-4-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260915165652.914893-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260915165652.914893-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-ORIG-GUID: HpAJ2aEXmRDhWhC8SSUjsY-ZvCAZ-GOs X-Authority-Analysis: v=2.4 cv=cehHPXDM c=1 sm=1 tr=0 ts=6aa978ee cx=c_pps a=R6oCqFB+Yf/t2GF8e0/dFg==: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=TD8TdBvy0hsOASGTdmB-:22 X-Proofpoint-GUID: HpAJ2aEXmRDhWhC8SSUjsY-ZvCAZ-GOs X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX9/YCDjOcRk4d L0k5CNrFVmfZeKeV+Uz2hGpC2ZhBJGU7gH7vh2qgZ1ku3Xzy4l0k0wKI7VQz7Q5A3HGDW4VLMTZ dngmBQ7tE3lralbdOxhskbGKxwy0Vrc= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX2YBLX1fcKXdd L8uksBuQahEHl26jPOvZ1vzZzT+u9QdyDvRZph+FWKj6WRGd6FfUqyEBteO5qczeBhzcfqdHUEE IvtRdklYSD8E5CfhSZTigCe3YyxInapkifCaezEjxaUcjMJ9WQEoadJkQq809oQ11cKx0FBq8Nz TIKw0qQYTgMDKEO5z4lAnECKOGR6XoJqxIX+LATumtnDOlXv2vzevY/QzKAqkElE61giiU/qD+t 3gfvUGfiB/KLYE05cyy7i93bnkBFqiSNoNRAv+5LPoR/ewftxrFOBCCn21DMh2zAEQtaS2iNt9Z 1DMskNTrsf7FTCWrKIIYlUXSfhYntOHqHNkP7CxYr4KuLHh8tCUZr5iNsoH0CZ8gQb2esEjerai hJB30VzBgqLZ+EwUNePjMMH/qSiwdMeQYYbOUDEyBg9FbAUbo32S4PCRW3E1OfC311rqysdCRd+ Cv2ky2am4GGd4Zvhd7Q== 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-15_04,2026-09-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 lowpriorityscore=0 bulkscore=0 clxscore=1015 impostorscore=0 spamscore=0 phishscore=0 malwarescore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150247 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 Fri Sep 25 07:22:50 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 8915D4BAA14 for ; Tue, 15 Sep 2026 16:57:23 +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=1789491454; cv=none; b=J4E3/fJoiVj8oiT9e7e3pnYKm/RHJD9zNMvLya+LSKBwCtK96HfTjf9EiZqKFaDuoxLbL/beVkLDDZiRxfl9ebCnh7AlK96bdKm/LtWBwXS++HK6HyzExHLgyGeOek/YiOERNoucwORd1nJ18VGXqzfOJMdiBXsFU4m6AbENhPA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789491454; c=relaxed/simple; bh=sTtAcC6DTgTsyia/QnLhKcG49gomKemayk5z0N7ppgc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PnW0gWnTocwoZhwI1FnARkdMY6a1cVwizO2PBrwPU2N8+OvvxAm69XEInQlT3jojy7//I84PVxkAaPvk1KIjERoWRGKEnh7ShcAfcJBGPisLyccvIJf2Tal71Tn2WRD0ETg3aJAjCOfJp1gWjVkzEbNOiGaiIYc5/L+uDurutVo= 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=kf4ZLvAM; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=REzVRAXT; 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="kf4ZLvAM"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="REzVRAXT" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68FGXWN33577078 for ; Tue, 15 Sep 2026 16:57:20 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=kf4ZLvAMFX2gazjCvXoux6fxHn5 jeLEGwxEtZC2q6dAKbIZ0VNOgpzwehzXucmRvXFZtstTT7acIIiFDI9eUbyr4F6I xy5IMJ88V0esrL+kowjejST0c/5JPECIeIu+V9kWwCDz1wE5+cU9ymLSkzsDs0rd Mqx2BPSxHG+KkjqAmsYGhgl22NIfp58U2X+XDX8EIGI0jR0MELpe4iYYrnH82/Bt MwQw3BBPVqImDOIoodlWh9FaQpbyJ0rtQ99yHmOnYXTFEaN1MP0rnXjUdxGyu538 k9vOGVMDVQmPX0q4i9s+bfrPth+7UbQ/PwpszIN/jGEm/iTU9fB05u4J7Sg== 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 4gq9n605fu-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 16:57:20 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-93ae8e7e546so46697085a.1 for ; Tue, 15 Sep 2026 09:57:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789491439; x=1790096239; 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=REzVRAXTXeeAU/RcldNqbcQp9qcxFwxs6yd0gkbR++FQlHV6sc5vPSfCqoySkBx8s3 pKoSn3+9AUL+NO1HZ29IXu3mIJRsAxOfWXsFgyDiG+Z29vv+6xi3XNtmEPDle9P4ZLiz JJu7BG5dRdIe+cYJfyCkwkZFu/X2cDjjGhRAzrMn/ahz2AF9dU/L53UQyzoG38dI+aOp tIte5Z8q9rb64XftB62rdzKVUbF108NYmBPMLCeBQpEyp/719rOMFu2uizdDXgELBAnv kdUZwAenSeSgRO9WHiKBnSRk7KzS2f5cFB7Sc4DfcjJovbYK+9X5M9iMRqBXwad3sgC1 B/Lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789491439; x=1790096239; 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=OvSmejyah8fdw7T0Shr8gTfYcGUpxH1+TEmi/iwJIqWXRUs9pOpAd8Izi/UInTwusw hYn9dfglfnpMk95BKM9rCbo5S2Tp0FjdqN5MW2blkxJkt/kePDrgEdHAwheZ2mW3xuPi dKI4rsz+nkv8hzk4zzBTbxK6QjG9gzpozUUoPIuoSskdS58bEWqEEoxHshxxYyHgovsw FEEsIXzQrkyGM9pB557pyscXGCJOqC7G+cTOewujFofrktWopnUzpzVlZA/jjvTDymwY jDiXiQOh1M4fwgQYMKy50URqIQ4klhhirWoH0wZqUFqW/5E0voimyTtZSoSjIF6ZhbWE ENgw== X-Forwarded-Encrypted: i=1; AKwUvBxkbGLI6bzKb/DaBQ9YgrvFKVvgrFk21To26egD29P+f0nH8BPO/LKMXbU20RO4nSPDFCamS7IHCMD4Vl0=@vger.kernel.org X-Gm-Message-State: AFuF++k6cljw6P6nAajJGap38lGniKtcZV9ST3ZaFGLCpa8Yf2uOuqOx 90OnKqSZemEZaCUb8q3Z2aozBK/v/TGqm9TJRwBlO6l8VRmfEbPbSBsIgBUgBjOt+oahrzXp5K7 Vh4QxP9vs8BJsZ0NYq6/ozxLToGe9/Jt5anQb8BYBX3k7U4XzbZQ3Tgu3ebPb7nTuh8s= X-Gm-Gg: AYBFou164u24sXgAQAkswy83mdxjB344JOX7L92kG8vAxAu2odh2jvTu3OnoqjqOiU+ Q5sJBeWTtvuoEBNhUt6Ljj/lcElOX/ckcOc/rQbGbhP5aZ3zQZehycWOjuzX5A/ZcFS5lvNpJCo hayUNaE3C2ehlEcFO5wwt0c3qpiICJu5fY14xeTUUfgZOEADO8FrpLSYVSIN6rdrups08IchLJ5 xPBcCVApWF0I/Xv1XP6Vu89j7x6GnaxothKJ+tgmJ8CFfvaTLpUAEI4KqojSkI6YZS89H2Y33Er T8fofa/bm+Zr4DDj9RGkfKlGQrR/cVFEBJJT0Y+uWrG/D66DNFJ0vJ01MxB63czRxhfvZDqJhgE /ibztVvaDViIzyg== X-Received: by 2002:a05:620a:1b87:b0:92e:76a1:96cd with SMTP id af79cd13be357-93a297e8f8cmr1355600785a.13.1789491439303; Tue, 15 Sep 2026 09:57:19 -0700 (PDT) X-Received: by 2002:a05:620a:1b87:b0:92e:76a1:96cd with SMTP id af79cd13be357-93a297e8f8cmr1355589785a.13.1789491438612; Tue, 15 Sep 2026 09:57:18 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49e83d9057dsm4361335e9.3.2026.09.15.09.57.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:57:17 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown Cc: Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek , Bard Liao , Rob Herring , Krzysztof Kozlowski , Conor Dooley , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v3 4/8] ASoC: SDCA: add class_ops with populate_function Date: Tue, 15 Sep 2026 17:56:46 +0100 Message-ID: <20260915165652.914893-5-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260915165652.914893-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260915165652.914893-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=BdVNQbt2 c=1 sm=1 tr=0 ts=6aa978f0 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=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=RDHKc21CrRhZfFRGvR4A:9 a=O8hF6Hzn-FEA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX/iD5ihaV8+0Z RMgxTsoY5mMDpSv/XF6UhdDbw6LtE5OiWDBEl18yGQqYFZ14npCX+JDfqinp1N49LO5K5SThKzF iI5X2hWe1aYdDx34FAziFbPrdMKkaOu4GWRn/6zjV3hu0JAuBTiYP+CJ7jyKxPMgXeKKx4AVwGc StVAP1clDOP39ktiMQazZchURgExDRjalMTwY3PzmP0TPhrjBM/TavHBhCLYZ1sNItkMgYlcx4o f2XCh02gWjPsrKy2FO5u0DDEVXeuW6SMHmajb2exzQOCNEh9HwuEalcNbvuQLWXx6ML8/t3oxJO KrYL6Mv2YR4GGxvM20J5Ukc1v5HMnEOA3TuLnhEdS6jO+h1fzHoWyRwXB+Gguups9uSY6nXU/Md Q4YZHQz6zdDj4DEUsJ32DO33My/3huQ1j8behXThUAVeoVdtRmJhY5pY2K4nhnvcXhqf7PAfVVW ppCGy013aEyanFW/ZZw== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX7xz443i+iA3c pT2n32JbHGD7A9K9/K9xg2NOebJSypjs/oCdO1GxDow/WQ0XbzFDEQOrXeIRue/Ptq5BqDdbvDh g+4unwERzUbL0nS62cjkwa4BsO9QkeE= X-Proofpoint-GUID: lL6gPLP7YeQNxPDbCU1OmK2yJCeg1XRS X-Proofpoint-ORIG-GUID: lL6gPLP7YeQNxPDbCU1OmK2yJCeg1XRS 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-15_04,2026-09-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 priorityscore=1501 adultscore=0 spamscore=0 clxscore=1015 impostorscore=0 phishscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150247 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 Fri Sep 25 07:22:50 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 584C04B7172 for ; Tue, 15 Sep 2026 16:57:23 +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=1789491449; cv=none; b=iQQc5MCL/txIw2O5POHiK9nmXrBGC6ahtzs8aF0Gnqi1tj94t5lsyMHf7P8DStzjpGUkRfyjzMsqO93nkSh08FNClewXAxdi7CJAXOifFa1FUE0TXjnJl/Tqq1h66lz2qCYrWqkzmz2kA+t5zhmOW4yU6TtlzlbGi/9YLhWilCc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789491449; c=relaxed/simple; bh=3JoZslnkrMsaU3dbbMDWnwmTMC8zQq0qdN+qFoCdvA0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QOQaau7siN67pI5kHfd9p4iReyidO2x4vWEb9g6gWnTWHPDEJE6SfGWkr/8dCU03thYm2K5GQ5nwObClwFc5IeYYqmIfFyoiJC0KijBFNL06v+R/8wnycDhCpc0cRIXIdaxqdWur6EFeWlDf8dQTkobrfiDS8PavUrmii0xDw/w= 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=OsL1mDSj; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=DSCqDkca; 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="OsL1mDSj"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="DSCqDkca" 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 68FFAU2M4176143 for ; Tue, 15 Sep 2026 16:57:21 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=OsL1mDSjgBPzJZYXh04KiJq8jq0 NY5vFWNH5KAJiAhaQifGCJ9uFu2aKlWT9QuZfM36taAYBMR2LioCszAmGH1/qYuz hDoJwBvfQqAdhz/NBGo4EtE/FwXyzp7SNO9UCzyyXW+ih7JV31LwKw7YsgeUdC3x l81nMT7xjH5QeS4U6rfGbtU6S80IlAbDiLohTvZfDwDMjBGLcWHBkp3NgFejSCLw 4VQbEAVE72OF5khGrt2/xHvOu6cVfqY+AxbM47lNpy3AoDul6eDnn6Jm4MOBrO7Z BNeuJmigzksxfHPLq5RVYs8VFyfhK1cMYYDPvo2s8BDnfOVGh+b/d/fVLig== Received: from mail-vs1-f70.google.com (mail-vs1-f70.google.com [209.85.217.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gq3hc2jjv-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 16:57:21 +0000 (GMT) Received: by mail-vs1-f70.google.com with SMTP id ada2fe7eead31-78a686d205cso3874269137.0 for ; Tue, 15 Sep 2026 09:57:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789491440; x=1790096240; 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=DSCqDkca5giWlQXbanOaARaFmbbKWgjA7bKneDkKGXN/ZguLPViBTYnnGin3CrYXW2 /H+hPaLZlrPQXL+08XhvveXTajPJsDQo5/0hZ29GEpg67yB0Scb0FVql3RUhwDeLqY0V 1r2tMzH/Qv1VeItSGrPkYiYhLan/iHcymKqrMmZhS6wMFNu9/ISf1daBXYj6l0oqiQsG FfHY816rF/iAovwL3Lz/Q/UoMcuADGFU05ZovwYX+4TkdqsAqpisTz9RTKFtQUEcJZ4O tf2tJM5yYav3+RDD7uHcD04yBt1BbLzLseVw+MoCUAQ9W1koo3e8885+LZ5VQxRDJdcn Inqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789491440; x=1790096240; 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=sehpXuzzQatC9y2DnchaVLeSmqcc6YedL+s3FNezlzwuc4hMiMROIA0I42TMyUidTs CgfwnCGOqYP7bEi4/GsNdLP6FbFUs+SGSB80MY459gSqTW94NTfnoH0tPinzpqqT7qwB 6i1MA9Or3UR8TRZ83X4qdi6STVWntA4FWIbj5Wg8C/Qh8W7Vytex/cy5Pl6fc+6PvItD WhCX1ikDr3XQGPoaQyDrin0ydEbgPcG2aaC59czQBSP/rNzcBqpRHn34vOvU9n98JEr4 gflefnLpB/i5Hbo2TBV5YohaQ73PdHTvciz8J7Rrk+Hd3J2Kq9M3Nz9US02POrtCQAtg J8+g== X-Forwarded-Encrypted: i=1; AKwUvBwK1/mGQ0IC92QhjBufPtTb2WsCVV/lr8qxrsCxThMsL+Biw90ZUEN6TXoeNMmPCvPRmBWpfS/l5i9JClg=@vger.kernel.org X-Gm-Message-State: AFuF++kbjz5KBFgGR5aslJbl1KiBIBhrxGxHpr0sM7WzosoJMAOCF0QF gVY2/DpkPgtCirjiYQyPRJJGcGO9IQY6XeVpKa9DK7v6CsnAoSDCHgegsZrI7yhcwjERPsGIABn HBtrUBcJZI/C/zVnv3XdF9G/jXTUwZs2woTEN48vERsl/oLBWjkTA/Lai9qvokDdwUIQ= X-Gm-Gg: AYBFou28RBvsaINEwLvmLxn6fsoH/FY19e+zqWLhL0H6PWljKeeZX0Bfr85vhCj/jBb tOVHIswvaiyf9M93MVdXM7PlSVGkHRuNAl3ItcKByupizFSE93LK+svEMjYhErifYFcWQV8vkfD BUdjsQw5Wv4kKJ4lNoKc4nEDBMU6bOJbwzgr9eJ4iMFeX8ravDJTMMqNU1XB6R3+gC9WX10k+j6 tZtJhXIiGYJCZYxAXfg9fSbHmYM55HsYFlSp9Jw9N1/sBwFJkspVU5WVJWBC56XtEcx5HP61iFN 74fST1X0j9eJ1hWGNj/fmLUYFpFDutGoykN91BTP0Q69zwubUaLt3V4xuKP+N0hpceGO7FTiIQg qbxlhLihoxO4wcw== X-Received: by 2002:a05:6102:fa8:b0:79b:cc58:2973 with SMTP id ada2fe7eead31-79ed474a097mr3876355137.5.1789491440438; Tue, 15 Sep 2026 09:57:20 -0700 (PDT) X-Received: by 2002:a05:6102:fa8:b0:79b:cc58:2973 with SMTP id ada2fe7eead31-79ed474a097mr3876292137.5.1789491439960; Tue, 15 Sep 2026 09:57:19 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49e83d9057dsm4361335e9.3.2026.09.15.09.57.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:57:19 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown Cc: Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek , Bard Liao , Rob Herring , Krzysztof Kozlowski , Conor Dooley , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v3 5/8] ASoC: SDCA: class_function: xlate sound-dai cell by entity index Date: Tue, 15 Sep 2026 17:56:47 +0100 Message-ID: <20260915165652.914893-6-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260915165652.914893-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260915165652.914893-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-ORIG-GUID: n2HBmC_SWYdhsBo7UT0Vv6KrVbK1_Se1 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfXxFc9YQuzKEfo ShU94Sc1whBrYu+oHu4Ez15jhUWEzLR5/GpZJ6/m1i7/NneAH+xwk+TN/mfu3qUqPMfVlvOxVHq cBVcfdY5t4dj3Zoo6zRZRCDDtuJADLQ= X-Authority-Analysis: v=2.4 cv=dcUVTnXe c=1 sm=1 tr=0 ts=6aa978f1 cx=c_pps a=N1BjEkVkxJi3uNfLdpvX3g==: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=D7LRd5SpCY7MsyqoJ6wA:9 a=crWF4MFLhNY0qMRaF8an:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX1aZ0cAVeSXTS Humyf/jlC6yLQqlyDk3vgUcmnjpdZCIKisGA0yILs0mxahZt0V0yPlsfeFIkP49WEtKd2pZ/Amg T5DD0kSO5fa9aSOBfO4WOxRO8j5jestL+1E/f3k3wevbO1Ka8oP12eH3mbXA9YLFi1mUEw3O7QN 0Q7K0bN0HV1HrMStxyWt1PbtW2SzqdEwDywIWhgAQWbsqEOv58fDbjet2uyRZMYaTJaDNyo68lX PJdcZQwEqUZ28i281mCVbsYDt6xzCCPR28VEe3h8jI89wtvD0IA/F57sMv0O5DmACc14ADCR8yj GVM5Cyl53oz7qJJGJAOZXproe41VyOGdZ6yfaOwJalyllqDM0q0RWwc9s7F8TTojWhgGg8nxU1d x+0/zoIMhM9DgT8QGYssZMzT9cwxQJf9T5zRQPmg9XThqgo9If6jVW+EZiJB9n2p+YgKadHKJWK sovVD7Q8coxG52M4wkg== X-Proofpoint-GUID: n2HBmC_SWYdhsBo7UT0Vv6KrVbK1_Se1 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-15_04,2026-09-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 bulkscore=0 impostorscore=0 malwarescore=0 phishscore=0 suspectscore=0 clxscore=1015 spamscore=0 lowpriorityscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150247 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 Fri Sep 25 07:22:50 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 B4E234BB273 for ; Tue, 15 Sep 2026 16:57:27 +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=1789491453; cv=none; b=CyrttH22hdPBtokezXYGQDI8d8icIhr2tSSn7F0eUuj+dNI8hEDNvDPpYTbbRu/wdQxMujcMGktp/FVxYH/K2GGeJw3XyDddoZHU7VRl1a/9Infejm4DRjZRCINv3wBMKG6PkMvo5FIR7wUoOkUtoufUyGomNKx7/F9RG8I7Su4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789491453; c=relaxed/simple; bh=AsXKWMqSsZYic+4+nHonSuw6IKnniuZC4TJ17xky5w8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kYtoWEz5a++qhaopOEAw+QLoCuIW9dD1vlPLMFdEuBZN3pixkERwM2VXafwHm+uA9xqCsiNRWUKFHXnU5Xb5FPZhW9OnDyHgSeT54E0dc511BRODDfKTRLts7GfhtagfPZGBcaxihEs66wK0Yko0gX9L3nWnhJN/pE8ZiXG8fcA= 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=Zvh6+Xes; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=fc+JoXIK; 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="Zvh6+Xes"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="fc+JoXIK" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68FGXVKe3577068 for ; Tue, 15 Sep 2026 16:57:23 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=vThtmsH7s5Q Z/N9eRQC24RtKUvjkzyNoDSrqm4gjePs=; b=Zvh6+XesFDYRzFtmL7N7o2bYwlh +X/vj+7zZ+WIL30wUvLTTeuvmIrNCDP1iFE725JZnZP5sGaTBz6FXQbiYCztjX7/ IWTQT7gtjdnd+b9RCrcSpHfvdsryqyQnau8qvLPdLxqTOK4fkaMFoILeD1Pv0gyD EMVTlxJJltQDvKrHH3pw3BEjOd8hA8PYWr1KtH60jZSAuWqHouQ3P3dJBsDZ7YLd QF5hJVwPvCGYGbF/Ew1Mq2dD9rgTqa6r4v7aXi3aJgKrkTxo6E9xjYTEWOT88oiY VatmXztCcTXdD4/WTs/BPk3TNR5x/O1EAyouKDqceJfTbpWL/DWbM8sINjA== Received: from mail-vs1-f70.google.com (mail-vs1-f70.google.com [209.85.217.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gq9n605g4-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 16:57:23 +0000 (GMT) Received: by mail-vs1-f70.google.com with SMTP id ada2fe7eead31-78580a6b2fbso1562753137.3 for ; Tue, 15 Sep 2026 09:57:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789491442; x=1790096242; 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=vThtmsH7s5QZ/N9eRQC24RtKUvjkzyNoDSrqm4gjePs=; b=fc+JoXIKh4kLWNUi0T4sx8voKaQxFWZon8d/9CheIWwXT+C66IC6/IhL8zUkQ5hMpV PW7g5AG9imIL6C7odqatxwKZN6d1q2leBRFI4qSPBmFehA0KBXlIjYX2ug74WE89z2aJ 55BCsT/Oi5Cjl61H3tELcAr3JbsgYWyWLmwGHFvVELfsVALa82Ot0/GLozHBa+vvC+mj SXNbJMGXT4UTUCmAdVO6AjrG+emc5B+TQgUZVoX/sC5cR7tAaV7YftzpCU3kRnfU/1Cn N+GFeE2buoOaFqoKARtBka3EC0cOFijJvnoeU9Pd38MO+6DrqYXHCkHwiJ+cuAOFzR6z i+BA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789491442; x=1790096242; 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=vThtmsH7s5QZ/N9eRQC24RtKUvjkzyNoDSrqm4gjePs=; b=P73WRTqlEGpGVCdCrGHGbz7FIh14Eit4v97nJvrEUdegbPvC5EcMOm/ondpX+NGEvT 1gVmF0hUqaCl5rX5pagNoe4aceqRLWs3DESVWg0FfEFpejA5vrrZop1VtsGdY7fVlbks +y+6Man6Tx4Yrfl7zVXcfVb5CyyKPaA/2FmbhMCrpan6SeN0x/ncZAb0nTKn6nWWAUcJ xye+IECcIb0blzWkoN7d1nULFCpbAzpX39JKHju8YsbGdPHWjXnxESEj4epBvQg5/nlL tNubO4Mq3o4rtXv/AtYeuQtSNmsFII5EE+tT88IUltdce+m/XD6Jcwn1Q9G/W4sl5Ny0 vc9g== X-Forwarded-Encrypted: i=1; AKwUvBwNVYVdOMWdLakCgVPBpdTqNRvWzaFg5GPWR1pHyW4jx61RQuwS/7FSf5VumsmFIx2jrGqoprVX9QUHX+Q=@vger.kernel.org X-Gm-Message-State: AFuF++lSiBQfhCUW/B2B/eMLJiBlIeIELMwepyvcCc+3y2GxOxgAQC/T 44L9HubpdLqikXTK6Sl7bgVbnsgL1suIH6zFrQHAcsQdPE0IZpM1RD8p7lFPzrJq86GYseetKW8 e8+HMcdYt3kp4QO2GKsTWNHUPNG2Y3Jfm4CfKgXwbAM0ZT0UIb7NTI87dYvgGTqmriVA= X-Gm-Gg: AYBFou1KbQhMlPiFfhckOcdN/6my2AVYXHtdpcqB9DH+inIu7hZC8BAWIui5qgn0icM O3Vd8dTY1DG87U1YAZEebEelEmLyqyVGKku4/EvGXwhoh6FMKUV7+AqgKzoQPMu/1mjX2C9gz0a wmgkvIjTEjmDtrsuR365oBUtClh0UMlKQogxmasmHZp0PdpTJfeZ1G2usGpVEMGYDcT0njxYBb4 AK0zIkNXeP1fCTZhvN7WTNeFG5VjKkbBCNG7oJlODKSPd9ELLzl+PXYA09ObwZ96LdI8AQ8JKIW M46e6SNDH5YJB+sfGrTSCXaOblan9E8uqwKMa6gYeW6ylLLlCfCH0M6cR9Y0hzHo1o8l7E3VAj8 AsMhO0TeK7bWazA== X-Received: by 2002:a05:6102:5f08:b0:79d:8255:3bef with SMTP id ada2fe7eead31-79d82554188mr6083055137.4.1789491442006; Tue, 15 Sep 2026 09:57:22 -0700 (PDT) X-Received: by 2002:a05:6102:5f08:b0:79d:8255:3bef with SMTP id ada2fe7eead31-79d82554188mr6082921137.4.1789491441493; Tue, 15 Sep 2026 09:57:21 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49e83d9057dsm4361335e9.3.2026.09.15.09.57.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:57:20 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown Cc: Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek , Bard Liao , Rob Herring , Krzysztof Kozlowski , Conor Dooley , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v3 6/8] ASoC: SDCA: add sdca_apply_default_control_classifiers() helper Date: Tue, 15 Sep 2026 17:56:48 +0100 Message-ID: <20260915165652.914893-7-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260915165652.914893-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260915165652.914893-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=BdVNQbt2 c=1 sm=1 tr=0 ts=6aa978f3 cx=c_pps a=N1BjEkVkxJi3uNfLdpvX3g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=V3wSzEE_ktrjQKcqLJ0A:9 a=O8hF6Hzn-FEA:10 a=crWF4MFLhNY0qMRaF8an:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX1xN/v63HsBDR MrAUvos3R6+gQix0Y3Z1mFPmurv6zyKtaDdfhOe4/RLpo6M07NVHBlmjPAU1QIuv0L8RhWNMrbO BVin+tuHFotSUPvGl6+WI3EHbiAAuCte7uzDckNuQ8zqjGjPLI+vqZI2VyfaIhAHZhmBxv0tCp3 X2Km9Xvllgo1uPKEvbeBNhcbOINL8Hdzn9iMS5Hdp4FVZJBelmq6ytrp/JABBlDMFzx2KdiW4Gp P3s7kQO9TmKzcLWVkFyJ+p6XFppmwzjEbdkVeI2Xf3QRWG8OwztLh4/Y3k4w0mCFCvDDK3/2Ew5 iUXjIl3zix9Ffe6cg86x4L6d6XpuiDBGgczi9yp8FHFJjInISWjcE25wa7AByK5V7aeVA1+GyFT K1fp1y7r2BYy5mOGKbzPi6fnZvm8wlLXU2sfP9VIuOxk+LBlgx9sGA3Rtju8fyC9t3rVBVARrux 9kXduEP1+h1M9x4PGhQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfXxDPwE6mAIpKW +mgGTr6EKp0EdewtvGqMue+n+EvmQGni5ImThdjRYwF+NGEQBjrfbflgxVT+MC8G/zAmbIQbgMW vaijEagFu0/d8fhpG4GOK8v+57eLP0c= X-Proofpoint-GUID: uOlYkdZn86SxpHPuFsS-FX6_6mXX2Tyb X-Proofpoint-ORIG-GUID: uOlYkdZn86SxpHPuFsS-FX6_6mXX2Tyb 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-15_04,2026-09-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 priorityscore=1501 adultscore=0 spamscore=0 clxscore=1015 impostorscore=0 phishscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150247 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. 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 6eb0e1059dbd..4196c5c86a85 100644 --- a/sound/soc/sdca/sdca_functions.c +++ b/sound/soc/sdca/sdca_functions.c @@ -2267,6 +2267,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 Fri Sep 25 07:22:51 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 92B964BB5D8 for ; Tue, 15 Sep 2026 16:57:28 +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=1789491457; cv=none; b=ZL0lZCMmkcDPT9dKOSlQHLj7o1xX1L0GyViBO2Fixb3AMtVZ5RU9REJtql5O5MVLqtJX0yYJEi8cDGwuhnp1CjucMZcVH0ZL8sifJ/qKTn8Jbbeg+un4k4gjpQvV5zwC9yOpYSssRBhB+wxDTaKY3qowMCC16Vb6z941Ps5hH6Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789491457; c=relaxed/simple; bh=5BRFpMT2458/X4jlA/c8yR3sX4VMh8e71LTTWl+feMc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CrnD1K9iZgHtrCER7pMgzeE3k2ZN7HgBWbiRxPlD4WjuFZ5ENm8wXvcf+awy4HaDnROuZ39V2WQhYG1fHUEA9BI3Qy/Ok1LYOt3/w/KxCM2NLGAYcb/ltU7qCwPQWZGvDkXBv1oMnw/iRAt6yki/ShlssYzqSOpibLaMOCuDk0g= 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=cNVxQ8v9; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=jx/wwdZM; 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="cNVxQ8v9"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="jx/wwdZM" 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 68FFAS92813432 for ; Tue, 15 Sep 2026 16:57:24 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=YDLD18vZOwo NWTUh9k9LmtYOiV35zaZzn+mU3vs14sA=; b=cNVxQ8v9uOTf9/R2DFp7g4MNG03 u/yaymYjBKxwwDwIxBHg/wABot4H9dgoJdX8cubcg7kTt1CMUWruht/iNPEoh+C4 7mmm+886ck6QUkhmMudWdNzr9PjxQFk9twkHDFoQ4YxMK1gvyP3LuCKH3Zz9wLmc /ZxpQvceF+vJg3JksThxQM79sVBGYutX/CpMqUQA5yE1Tn57/RKKE5huUHsBnFPp jIeKBiD5LVR5RpdmuagDQ3dm6zwKlefcCK2tujn8xO3U1pckhaKGcoXK1WXGnoWY IEmHsXRNkv2UIY308/f6sWjGTvPpTQ7XouDRnsg2xDBx4W2sslJy5tWbpSw== Received: from mail-ua1-f71.google.com (mail-ua1-f71.google.com [209.85.222.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gq6kc1bja-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 16:57:24 +0000 (GMT) Received: by mail-ua1-f71.google.com with SMTP id a1e0cc1a2514c-97e9e2deaa4so4298581241.1 for ; Tue, 15 Sep 2026 09:57:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789491443; x=1790096243; 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=YDLD18vZOwoNWTUh9k9LmtYOiV35zaZzn+mU3vs14sA=; b=jx/wwdZML2nUTqxOe2uXuNuU0vM8uGndQw0ZZRHPDf6auVXy703sZii/d+OFlCfb1/ LTSrscIYlBiiw9D6TFCbL/7aVlrGeAmOn/2UC2iqVjzshIpsSk7n/amHH+HmyAqFezJM WCCTyni/nC6BJsylgU7Oidka/Wex85uQDYyoby8WwG1hLHLc2SgN30pmekw82fGvnJMO iamWkAHNaa935fMBysoMz8C6l4RSJl+e29ep5z9VKRU4Ii2sIt3+YiW9G8/zAljdnR58 0Xek7B5iXZslnGt+1A9UvabmZ+0OTzrirY0ZyIfgKebiXa/7Xr27e4ubTt33VFRjy5PO M+Ow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789491443; x=1790096243; 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=YDLD18vZOwoNWTUh9k9LmtYOiV35zaZzn+mU3vs14sA=; b=MUXUTDo1bz9oaQEVCyINmOXqUq05ja6n7k2JD8bxgTqGCv3IP/zaql8B7v8vJhnmP/ vPPJKjZMH4FhnFiKUoiYOshosga6YJR3MJ9D2hD1AJ/+AA+VB5a1H7nM1as53TSml6NL THZzaQpVM0uLxGIqeDmVMkWaTWieBW4tLsyXnbIF3K0HBMit6I8Ow4x0TKPm4o4kJ/Zv bQ3V4wsmoRd0Oz4D2S3F4LAyTrgG+6Fc6/d4C+/+GJwa1EEQF1NDx6TvXAvUNh+G4Zci rTrKJpY5JRu7rHlrRJDgNHGQoM/09XYrGMorEsvDEpplrGq/D22X0kumFRpL+326HCQN 8owA== X-Forwarded-Encrypted: i=1; AKwUvByxeaLQ9O+G9LMn9+i15V0DaOUeQcJHSbVOxJ7Is55CqC7SJlR8ibH+7Sw3M4AB1+W1xvFFTh60Oi2MJ0c=@vger.kernel.org X-Gm-Message-State: AFuF++kMS21Vkli8WWXFkRoF8EK10aOrXlSbNrnYJFtFgzk9RsSbMk2S a7T5bh3UR1/iOQPOm2961MPQERUq9f61CNoOFK+hkhYoQxGax3bttKIe1UgNXAbB47GL5TE0a3e Yx7nDQfLTVtb9wb8dKCwK2BQrb98qS26Zw6YZcGSL4604mADKNodu/nij8NqXaZj/gmM= X-Gm-Gg: AYBFou3sKNUML9DI+UxS18FkkF10EW7pIPXCT2CcdTYh5NqEXyVZXKBZt/6SXnSBdJN 1SsnfZgIea31HzqC7pXj7puoaByvXsV2lgQVlIlBUz6unoNMZEzNNQzLhgI2AEXnwAEMD4fFyR/ x1aLRgCrONuv9vVy1vuRe0XOmkt2cVFYdAfb/z3v9ZAnCnOLBfktxvkj2AKkVSh8zTfHpu7lcBG bR8rkP2a4ZBwpJdg8zeNi0V9wzu7b/P3XmTTM9vvNFaNJLzwwR3RdbxdP2B1c8Y0LwKcIvtPPx/ Z8WzlpFg/j8z6ZwRjHRvfIDH/5vSRPAeYPbLLGDkV/ZPBV0sIwLKBnSOJSHnC+aT37v5z4PBkJb ceJZfPyM9yq4C5w== X-Received: by 2002:a05:6102:5e84:b0:79b:b389:d6d9 with SMTP id ada2fe7eead31-79ed744036bmr4241253137.9.1789491443423; Tue, 15 Sep 2026 09:57:23 -0700 (PDT) X-Received: by 2002:a05:6102:5e84:b0:79b:b389:d6d9 with SMTP id ada2fe7eead31-79ed744036bmr4241153137.9.1789491442906; Tue, 15 Sep 2026 09:57:22 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49e83d9057dsm4361335e9.3.2026.09.15.09.57.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:57:22 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown Cc: Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek , Bard Liao , Rob Herring , Krzysztof Kozlowski , Conor Dooley , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v3 7/8] dt-bindings: sound: qcom: add Tambora WCD9378 SDCA codec Date: Tue, 15 Sep 2026 17:56:49 +0100 Message-ID: <20260915165652.914893-8-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260915165652.914893-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260915165652.914893-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: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfXytJCoAu29R2J ctwxOVkyvSwQFu/RxDmVrvfJCXJpD/RZhuPG/etSItEPiWNFZ2r+r2VwaQMQB8LSdCGqnzYX+Rh savQ3uOZHKVID2vG2XFT+IScO2CZ1oo= X-Proofpoint-GUID: pbacSashNTpteiRnKlC56XWO1jPusPps X-Authority-Analysis: v=2.4 cv=ZINCCn7b c=1 sm=1 tr=0 ts=6aa978f4 cx=c_pps a=KB4UBwrhAZV1kjiGHFQexw==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=gEfo2CItAAAA:8 a=EUspDBNiAAAA:8 a=fAJwNmJgYEpPzymNVfgA:9 a=o1xkdb1NAhiiM49bd1HK:22 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-ORIG-GUID: pbacSashNTpteiRnKlC56XWO1jPusPps X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX6AqA0kk2eN5U nhY7YKuNzo4r3JI7LQvQln3FRgHNSEhhOEqkAgk+RLy5tWrZy0BC9K1A+0+JaWfh6P/fKuRrx7c PG3MJwL82fDuiITVhtlHbYO7EQpB8XXvQotxpVB7BTD8HULZtFgC/mnviEmgeLutkjkfhiYanQL 7y02SrcVBDqR3CUtemvXehqvuEar+jc8Oq6Z6lIvaphUQyKF7C7nkiWzEmDHRwhiwoqQX524fMZ WWWTZeBGVhF8Huq5YuJhVgPscs5Bzph2uPKv8qNp/uWrlq9k9XpW3xoB6Vs1j7IpWOyEatHQnWx TWbAK7AIkICB1uNJrXTm/+dHju0FL2BGk3PUftmIlMSK1HYqfEl8rO4m40hmqHgSVh2kgWGTN22 7mY7XMXIhwNalwy12Csh06XXFD8etE3/sWO91fCFp/P8XSyb44hiMNFejFNVbolGo7yrctxyobr 2MQUtJyVg1z6d5vBzFw== 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-15_04,2026-09-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 bulkscore=0 phishscore=0 priorityscore=1501 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150247 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 | 91 +++++++++++++++++++ 1 file changed, 91 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..9a6c309018ed --- /dev/null +++ b/Documentation/devicetree/bindings/sound/qcom,wcd9378-sdw.yaml @@ -0,0 +1,91 @@ +# 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 in SDCA compute mode. + +properties: + compatible: + items: + - const: qcom,wcd9378c + - const: sdw20217011000 + + reg: + maxItems: 1 + + 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. Compute 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,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 "qcom,wcd9378c", "sdw20217011000"; + reg =3D <0 3>; + + 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 Fri Sep 25 07:22:51 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 2CF4A4BD0FD for ; Tue, 15 Sep 2026 16:57:29 +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=1789491464; cv=none; b=TTuX8Q1uSOqsPeS+3BCf2/78FakKDCuTNPnujt5T6avl+LKo0sTfvDrF5KgOXWsFFC5+6/qNHekbqOP6a5fm8dOGb0b+mwfsk0vj8rmTjhFBie4xo/mEiLelX/lhCLk0v9Q9/oT7Ge25d7Xe39GowPj3bkbEZKfxJPFWEhZhWzU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789491464; c=relaxed/simple; bh=e7hdMXUrh9xsnjg/6Y5lGekLK+ShLleveB/OGUmFlcI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QJKBUEpUln6tR0WT1UO27txifEkwRKYJcG1jns8UIBUkifM2cSTQVXS7ozdO9ke4V+QrZA6nSnq2YEpYI5Eghr1KbZig5pyRMvPw5lqqTHuLqFSqQL5kO/nVysz3tnEF/PU1KA1szBQTuxG/CB+lx3O96ceMC095Yrh3xLFRqAQ= 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=L4fYocZ5; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=H6I5o0Qq; 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="L4fYocZ5"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="H6I5o0Qq" 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 68FFAqGu3567338 for ; Tue, 15 Sep 2026 16:57:28 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= N7jchbywqNDghoVpGQ1KxJutSY/94t4tqmIvsun3zj0=; b=L4fYocZ5K2DBEiF0 EN4ovZFZCoT8QWD1EpdggovFK7iQFGSYw5yH1ZBlwATNuYe/3GYABGQ+n6DuoKrR 9ISikIIb/ubfgSC+SQKEoxAIKliiyFEMlDGxQq+K5+WGMdh2fCI1E2Hu388citiX aXEWC/74LmIYFtS445224XuqLL3QirLG5zshXiHCPgH3Cw3FxsS6UG9JHxwU7hNb qMfLcWEBaYl/kBfnmLjXAe4EhHjktC5dEgS5HktwhkvkJlHqN3DdQ1bf2DXEbLaX tNLulrfPC9tjObfRa5rV3AilAPPbtM/4334Yh9LNLwFUok8Dz81lAUPSYDSg2Wj6 XEhpaA== 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 4gpxydb4vv-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 16:57:27 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-93a183a0e93so514206385a.1 for ; Tue, 15 Sep 2026 09:57:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789491446; x=1790096246; 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=N7jchbywqNDghoVpGQ1KxJutSY/94t4tqmIvsun3zj0=; b=H6I5o0Qqg+oW5JlRkQ1SuYRH6HnAVQDk5bymbD2u1lAyejVo83TKZ7z6Yb3+GzjHwa L/Th1y7pjiTqa3WSqCupzJoNm56Zn8XBjWIbWFOvE8rHM08j0cAIcQnmeWwAdXS2l6EV kqtfHb3BUgXn6o1wx6EFVAiAJBBzhIoIzqZjxPorABAJ4XWiF3T2rKmbomtB7pICrRS8 tgvn4XabIuBRM8xroWy6BhX3F1JKFSJSeIMylOCYelLrDNbZkuliwrBmfADjw5SP4cyh IhwuYLzhYR5kkFvigUCEAfPmrn3SUXg0+xHnmAnVav1aAMMhgNr1CHSFukSr3YPueG29 x17A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789491446; x=1790096246; 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=N7jchbywqNDghoVpGQ1KxJutSY/94t4tqmIvsun3zj0=; b=CwTO39vL1sJi45rBiEYUejXmUIRX/Vfkx6ljpRYAS7Irmb9quCGHKzRHFJalZq99AR M3fGD/CbGe4238LdiPP8KciKux5BRC+JpR55jXMJh1midDmQ1EhJxgBDLoTJ/Ajv9hPn /SuFj7qKV7c8/pEus5IyhyMg4m/h0AtBU0lGSeLGDrfHuDnpaOxzjJEs/m6gbduQh5ee +YqEt8f032jbLLfmjziRcnAzzUOPXBeVwqa8MGozD49cRJvjFJ5N8oED4RT7A3PKmb6n k9/9oseD5GwIt/7ktCYr+7I8ix9azOddahmPLPZurICrfd4IuyezneCW8m2amAlXoNzw HSlA== X-Forwarded-Encrypted: i=1; AKwUvBwOCMG7YKfZ6d+OWMZt1DXMfyd1r13xjDK0t7w0fkDqh+c1BV/VeOE4wqC4WDSuvAWdsEgfI7zi8sf0TSQ=@vger.kernel.org X-Gm-Message-State: AFuF++nZ8ZE/e0hIffaFtlVck/1319D1vX/ARmINuGzlVdhg1e/2+A0S pH5yY7X8XSqqMz4Lhx0ckbfIgygd1EJkS4DOO8ajzF2CQKwsGsmjicaOZtvLKmM5Q8ZmiKEj+Ny caV2w4ZDInXMLVqOWgfujARprY+o7pRWia8S33oOEtgUkXVbNScCx5ylzNLC85AQYQn8= X-Gm-Gg: AYBFou2XgTZeKqpfVj4gNdWWzP4yhGOmCO7l8wb7P86Ldb+UVQELAmHJQUO8yyNxXoi 06loXmc9SuxI40rohj8a3h2cs0WwAt5EXwyrLbS+n4YOvUvTmFZRktnptj0+jVQEj14Nhth64lr 8hCpXAVK8XI8Po9jEAl712ttaVWT+LWcXJPXJzP/w1BQG1G2bAX3TGVuNiT3sbgQ8Rvasw9it6s ymo2VYkmqPe8JVdwLl94SRUcdbGQWzKGFVBOKtQrlMSQwf5gM8qbixK0YmSUZBDfkOBsGysVl2U YKo04Huu6OZdpGeyCXXRFxLI0UOY+k9V9kZK1g5tr/GyOBGWsQjKKVUFUfHeJ7NZjl9bNrXf93R bhA9FCmWB1sWJ3A== X-Received: by 2002:a05:620a:838f:b0:937:19d3:3fda with SMTP id af79cd13be357-93a40843a44mr241644685a.28.1789491445625; Tue, 15 Sep 2026 09:57:25 -0700 (PDT) X-Received: by 2002:a05:620a:838f:b0:937:19d3:3fda with SMTP id af79cd13be357-93a40843a44mr241631985a.28.1789491444501; Tue, 15 Sep 2026 09:57:24 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49e83d9057dsm4361335e9.3.2026.09.15.09.57.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 09:57:23 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown Cc: Liam Girdwood , Jaroslav Kysela , Takashi Iwai , Pierre-Louis Bossart , Charles Keepax , Maciej Strozek , Bard Liao , Rob Herring , Krzysztof Kozlowski , Conor Dooley , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v3 8/8] ASoC: codecs: add Qualcomm Tambora (WCD9378) SDCA codec Date: Tue, 15 Sep 2026 17:56:50 +0100 Message-ID: <20260915165652.914893-9-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260915165652.914893-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260915165652.914893-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: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfXxbT6/ZqbXW1J q0qJz/Gx9zIjwAlE5u2LSUW1seYydyfaDmm2wwK9bjK75qNLNJLqt4vzBSVfSM4AUBCtoRHIT6E 8qDQYAdzwdQyiZp/xUm5fT0sxZ72els= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDI0NyBTYWx0ZWRfX8idWAnaoHTFT 0l9uNQEX5z6ItT6/Xo/W+ATrSa3guT//VJdOlbAX/PCAp9tza2s2vwkS0vjMKzBxWY/w/qTXP4T viY8GePZhmAdlcoZQ+T7fzgbsHAEuiS08uq0ikAs39coK98pwEAXtVrAN6fIyOOEj+m2N+1uTH2 HYUNlboR5aIwJhSloaC7Dqdx3w84q0hX5+CHXHq6akeTE9PGlcvk68W9WJRXw1MGHW0BFYq0sIU ZtqqDsHMdjdkkD5/frTKCqbAfxp8okFQRQjBCWrHhUYxJrH0McUNtgksWFzX0dZJWSvddZPlYLV qwaAbUpKlD+b8HHQa1hlOOFI3Ysyd8FqC332t4On5E7WDY/Tq1q0iVUIqtydYBY/d3U7UrmGSx0 9/+NSSw6PSjQRBjmW1SmDoUkMD1ukvHIPSK99ituSbwN+BBEJCFqb8GuD1Blncyeduic6Z3TlM5 NYjvrmveVeDXRhf3+yg== X-Proofpoint-ORIG-GUID: SPcNhyjdTpCyZoNLSDc7_pOebXtj1rfv X-Authority-Analysis: v=2.4 cv=LYepeTfi c=1 sm=1 tr=0 ts=6aa978f7 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=UQVg2PY-1-kmtSd4NYcA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=O8hF6Hzn-FEA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-GUID: SPcNhyjdTpCyZoNLSDc7_pOebXtj1rfv 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-15_04,2026-09-15_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 clxscore=1015 suspectscore=0 adultscore=0 impostorscore=0 malwarescore=0 priorityscore=1501 bulkscore=0 phishscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150247 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 fixed at 2.75 V (SDCA MIC_BIAS index 0x5) via the static init_table. - MBHC-based headset jack detection (not wired up in this series). Implements: - sdw_slave_ops.read_prop: SoundWire slave properties and dpn caps for the compute-mode dataports. Supplies, reset GPIO, and the vendor TX PDM clock are set up directly in the SoundWire probe. - sdca_class_ops.populate_function: fills the SDCA Function data (entities, clusters, init_table) from static tables. Binds SoundWire slave id 0x0217:0x0110 when the qcom,wcd9378c variant compatible is set on the DT node. Signed-off-by: Srinivas Kandagatla --- sound/soc/codecs/Kconfig | 11 + sound/soc/codecs/Makefile | 2 + sound/soc/codecs/wcd9378-sdca.c | 1005 +++++++++++++++++++++++++++++++ sound/soc/codecs/wcd9378-sdca.h | 20 + sound/soc/codecs/wcd9378-sdw.c | 52 ++ 5 files changed, 1090 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 d3730c4da51b..a22961a0f73d 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..b78293114fbf --- /dev/null +++ b/sound/soc/codecs/wcd9378-sdca.c @@ -0,0 +1,1005 @@ +// 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 "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, + .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, + .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, + .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, + .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, + .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, + .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, + .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, + .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, + .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, + .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, + .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, + .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, + .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, + .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 }, + .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, + .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 }, + .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 }, + .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= }, + .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, + .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, + .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, + .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, + .values =3D ctrl_xu42_ver_vals, .has_fixed =3D true, .label =3D SDCA_CT= L_XU_VERSION_NAME }, +}; + +/* Entity 7 (SU 43) Controls */ +static struct sdca_entity *entity_su43_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_XU42] }; + +static struct sdca_control entity_su43_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_LA= YER_DEVICE, + .cn_list =3D 0x1, + .range =3D { .cols =3D 0x1, .rows =3D 0x2, .data =3D range_su_sel_data = }, + .label =3D SDCA_CTL_SELECTOR_NAME }, +}; + +/* Entity 8 (SU 45) Controls */ +static struct sdca_entity *entity_su45_sources[] =3D { &wcd9378_sdca_entit= ies[QSJ_XU42] }; + +static struct sdca_control entity_su45_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_LA= YER_DEVICE, + .cn_list =3D 0x1, + .range =3D { .cols =3D 0x1, .rows =3D 0x2, .data =3D range_su_sel_data = }, + .label =3D SDCA_CTL_SELECTOR_NAME }, +}; + +/* + * 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 }, + .label =3D SDCA_CTL_REQUESTED_PS_NAME }, + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .is_volatile =3D true, .label =3D SDCA_CTL_ACTUAL_PS_NAME }, + /* + * 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 }, + .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, + .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 }, + .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 }, + .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 }, + .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 }, + .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, + .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, + .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 }, + .label =3D SDCA_CTL_CLUSTERINDEX_NAME }, +}; + +/* Entity 0x10 (PDE 34) - manages IT 33 */ +static struct sdca_entity *entity_pde34_managed[] =3D { &wcd9378_sdca_enti= ties[QSJ_IT33] }; + +static struct sdca_pde_delay pde34_delays[] =3D { + { .from_ps =3D 3, .to_ps =3D 0, .us =3D 30000 }, + { .from_ps =3D 0, .to_ps =3D 3, .us =3D 30000 }, +}; + +static struct sdca_control entity_pde34_controls[] =3D { + { .sel =3D 0x1, .mode =3D SDCA_ACCESS_MODE_RW, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .range =3D { .cols =3D 0x1, .rows =3D 0x2, .data =3D range_pde_req_ps_d= ata }, + .label =3D SDCA_CTL_REQUESTED_PS_NAME }, + { .sel =3D 0x10, .mode =3D SDCA_ACCESS_MODE_RO, .layers =3D SDCA_ACCESS_L= AYER_CLASS, .cn_list =3D 0x1, + .is_volatile =3D true, .label =3D SDCA_CTL_ACTUAL_PS_NAME }, +}; + +/* + * 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, + .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 }, + .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 = }, + .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, + .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, + .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, + .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= }, + .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 }, + .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, + .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 }, + .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, + .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 }, + .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 }, + .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, + .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 }, + .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 and compute modes; the + * qcom,wcd9378c variant compatible identifies compute-mode + * nodes only. Mobile-mode nodes carry the plain class-ID + * compatible and are picked up by the mobile driver. + */ + if (!device_is_compatible(dev, "qcom,wcd9378c")) + 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..4e03bb2d9509 --- /dev/null +++ b/sound/soc/codecs/wcd9378-sdw.c @@ -0,0 +1,52 @@ +// 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 +#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