From nobody Fri Sep 25 23:54:04 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A408440A0F for ; Mon, 7 Sep 2026 08:38:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770312; cv=none; b=uCE9lo1hQ3l+1rGK+xsZw78ECAsa7C5WGm7V2mMl846N3sq8P2yFoE6GfgUrq2XoeBQqJjQhzhFckwHAGiRguw/BMNjhMmGS/QSTvP95RxqIOsbbl/7H/5DZclFBlXIZ3dSnWAo3sWqV91T6/uhWIWfM6q3IX+nA006QzJVAfG8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770312; c=relaxed/simple; bh=ziCjRvS8TtdVYiLj4p88US3Q9YZrXTSiDrYmN2e6/A4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=e7Tri1QSqZIE7l43CwRNUC4R5GZhMrNsFqBd62kfSTo7bfZit7V7IBWIAZnPUlntTZVPNnHucQA9y5rLfOeVsNK1YZlDX3vjTTbxAzwpbx7ti+5MUwrNJlVBvNOfIZJbnzwP0aqhyZI61qKtqvAueOPysGstOZs1r3shqBefYXA= 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=hgyNXKab; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=UOtNjfC7; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="hgyNXKab"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="UOtNjfC7" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6877p8K73657693 for ; Mon, 7 Sep 2026 08:38:29 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=uwZCEZhplYW S8qCNm5tYopBzZBRREgKD5gOszws1oY8=; b=hgyNXKabhOsexxnpyh9VBGqls9b mkalo4AxGOHwci/hU22eYviw6r92j8s2T1qBwoiZby2jqYTXLO1St4tbBrdFhNPz CB/lF0Mxp+b4yjhIeGg8+j1+f1zBmA0SJsz04VKqoOZoZnlTcNzg3LFQpxBDLPLw r1D1zmj5YytJDn7DsObjZNmsuizm72CBdYEM5EulnkLUTXkVtHMjrvXB+rS4BDO2 pH4p1hht+SNYSiqSG141Hn8orm4djkjRZ0nv7gYRmenDTYWIoNY9L/mtAp0qvOK3 vMJ+KyTNirswGRUKq/oT9Z6Vvd/mBo9RzZ6Bnb/LiZi8zi20vYh+mOZ3wPg== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghs86r6pk-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:29 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-92e4f946461so623202185a.2 for ; Mon, 07 Sep 2026 01:38:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770308; x=1789375108; 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=uwZCEZhplYWS8qCNm5tYopBzZBRREgKD5gOszws1oY8=; b=UOtNjfC79I4HSvU40bIrzoUtkc0s17rmT185p/E3qkrqW6VWtoz+nEF9BkmpbMtI2v I2ve2Uli6HKdrSI2/Hxa9E8RSHJ4jk5IcJw1K9bkoxM5GaI1jAbrRXKXi31ShraABG2g GGRRS4moC7D5gjqELfPtkcn0PU+F3TqkTEySRWfOmQShv1fkDXZBogNfZWDoTrAflINj R5Mdrj3uz4Yr5jHvQGzGF5wIYQ3pSRVhPFDgZw2CkQ8v8mU6u5lmyQz9yZy2HnLUg9le 0cIhc5f0Ecq6UrLbj1vPbbSyYTlJK50E3k//2bk7Ud+R4C2Z/Va/3kLJN4LeBmtb6g5R ooqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770308; x=1789375108; 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=uwZCEZhplYWS8qCNm5tYopBzZBRREgKD5gOszws1oY8=; b=mbUB/DwH+DdtbI4+eZLFjkh6fJMXD2I9c4nTsVFeFEdrYvEK8mPzbpt1FfDyN5KO2k HgIwCF74+z0UKp/EahmsPBV8P5b6wgKhSY+JmUo+Ub7qLnTgxyk9x+Zhd5Q0dZ5Oyipm EN4ePpTN8+kwrsIB57zDQJudI/jOrpQo90CVxpOY/I48KsmXCboxxGXUsKGW8NRvH9U0 ioSTXbTeGhPT50p6YfpJ3AY030qzP0x2f6fNa+leeeLzPamwcQ3fmaXk8PosbDRXLTFl k/2gWLjouocs6ifN9rBTXxgVSRJqzsico7hFSFFn0R2ulO5RlETS4foj3wQwkuZaUnSU pJtg== X-Forwarded-Encrypted: i=1; AKwUvBzzDSZOsCyaKidyShYyUYzYE9rs+WSKCIAwSeBEgTx9K3d/ada60Ln3BcFQYQc39Pt08uZuhUzQPeqz9pQ=@vger.kernel.org X-Gm-Message-State: AFuF++kv5C2j63Ov1ce7TThLs7B04ThUIjKnjFcmlGQJmOt+oXqGxv8m TTkjllFzDmc84/EZ/fMnarVY7vQfbzi5RnUvaGDexLP3MztUFVPnLwG6CQFnQlEOafgtYeXhHMK 9UlB1SOD0je/ktvIhp4dkBRJmiOcQMlSwec3kuNUJL49ajJ4GcO65VOdIh3A2Spxhydo= X-Gm-Gg: AYBFou29oxM4GFFTPeHGL4RmHUCsoeujpk4xlxRhTKGovVHtV593ratHPctjBcR7yw5 kXIW8ugT7Md+oyMUefF+vsoQa4DY8ULLTr8ckHaQeMtGrDhC42fxa1LVY0tjdN44xt/MBTv2RJw DoRncK/+erBqkLBb/tnYmAYpLYHc7UyLlbB7gVIAvMgM4WySwaHYW1s/WeaclK0cyhFVCgykn79 aFGUbVzCnBL9UZ4+yJsBsXrvmMAe3vt/CBVsWRhQxcB36pUqT1iAU4dTdvC4tRtOY9RobE59jMn O9d+h4e895q4t7uuCdT+oQ1x97s2rb4EAHkLUo4oieeUC+bRti0HjBUwI1hLteOxStT88zIC+/c eez0nPxu9RxojUQ== X-Received: by 2002:a05:620a:22e3:b0:937:6d2e:d023 with SMTP id af79cd13be357-93980449a63mr1676775585a.30.1788770308507; Mon, 07 Sep 2026 01:38:28 -0700 (PDT) X-Received: by 2002:a05:620a:22e3:b0:937:6d2e:d023 with SMTP id af79cd13be357-93980449a63mr1676772185a.30.1788770308078; Mon, 07 Sep 2026 01:38:28 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:27 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 01/11] ASoC: SDCA: allow building without ACPI Date: Mon, 7 Sep 2026 09:37:15 +0100 Message-ID: <20260907083727.733705-2-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: Xqm7LyjcNCjtAc_4ITZUdqx-tOawA8KO X-Proofpoint-ORIG-GUID: Xqm7LyjcNCjtAc_4ITZUdqx-tOawA8KO X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfXykjmopI3gRvy e47CDgRaERFHp2+FAxiN8j9n9u+JCj7lksqu3C6yvJLc40slfThImdNRGohmWsj8zoVknZbNKC2 gE+0kP3veUKX9stP2V9qiOsOeAHl9lg= X-Authority-Analysis: v=2.4 cv=LseiDHdc c=1 sm=1 tr=0 ts=6a9e7805 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=gowsoOTTUOVcmtlkKump:22 a=EUspDBNiAAAA:8 a=RY6toyVs4qztpF5PSasA:9 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX46Hth2Vh5dXB X+8nxpPYbusSaPM88IwrCbFb9sd/gcs2wDnCKS1Rcu07x2pD6d8dZNuFmQcPZb7NW3kTeHe6BxE JUja4WSuOTkTBVH7qUWvWE29vWnepc5quUSq5Su7K82uDGRdml0EdBW1RIvMT48muNMu+fzN1G9 Cb/vUWsDngl13lKAnn8MVvIpwPU6SSNPqLO2T9dFhfQa4/V2IAop34gNRkkayB8FxCd8paIFhUn DKpx8jpoTZpM7QH+ME7mGBA45kgeODIASAfa8U/DppdcQ3M6X7xsM1usk80kVezIbgLmsANt3aU llBj39+T8lzgP75CQRy5xQ0v1+768OaDYWlN1iDHc/Bw5YSm9VMSYYF5Zw6f/qVWPXtAAngNnDd wLR5w4YMeIEGu5Dg7mpW0m0G1TAWbwax+jwWomRk6TH7tIq2Tef8MYDmthyTlUPcMCYKIa36MZy 7zpRD3NU6CnfV+Xo0+A== 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-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 impostorscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 adultscore=0 bulkscore=0 malwarescore=0 priorityscore=1501 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 Content-Type: text/plain; charset="utf-8" The SDCA class driver is useful on non-ACPI platforms where the topology is supplied statically via sdca_class_hw_ops.get_function_data. Drop 'depends on ACPI' from SND_SOC_SDCA and guard the ACPI-parsing implementations in sdca_device.c and sdca_functions.c with IS_ENABLED(CONFIG_ACPI), providing empty stubs when ACPI is off. Signed-off-by: Srinivas Kandagatla --- include/sound/sdca.h | 23 ++++++++++++++++++----- sound/soc/sdca/Kconfig | 6 ++++-- sound/soc/sdca/sdca_device.c | 4 ++++ sound/soc/sdca/sdca_functions.c | 2 ++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/include/sound/sdca.h b/include/sound/sdca.h index 2bdf4e333e04..db2672b3aae2 100644 --- a/include/sound/sdca.h +++ b/include/sound/sdca.h @@ -60,20 +60,16 @@ enum sdca_quirk { SDCA_QUIRKS_SKIP_FUNC_TYPE_PATCHING, }; =20 -#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SDCA) +#if IS_ENABLED(CONFIG_SND_SOC_SDCA) =20 -void sdca_lookup_functions(struct sdw_slave *slave); void sdca_lookup_swft(struct sdw_slave *slave); -void sdca_lookup_interface_revision(struct sdw_slave *slave); bool sdca_device_quirk_match(struct sdw_slave *slave, enum sdca_quirk quir= k); int sdca_dev_register_functions(struct sdw_slave *slave); void sdca_dev_unregister_functions(struct sdw_slave *slave); =20 #else =20 -static inline void sdca_lookup_functions(struct sdw_slave *slave) {} static inline void sdca_lookup_swft(struct sdw_slave *slave) {} -static inline void sdca_lookup_interface_revision(struct sdw_slave *slave)= {} static inline bool sdca_device_quirk_match(struct sdw_slave *slave, enum s= dca_quirk quirk) { return false; @@ -88,4 +84,21 @@ static inline void sdca_dev_unregister_functions(struct = sdw_slave *slave) {} =20 #endif =20 +/* + * Called from the SoundWire bus during peripheral enumeration; gated on + * ACPI to avoid a soundwire_bus <-> snd_soc_sdca module cycle on DT builds + * (where the bodies are stubs anyway). + */ +#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_SOC_SDCA) + +void sdca_lookup_functions(struct sdw_slave *slave); +void sdca_lookup_interface_revision(struct sdw_slave *slave); + +#else + +static inline void sdca_lookup_functions(struct sdw_slave *slave) {} +static inline void sdca_lookup_interface_revision(struct sdw_slave *slave)= {} + +#endif + #endif diff --git a/sound/soc/sdca/Kconfig b/sound/soc/sdca/Kconfig index 4c0dcb9ff3b9..72c02943c49e 100644 --- a/sound/soc/sdca/Kconfig +++ b/sound/soc/sdca/Kconfig @@ -3,11 +3,13 @@ menu "SoundWire (SDCA)" =20 config SND_SOC_SDCA tristate "SDCA core support" - depends on ACPI select AUXILIARY_BUS help This option enables support for the MIPI SoundWire Device - Class for Audio (SDCA). + Class for Audio (SDCA). The ACPI/DisCo topology parser is + only built when CONFIG_ACPI is enabled; on non-ACPI platforms + (e.g. ARM/DT) codec drivers supply the SDCA function data + via sdca_class_hw_ops.populate_function. =20 config SND_SOC_SDCA_HID bool "SDCA HID support" diff --git a/sound/soc/sdca/sdca_device.c b/sound/soc/sdca/sdca_device.c index 4bcd8d1fdff8..3f302bfa5457 100644 --- a/sound/soc/sdca/sdca_device.c +++ b/sound/soc/sdca/sdca_device.c @@ -15,6 +15,7 @@ #include #include =20 +#if IS_ENABLED(CONFIG_ACPI) void sdca_lookup_interface_revision(struct sdw_slave *slave) { struct fwnode_handle *fwnode =3D slave->dev.fwnode; @@ -45,6 +46,9 @@ void sdca_lookup_swft(struct sdw_slave *slave) devm_add_action_or_reset(&slave->dev, devm_acpi_table_put, slave->sdca_data.swft); } +#else +void sdca_lookup_swft(struct sdw_slave *slave) { } +#endif EXPORT_SYMBOL_NS(sdca_lookup_swft, "SND_SOC_SDCA"); =20 static bool sdca_device_quirk_rt712_vb(struct sdw_slave *slave) diff --git a/sound/soc/sdca/sdca_functions.c b/sound/soc/sdca/sdca_function= s.c index e01d91eb3cc8..47dedb62c24c 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) { /* @@ -199,6 +200,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 23:54:04 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BD0D3426419 for ; Mon, 7 Sep 2026 08:38:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770313; cv=none; b=pBClUNqtOHGuMQ/U0r9FWjQR1OUkOKFmusUQwnL8b6Y8Atw/ilQq44hkig/juN+roWl1EtcNHNs7oZXY+fbob4tuv0mWSgaFevIkcwbhXIHyPl9hAYNGIpr0wjDcX77KkbGpkpDDEHoWmsVmak3xhKMHE2+XSwa/EWP3194Jw8Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770313; c=relaxed/simple; bh=hYnwdQoH/bPKBbKKe6pzgkii5DIS6eF65mX2d7m8Pn4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o2lWYunhXye+2mvwWsKUfscCjA0DuCAtinu/CjWQkZGz5S8cW4smV5HjRTg4smiYffVaY/GEkmYEo+qF6Ov5SPXG6zKCvofn3xc/fPkEq4r27nh/JAo1A24hoeolvSFiHP1rB7RsY6KvlZNS44VurIzEcAnV6jut7xFJAwYMnoc= 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=YJaFVAwf; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=TW/8Zkv/; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="YJaFVAwf"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="TW/8Zkv/" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68777eiF3903337 for ; Mon, 7 Sep 2026 08:38:30 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=FRAWMnzsW7M 9ElavvxzLzIlh2SlMssELpYGgo7kMgYA=; b=YJaFVAwfheazDOQj94HV+W5cbz/ OpsQwKD0SX28kIAeSu2lc1PtYTGGrlY5AtVA0DjV4EfamJXH3ae3/KOsg/Jx7GFB pAbS6lkaU/q5vQ4C1My6m75zAhulBeHE/pU4fkulL5Co15534C1i0iQKLx5NpMhg wVdiB0Gj+EGttG4bzKkjs1db2lvOi5/krb70Qq+PcHognSsqsowxF+av/xBAfPQJ iSF/At5DhOqGi2yyHtsxeEzZQ67jQz+cq0nCerjbsCA3UGsLPfX/TRGUIf/imKpR 2FqoDd5KHRosQF7T2Vf60CUwmp66O3nTXsXXlfu1m5Cvb24dadvyGx90PXg== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ggany5xv9-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:30 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-930b571432fso515187685a.0 for ; Mon, 07 Sep 2026 01:38:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770310; x=1789375110; 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=FRAWMnzsW7M9ElavvxzLzIlh2SlMssELpYGgo7kMgYA=; b=TW/8Zkv/jQhdLvvlYndemCqNuwcgi1BRDdf6BP/HlJ1Be2u3n3N7pc1snD5YWtHSCn U2j3h18eciSrSQci1WPJKgbtiXsumP95gA3Nk2d4zxzs/ql4rRR7CIufSEaWP1cxaNlo 9P3LwwpdaeparEvMBvVAz+vb3/TKY9KBTDVrW9rxLAk0qUxOFSZdbRR7pDbUh8LznpAl fiFA+8Ah43jBtt+Of+fpH+/L8weaNaaCjKhFJzmljOvEuirGdUvQM+zHuTR+CKXV0TXp 31tqJC0iOiv9T7aswjjTUMumXh7+5yYemmB711M/IjJF6oys3sImKubUHwIUZ9UMlhi7 +F/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770310; x=1789375110; 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=FRAWMnzsW7M9ElavvxzLzIlh2SlMssELpYGgo7kMgYA=; b=qMoA4pXvLV5X3k7aAP/lOZVjM5idW+DnWZNEY7KCHlooHknGArc/n0/GUT7YDCF5ZT L0hNZQtkgzXZ4qv4tAySqCLxPcgJH675JkcBuC8nB7r8gA0V7KsMgnNILIE0294SXDPj 0XBDYk5dXT+8KjusIKv2ymqsjNBLiUJ1cpnDXXEWCKOATvHMLCt9CFwVp771+826FgOq kql78jHGxbwVwogBICpW0MWD39rEs9T3hO6fqCNh2mclZOreALaTewhambIHz5oAB1vF uC3s2es1gJ1hgSEgZnQRNdwgDD/rKly2xrtkGQb66qdoir0aqZxt7lrWipkmAZbgiLET lqqw== X-Forwarded-Encrypted: i=1; AKwUvBwSUpic45MRuswH2QR0cseYjfxAgndeQj66BN/FFIg9chtSQ7qtoqtZa4IS9gLprAPamMeh/TaqZBRAMvk=@vger.kernel.org X-Gm-Message-State: AFuF++mJRRF/4hHm2m3IsBWunnsoJ222NdGoySxJI7uhMismsXEMwFL6 PP6n7g3/ct4SntDaKN5kWWr/ZuyLV12x+Si4OAhcfhzAnsg2iFi2Qr2a3QU0EdmTsExbiLR30z4 v0aJOEGGXKVYmh5FHlyvc7w5OwSRdp6HqWY9VtZTDPHLwF1hcGOVIrAJxVTcJZkhFVNk= X-Gm-Gg: AYBFou0qs/Fp5HKeqmbWWvAiwUTqbNkRopofXmyunzOseNvOxvbEfBPVcE+Xo+gBL6/ WqPsDbIkUZMWeCG6D9Bb/pG5+SeESFbtM4/8+oii2H6V6Og62gc9RE46XpNCxJsjWyEf9opwN3Q SVHvr7yL74oKTTs3x7B2gFekjhGmHUT8LZhRdeVldbBeHV4oCk3+OQxVbwUcnnLmxmeoSUxo3tW mvRFI28drJO2pHKSJkATtzcg1dgqRfRHmVSxWVjKiIh9ZWyUi0BEyhJMfTxVd8JcAYKWQwlHvuS gkWzXLyO5fDNlc2W3jirTvfczBWxooISWlWpAcXHh1TV6qY8nm1/oWZAxx9xPNlV7iveKLj6KmC 261ulib+EtQn4AQ== X-Received: by 2002:a05:620a:4106:b0:939:72cb:baf1 with SMTP id af79cd13be357-93972cbbcfbmr1935132685a.40.1788770309959; Mon, 07 Sep 2026 01:38:29 -0700 (PDT) X-Received: by 2002:a05:620a:4106:b0:939:72cb:baf1 with SMTP id af79cd13be357-93972cbbcfbmr1935129685a.40.1788770309534; Mon, 07 Sep 2026 01:38:29 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:28 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 02/11] ASoC: SDCA: export PM helpers keyed on sdca_class_drv Date: Mon, 7 Sep 2026 09:37:16 +0100 Message-ID: <20260907083727.733705-3-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-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=X45i7mTe c=1 sm=1 tr=0 ts=6a9e7806 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=3PQulrMEHypX3zRcvmEA:9 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-ORIG-GUID: cCTIKDAYsT9BJDIvT37-4hKUqpPwMZMd X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX6s2nqmJ/i9A0 jUFQwcPghpHV5cY6CD3+nKKZZ6rs5hB57MZHnNRY72dck6T0hNYnZwa1/xWI4/PmMaDV/YI17Zh 1nByVTQiDC1G1oIOw8xT0nNYLlFZ75uELLMi5kKkN2G9K1NfWeP+1u02re2fLvgAlHsQWYa8ZpR 89m+Gh3U+whUz99Kkc1pEwHWS4hZljisagpZGfSJ1hnQQ+gepc1kuBm19upIo6L73vI6mI9QG9F pWFyDfh1H9Q3dXG600S92UbuIcIfGiszTsYwx3L55GCLavt9+itzguCepvul/h78fLgEXBPrSbk ML7kCIkFxbpk8nytxj9gCvyDtVcpUVBxy0tw7Wo8yJT/v3NA2Gw8InxI2kZ9BaFZgrzPr5NFDi3 wA49O7DYa8Sw6i6lYK5yimOEykIDmd24cfDTyYWZlkyjG+bjho81T149NVi7TBcJKzj7tBzPTh5 BLL6uPdO2mpJL2fRCAA== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX5G+wB7NJy1Kc cQq8AXngZ0YUOxQ0E+5EvyuqbiL9iuTbFHdc71MS2+6UuAiZEjJFKfeJ3N1VjLkIOnso+ZpjBWW HrcaZ3LI7LUqmR6m2n1HoThRqlW33OE= X-Proofpoint-GUID: cCTIKDAYsT9BJDIvT37-4hKUqpPwMZMd 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-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 bulkscore=0 suspectscore=0 clxscore=1015 adultscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 spamscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 Content-Type: text/plain; charset="utf-8" The class PM callbacks pull sdca_class_drv out of drvdata, so the built-in class_sdw_driver owns the drvdata slot. That works for the generic case but blocks codec drivers that want to embed sdca_class_drv in their own private struct -- they need drvdata for their codec priv. Split the four callbacks into exported helpers that take a struct sdca_class_drv * directly: sdca_class_system_suspend() sdca_class_system_resume() sdca_class_runtime_suspend() sdca_class_runtime_resume() Codec drivers can now compose these into their own dev_pm_ops without going through drvdata. For the built-in class_sdw_driver, add small dev_pm_ops wrappers that fetch drv from drvdata, wire them into sdca_class_pm_ops, and export the ops so any generic SDCA slave can pick them up as-is. No functional change: the built-in class_sdw_driver keeps the same PM semantics; only the internal plumbing shifts to operate on sdca_class_drv instead of struct device *dev. Signed-off-by: Srinivas Kandagatla --- .../soc/sdca =3D> include/sound}/sdca_class.h | 19 +++++ sound/soc/sdca/sdca_class.c | 82 +++++++++++++++---- sound/soc/sdca/sdca_class_function.c | 2 +- 3 files changed, 84 insertions(+), 19 deletions(-) rename {sound/soc/sdca =3D> include/sound}/sdca_class.h (50%) diff --git a/sound/soc/sdca/sdca_class.h b/include/sound/sdca_class.h similarity index 50% rename from sound/soc/sdca/sdca_class.h rename to include/sound/sdca_class.h index 57f7f8d08f49..15a180385202 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,22 @@ 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); + * } + * + * The built-in class_sdw_driver in sdca_class.c uses sdca_class_pm_ops + * directly because it stashes the sdca_class_drv in drvdata itself. + */ +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); +extern const struct dev_pm_ops sdca_class_pm_ops; + #endif /* __SDCA_CLASS_H__ */ diff --git a/sound/soc/sdca/sdca_class.c b/sound/soc/sdca/sdca_class.c index d7444f442c71..88a29116a334 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,11 +283,39 @@ 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) +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) }; +EXPORT_SYMBOL_NS_GPL(sdca_class_pm_ops, "SND_SOC_SDCA_CLASS"); =20 static const struct sdw_device_id class_sdw_id[] =3D { SDW_SLAVE_ENTRY(0x01FA, 0x4245, 0), @@ -282,7 +328,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 cc7045dc26e6..10a2b031b572 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 23:54:04 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6668E43BDDA for ; Mon, 7 Sep 2026 08:38:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770316; cv=none; b=Mx0xX2FLpaXJnis1s98+bLA+dfnMbF8TzOWMTN7vDmeKNeTU9VY/YMb/Qpr4+86VawejWmahm+c/lzwKrG4VXG34jHZRyMgEnNj6BIwdcGdaeaTJagGm5l+NtqEIRED6BFlWx+QsZm9WK5xawj6+7FtqqcuvPe7hkEO94mhF/tg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770316; c=relaxed/simple; bh=cYyZuliuvTTA0LecfvBO89TbFhpv37LsqPXiOd2CHoQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YQmo4/A8eNv/msxn/bYgF2Ka9+r2Xh1UrUT13J45Qu7UTpsoexvJMFezB1LqzzrNgnZDwue8ccI8BWDJbpYLB9e5Kzg8UIREHMiOZc/z3mNcJi2pYtERM4vqJHTFB5lpq4R2bl9KzjRZKm7nzD3BMyGGqJib2axzCqANNQTnQB8= 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=mtG//AzY; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Ao5ossfQ; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="mtG//AzY"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Ao5ossfQ" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68777Oed3352542 for ; Mon, 7 Sep 2026 08:38:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=kDEMgO+fxBh eFl09Qo2A2eotuWYnf9xrAwMlkX76HAE=; b=mtG//AzYesa++hDIOnEFaPVK+G5 rLO4MsYlnwe8o+3+3P8n1XeP2bjPd0Zf/LnB1vSRHqdKnry2/JPULaqaDlyD6/eP h5UxRTF26S6XP0UB/NJTdbghuM75EnPz3vOBUwnRxQVFhLkjgkDQBDlgYGiTlTHw B7S45qnMEZIA1mvjHB+9k6JklMIyfYhQi50cleJA6FnK6sizYujYdsgBkOSIhyha Utn5GcT5f0YF0ydngeiaF+bb8wk5nBlsnxPsxZq9i6K7r5lOORfbi/ZUVjYy6OU0 sGe35pvCcRwcKn8xmAJXwKAMa0XyBxc4Ow4KmqOKH9j1i0SFaSLs8+7pCKw== 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 4ghq66gv08-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:32 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-939281526e1so224181585a.0 for ; Mon, 07 Sep 2026 01:38:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770311; x=1789375111; 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=kDEMgO+fxBheFl09Qo2A2eotuWYnf9xrAwMlkX76HAE=; b=Ao5ossfQ5fGWj7NkCr8NbJKkAgD7N5qbEJCfXt2bR+5YfsXuR/IpHdb6tqTByX3+hA sRrIcJtiP4vmIzt+Pkf+R0tKusnvoujvTjFPPnD6ygA1F6kR4fuDDQIQitU5O9S8ZWLF Y9B1QjjLdO9HcjQlSTlcRZa3749QAgJIiNxBrNARKgqiIVG0xqb0Uz8AbNK5cwEYZDUa OJKF1Bigo1mx9eHE3/f7CQ8igC2w6VFTBsE2VshgmQ7IvE0xM8RW8/JGIB3P4/Tz6ApF j0zr0NhqefT+sk9Xe0nhrO46XcgI7Hyi4KMSaBDljjG5LI1cmiwUXFgOxZKzphamRfc8 6sUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770311; x=1789375111; 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=kDEMgO+fxBheFl09Qo2A2eotuWYnf9xrAwMlkX76HAE=; b=N8WuwtPy14TqR6cpwZ4esN5+QJ7oK9eflx1X7tw5qbtArNgZ+vDlCIVq22zfePs5C2 fFlMrPToMZlilcHzH61mGHudhFiX6RRY1mpNl3beYqQ7cBXa6vUGCO98PGZhISFODtbB gsg0NtPuZ294N+7wcYUMj7Co9J86qD7047tCzA3ibcdYg2+vLtxfQaYD8QGZgcIMMHHO s2fTO7xxr+6aCnMv+fJmoTO24jUI+deAI4s5BjqmEbhxwkILKNC0zTjiI11BidqndIF7 NzngbEnxdKW9rvzhbj3MyEy0BJUJO3hrb6913YV+MpVNwiLdHkNYaAIWtnvPmhn5ikPu jGhw== X-Forwarded-Encrypted: i=1; AKwUvBytyIkyP0BWviiluMKgSnxa3dVCILB++dIc1wh9Rw0l/DwRGmd1NgvXtTIchi3sSe07C0szhQJvNEnZICM=@vger.kernel.org X-Gm-Message-State: AFuF++k6YcTv2R3YnPaVztZ7G7uB+S+sLg0nC8TfxqFgR7mZ+wHpTnc2 12lO0CTNro+y/MOvUSmB0bfen23e3c0LVK0XuM/XkCPpJZ7dxC2hEUpPsJuFUMwd9vDb3FR0q3n E7DbzGkh6B+q1ax6xZkO3F9WqT8Ck4TyviHeXIslUbOcXpdJBPy92UMEMXSGBOBM0J5I= X-Gm-Gg: AYBFou2JhA+hJ/V32+8e+zenCYsXenYwhCqXceuhChbURea0EPY0WS6sA2inzf7KwYK Z6DkKtEVAz/foZCoHQLT1aOogskgYtyf7D3k3W7zbDoUec7+ZtQjHw7+BX1AnjRQ282ueFV93sd jA5jmbjOT2XIf08bPkOUkyqHjP7rNnhqjlg7siSm+wiWnr4VKF41PcmWojvENGrdG9shIxYaD2X lXeocfDPK8qXpP5qJqIu9sg1+rf3aDxbThFyyIz4IGTWKWURjV65D5zDeLZjYezkczvfCvoydoP vuNJBQe4awB6LErBKWY0ViMCF/frLremNJdXjSifb/PJIY4XZrxQ7BccRCfJmRg4GNyPVhwdgE0 enRndbeT+RroY+Q== X-Received: by 2002:a05:620a:1493:b0:937:1538:6b93 with SMTP id af79cd13be357-9398053a24amr1528624185a.40.1788770311465; Mon, 07 Sep 2026 01:38:31 -0700 (PDT) X-Received: by 2002:a05:620a:1493:b0:937:1538:6b93 with SMTP id af79cd13be357-9398053a24amr1528622285a.40.1788770310950; Mon, 07 Sep 2026 01:38:30 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:30 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 03/11] ASoC: SDCA: expose class SoundWire probe/remove/read_prop as library Date: Mon, 7 Sep 2026 09:37:17 +0100 Message-ID: <20260907083727.733705-4-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-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=QPhYgALL c=1 sm=1 tr=0 ts=6a9e7808 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=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=8jLOb54Wr6f81qLreb0A:9 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-GUID: UgRTVjx3iqDLfjME73yNQZ964-ta7_Zu X-Proofpoint-ORIG-GUID: UgRTVjx3iqDLfjME73yNQZ964-ta7_Zu X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfXwRu9Y0yqbjHJ kszzqMOmQUzNmU0xXc9g/U6BtBzSKbqdiHVe2R5VcBcrD49p/+ed7pMmPgjWy2a9BUu/hcghmx5 xjAyOMd+QdtEAS6nEXd1Kl3U9nX7CFE= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX9F+aepaPxTv2 UW6YKLq3y54sdh3rqUX1SlkC2FjR8IpkS0e3BsBQRoaxQVq4M/fvLdhsmH84S5QeLqoyVNaN5ap zC8mz38XBiRo+KKDajGGkhPMk0PBwFNs63Eg803AEYvYySMLL0y1i6XwATEwx/4P1gnrgk1jQBK Oll7mdKMg5FwvpUzvbtopbZaQocy08k5+wvZasqjKr6zZOZSaGqaDPsNEEjb1/vQqttkfffbPqv bHf7gEMaRIauRWYdUa16BvgLX5iH04FBeru0WqlbWjijvyK9xR4pveE68VmpPkd1L2ZZJIIasvC Z4hGytz5rZ7y7Eq6vKkw2JA3RJ9lc33zNmqaBXAQ8qM/XPf6B4ZJ1PTIM0B5okRQBYS6+Aj28YM efqqYo6jcFNsrkeJNkE7EgVpITiu1j9numfFlhogCvTmpAURdrP3fI0urTolRdc0Wh9hjQWfqC9 wetZh0P/kIFMNVwQ7hg== 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-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 adultscore=0 spamscore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 impostorscore=0 malwarescore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 Content-Type: text/plain; charset="utf-8" Split the internal class_sdw_probe/class_sdw_remove/class_read_prop functions into caller-friendly library helpers: sdca_class_read_prop(sdw) 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 hw_ops mechanism on top. Signed-off-by: Srinivas Kandagatla --- include/sound/sdca_class.h | 5 +++ sound/soc/sdca/sdca_class.c | 75 +++++++++++++++++++++++++++++++------ 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/include/sound/sdca_class.h b/include/sound/sdca_class.h index 15a180385202..c6063f22be7a 100644 --- a/include/sound/sdca_class.h +++ b/include/sound/sdca_class.h @@ -33,6 +33,11 @@ struct sdca_class_drv { struct work_struct boot_work; }; =20 +/* Library helpers used by codec-specific SDCA SoundWire drivers. */ +int sdca_class_read_prop(struct sdw_slave *sdw); +int sdca_class_probe(struct sdw_slave *sdw, 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 88a29116a334..b952fa6eb802 100644 --- a/sound/soc/sdca/sdca_class.c +++ b/sound/soc/sdca/sdca_class.c @@ -24,7 +24,15 @@ =20 #define CLASS_SDW_ATTACH_TIMEOUT_MS 5000 =20 -static int class_read_prop(struct sdw_slave *sdw) +/** + * sdca_class_read_prop - fill SDCA-common SoundWire slave properties + * @sdw: SoundWire slave + * + * Exported so codec-specific SoundWire drivers can invoke the SDCA + * common property setup from their own sdw_slave_ops.read_prop, and + * then apply codec-specific overrides inline. + */ +int sdca_class_read_prop(struct sdw_slave *sdw) { struct sdw_slave_prop *prop =3D &sdw->prop; =20 @@ -36,9 +44,10 @@ static int class_read_prop(struct sdw_slave *sdw) =20 return 0; } +EXPORT_SYMBOL_NS_GPL(sdca_class_read_prop, "SND_SOC_SDCA_CLASS"); =20 static const struct sdw_slave_ops class_sdw_ops =3D { - .read_prop =3D class_read_prop, + .read_prop =3D sdca_class_read_prop, }; =20 static void class_regmap_lock(void *data) @@ -136,18 +145,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 +181,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 +205,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; =20 + /* + * 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; + + 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 23:54:04 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 035E7443E22 for ; Mon, 7 Sep 2026 08:38:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770318; cv=none; b=IvZ6A+eBQ2maG5041KyadWI74SmvT7GCXazzIw7fg1ErEbNaVoe9+udcMec+o933rO+te8nWqxZ5LbL0inR+KDxVacmPLTfczAxuL20f7nyBq+XIaSKCgnC9BT33vhzqZGQJsevYwPuHg+Vb/dUvzQ3uWnqgg0eCe3KsbxaH+As= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770318; c=relaxed/simple; bh=0p8RCwSnzJRObH4V/hHmFZHqxqK5DRlHfnAXqVAAiug=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=icnv4GQfsevZp5nMcHLqHWBJIElxFUkUopZNdkJKGxyfeYu5SZ8TRNiDfno8w+A8jynDa7ONO5CGGKC1b5JjptalwcqlLC4bMghUUMixbFZPoDIuLCxM4KncZSIXoKCWXmWWD/Ok5EGV3mbNjOzeVPl95nNX4acI/0A6xcF7mys= 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=CoznclFE; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=JCMVTTJb; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="CoznclFE"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="JCMVTTJb" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6878Rlg33872901 for ; Mon, 7 Sep 2026 08:38:34 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=KnWk5w0YLVl dL/piP7sv25BHvbCU7XI78c1SRugNzqo=; b=CoznclFETHq6gWvcrKGdkgzdVJU WbpsZDKdBktY8kDNvmkx5luylPD/csggtOcPR/1pXl+sSG6GHAsU1ELmp5TCyMZs 9F68IFPvKfkTl5ObXNP7z/80kUXXD2lizwpDYxkdDc/NkgsJ3A2UyyZwcaRRPMIT NsxVljG8u49+ZLHXMa//Yjsmvd/piOq6+xb3P6bgfnDXi8/YxCRB6uxG3hDb1pnO aQVVBqLVhmcn55iSEiSObcF7bD0/wtcCTQqnwCw9wwaeJPIPqRSQgVeGKE+Sbjis /ERbu/vzQlmxKb1fRllczOKPznPoPWjhFmLbwiHy6bzPNe1Pdb6VbgqTocQ== 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 4ghssg01qw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:33 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-939a6937513so116726285a.3 for ; Mon, 07 Sep 2026 01:38:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770313; x=1789375113; 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=KnWk5w0YLVldL/piP7sv25BHvbCU7XI78c1SRugNzqo=; b=JCMVTTJbhi1OjttUteLVQskqzMpTTrqb3S1w/PYZ0WqIttNQIHzA1HDyn+3xhi+yQa PkB4w6owidsbh8FGq0cbldZ1V2OJcrl70rNrxLJ9WDXz2q7lslB6IiWeG6eIvi5CXmml rLQOLcjTSLtyRjkv/4Ko+jFIX1eF934xvUGZuw0xhXPiv7R5Va7XG1HdL1FvnPZpFVhe F9a4BlI99ndZmofwgwnuCT4C/aDGwj0HEh+yLddhAviO3JFcN9iI7iUAD1kqheJ8J34p tecU9L8Nh6F4MbNIssmpVz2hV9AyugV1UNemCTDzy1lhDUa0aQ+5D9t7vd1lXSozg077 DboA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770313; x=1789375113; 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=KnWk5w0YLVldL/piP7sv25BHvbCU7XI78c1SRugNzqo=; b=QidFggmXAiJ1ar8iuc6TqEwTVRMQsI3L+ZlQwdoCgTkf8HsRqBX2tyIiMprO7StIFY C4LHQ5O8GR2vZ6mp0lYQsvALA89rRuigirneXLCdjUjmbkbXK88Hf9S3GsHIpRnxf3+x E5Mq0+8qfxK0/xF1o6OTQ/6Me5jF4EIVn2WvI7CXgXIRpHGgQxU8jezzQiLSAjNZfOju xJ6qpJ678UMjGZNWepkZqGvVC/cqbePZr5uX3qQFVy6SimwcBdKH/XCsG9ImjzhMr/rj YYsuaqjTmOt0EsPasKdCCI3mfV/EnYGyx7BkZ3Wp3F4N5+VYCXlOJ2PFEDXyOV/ZC8Mz GAWg== X-Forwarded-Encrypted: i=1; AKwUvBwNkVR8fbKv+YdsnRbZnScHLnJFslTV0+wGK11o1LTj/NljU2kf1bGQ5xwDXDCq8K1b4AS6wZ3jbIOal3A=@vger.kernel.org X-Gm-Message-State: AFuF++m8rPOSvHxm19SyEeFezkBtmzqWQDcNI2kkcnE/3eMbAlaWZUsB nW3U25m8fnxHjtGuZjPwATGMFmOym8EPHaHWVTehVGCnkjrSqZFsaXFWq5nnL45ucNvUt5VI8F9 vidqHshVokOALOX3nSXZWoEbuuHmKRVOneLymzgviRrNkiXua90YJ250Zy5TkWbzPetw= X-Gm-Gg: AYBFou2vuBS4IUl5J6vRFx/2pKcxa3DKsSvfLoGiu6ApK76eFF0k1j4eKLpFADY9xQ4 I7PyWfUyk3AmSUPhrKsoD0owj9+0q4jVKGNDkQB2c0A2lEmeOnGkl9eQfCCAv1C9IZS2wZYPw2L YBpcmit1RsrpLeu28y/VNkTSTaSjRQyVXD5qY20TsjvPKj4lIzQdRui3pjAPjVFQiZr0KY6Wxg9 9pa6xjixeA4WH0wL7U37vwK0CY4G+sCVgWC0m6afnebq7qOHGvwcxE25jsgOY0EYDtHR6f7r+lI kE6ZAnq/bKc5fKixGtU/xKgrkcNIbsiCgJMeQfuTSYO4l9rv0vfbDdsCjCThBT0vCVosEW3kHJ2 6czpH32F6qY99XA== X-Received: by 2002:a05:620a:8386:b0:939:6d22:6fd with SMTP id af79cd13be357-939803712c1mr2067472185a.18.1788770312948; Mon, 07 Sep 2026 01:38:32 -0700 (PDT) X-Received: by 2002:a05:620a:8386:b0:939:6d22:6fd with SMTP id af79cd13be357-939803712c1mr2067469085a.18.1788770312351; Mon, 07 Sep 2026 01:38:32 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:31 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 04/11] ASoC: SDCA: add hw_ops with hw_init hook Date: Mon, 7 Sep 2026 09:37:18 +0100 Message-ID: <20260907083727.733705-5-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX32goPGEPBgBv H7XmI1clcRF2O4m0uAMuJJIWS46TCegYhb0LXYujBR04IjYxB3qtMJtsiivGz1eaJJ7b1Wy6LPR Fe33gzCvZunXKBXcCP840/6+o3uIVoCCFTDJHtL8T4HWfzWyd65irUKqr+pvIMnyS9bp7Y9FLWf oIukZs5ApDel8m5ixSgyGVP7kkGwS7iFQmq0/YISmES1k+gAFINuNvJ+Wodptrozh6BS8l4PGQ7 0dcE6ZvIGUuUUlHKHeUDD98M5nYJTB7ZITqQosr+OJWQunpwkhfmcmQ8knbwVtOygHH7NqHJUDS IQN+clRRtcMmO3/AS/zkeMoCDmLH/C92qXKI1iLcoeyyBf9TR7JCKSfompGiizIekp53pMKJL4C AjNBuGd4Sl/lwwBKMGvcmsx4mzo2Dx8AzdezS71vs9/qhx1gVhxoB++/HU7mn+KCprpLEk2iQq8 L+ey3AKtEgsYeQiu5OQ== X-Authority-Analysis: v=2.4 cv=MrJiLWae c=1 sm=1 tr=0 ts=6a9e7809 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=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=TbNiP_vgcRotoqA_lb4A:9 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-ORIG-GUID: tPMx1HzrtLk6Z8XVHM7f7BORhzPvDGMu X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX1PnDH5D5ZxEq AGJSWmLUkuG4J11xtFbwiLHV2T8Pkouas2w0YQjL0PQYeEV6veaZMAR1HvRRDHoY2gndUVsNYwI Tx0tolfExEFNuTkezJXoucKEzDS5AXc= X-Proofpoint-GUID: tPMx1HzrtLk6Z8XVHM7f7BORhzPvDGMu 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-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 phishscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 suspectscore=0 adultscore=0 bulkscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 Content-Type: text/plain; charset="utf-8" Add struct sdca_class_hw_ops with a hw_init callback that runs from sdca_class_probe() before the class regmap is created. Codec drivers use it to enable supplies, toggle reset GPIOs and program initial vendor register state. sdca_class_probe() gains an optional const struct sdca_class_hw_ops * argument (NULL for pure-generic SDCA parts) and stashes it on sdca_class_drv for later use. No functional change for the built-in class_sdw_driver, which passes NULL. Signed-off-by: Srinivas Kandagatla --- include/sound/sdca_class.h | 17 ++++++++++++++++- sound/soc/sdca/sdca_class.c | 15 +++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/include/sound/sdca_class.h b/include/sound/sdca_class.h index c6063f22be7a..3342937d09fd 100644 --- a/include/sound/sdca_class.h +++ b/include/sound/sdca_class.h @@ -20,6 +20,17 @@ struct regmap; struct sdw_slave; struct sdca_function_data; =20 +/** + * struct sdca_class_hw_ops - optional codec hardware callbacks + * @hw_init: enable supplies, toggle reset, etc. Runs from sdca_class_pro= be() + * before the class regmap is created and before the slave is + * ATTACHED; callers needing bus I/O must sdw_slave_wait_for_ini= t() + * first. + */ +struct sdca_class_hw_ops { + int (*hw_init)(struct sdw_slave *slave); +}; + struct sdca_class_drv { struct device *dev; struct regmap *dev_regmap; @@ -27,6 +38,8 @@ struct sdca_class_drv { =20 struct sdca_interrupt_info *irq_info; =20 + const struct sdca_class_hw_ops *hw_ops; + struct mutex regmap_lock; /* Serialise function initialisations */ struct mutex init_lock; @@ -35,7 +48,9 @@ struct sdca_class_drv { =20 /* Library helpers used by codec-specific SDCA SoundWire drivers. */ int sdca_class_read_prop(struct sdw_slave *sdw); -int sdca_class_probe(struct sdw_slave *sdw, struct sdca_class_drv *drv); +int sdca_class_probe(struct sdw_slave *sdw, + struct sdca_class_drv *drv, + const struct sdca_class_hw_ops *hw_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 b952fa6eb802..374de7d9e0b5 100644 --- a/sound/soc/sdca/sdca_class.c +++ b/sound/soc/sdca/sdca_class.c @@ -153,6 +153,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. + * @hw_ops: optional device-specific hw_ops (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 @@ -160,7 +162,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_hw_ops *hw_ops) { struct device *dev =3D &sdw->dev; struct regmap_config *dev_config; @@ -178,9 +182,16 @@ int sdca_class_probe(struct sdw_slave *sdw, struct sdc= a_class_drv *drv) =20 drv->dev =3D dev; drv->sdw =3D sdw; + drv->hw_ops =3D hw_ops; mutex_init(&drv->regmap_lock); mutex_init(&drv->init_lock); =20 + if (hw_ops && hw_ops->hw_init) { + ret =3D hw_ops->hw_init(sdw); + if (ret) + return dev_err_probe(dev, ret, "hw_init failed\n"); + } + INIT_WORK(&drv->boot_work, class_boot_work); =20 dev_config->lock_arg =3D &drv->regmap_lock; @@ -222,7 +233,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 /** --=20 2.53.0 From nobody Fri Sep 25 23:54:04 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C346442393 for ; Mon, 7 Sep 2026 08:38:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770319; cv=none; b=Fy2igL1eEIVTGy0mRdFTOrMp366MK42slvbIIR4LadJ03TbTSTia6JIhL2hUDaq+VWaT8Jo0NzaewKWo/C47lCd8prO51nhtuY1Ar8oSwtokpk6RxGqEPTaMPRdsu54R8BN1TOFv1LmKEw/boP/Jp+ACexbUIauAHTj9gPG2qgg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770319; c=relaxed/simple; bh=S5Rg1wd2Oc8SEJcKALyOC0R4mCPo46zXktRi4uyJdmI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AaHXe8XGOxG60hqKv5kJUqiCseLFbaaErxS0FBjah319XMerlA2F8caDWZe4OZkrT6I8+3gS7ylyaLBLwrCiBV1R/EqCR9QYzh+Z/F7MbVYF0A/+1HCkw0sdb/JJeTZtICA3xhmpau35QHDCY7+HZghfKgn72OsigHJa3umeVdI= 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=EKQ+fM+f; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=V0XN7yjD; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="EKQ+fM+f"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="V0XN7yjD" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68777L6d3352428 for ; Mon, 7 Sep 2026 08:38:35 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=CKSOhfN5g4f /KlUyb51hKqxizTlCn7d1Bpl6LyJMzEY=; b=EKQ+fM+fJBNrNwDgLg3cFjxzFWu tc04ie/Gl6YCAVttXrzuQ7TZxFYto3CKJVo/6TDaOfS9uhEWn6pBPflmhe3JjdwT l0jsUYGxCDDBoLtNq/QtLHBfzvxMhHM22MocQdU8wL3Fqm5IIsBZBJp9vwECs5Zv rf2NjDKADfCZCwchUAADKX0OkQKF8088r/xBV67qqp6eqZuRIyAxVM9ZwuwqgbBv a4TTYZdNoixlzk3my1HUdoBEKEGkFWl+RsQ2ETsxKkk0Ywasq7qgbb9c77irPOLN hYV7e/D3huvoxJw5u2ONwYmCJGgdos+EyvKHqi/9P05pPUDv5xgE2F5ce9g== Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghq66gv0f-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:35 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-92e5fc4c7e9so310272985a.3 for ; Mon, 07 Sep 2026 01:38:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770314; x=1789375114; 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=CKSOhfN5g4f/KlUyb51hKqxizTlCn7d1Bpl6LyJMzEY=; b=V0XN7yjDKuIiMqgYQm4qFHaQKdq+GDR5SbQEcYvmNPGVSdSOfeVa+SQr0IREAd0Ibs AP1ppN8iHwAfcG6/MBmxkNr+2AYmLensPIsiWsE1rcsk6XtFBkUeqCyudOJgmd9pJJ1U zS9trn9EJo14p+dyeYf667IEIZSJldJWUa4iiTIoaaDGMFLzh1XE4RFUP7ND7YCqROcX qWKjcUeCx1LuJo/3JSnD/bF/HNfOfHpkUnHCXrNF2ZKyKjIRQxELAJtykZTE+KPbLP5M gjRmjtgruHEUR6NFR5j4080TYRUq041Nc1rDqXkROf11mfKKBztkUBv5BYkfO9L5tZsT X0pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770314; x=1789375114; 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=CKSOhfN5g4f/KlUyb51hKqxizTlCn7d1Bpl6LyJMzEY=; b=eZwVqechZpnGmSBKuRMOFzOxCsqrHtKdKQ0jNsUxiBWm7+hXMzlGwFVp5XJ6W/OYbZ sgXu3Fb6ItaYLs6WJ6ekVVWzjSRznd6oyq4e8malbXSXN+Sqzt1KPcc1NlsvolD4AIT8 FVHz38ACng6WDWiw4HmfsZpL/Lu4ar4YfacxNXlxTxNmMX5M9l7oozjqwAwU7D4njzyr zJ8nBM/QzecD5VE3YUiEIV/pc/gwvsM36sCfucV0E7ycvsZi2d63P2vM+TwtWmg4qZMz JvBE8zbwLzq+gE+djLxll2s73/tfxSslDmF42oJRPx/fxvHUwESAriHUiste9NsZVFYQ Dnnw== X-Forwarded-Encrypted: i=1; AKwUvBz83QLSPNP0FKaKEr1dNKtQdh0T+Dj01rNnQNl18DhBol2xl7GT6VwtUQyiyV7i7vKaiszgLzjfSY/gYwM=@vger.kernel.org X-Gm-Message-State: AFuF++nprjJjNihY7OMZjGCyFZud8gPLl5Sgr2WpO+clBAjOCY69SrMf Yd2q683KDnOGq98xGvQqcdIgLA0DpIU2oZH4v9gJlgPrUXTptoX13HmxXeXzsKBJstZ7bn9uI6m d1/gs5FUF48kYkzt5GOMX9mvkBep0Mk0JnHJonCjG69DbsArS3HYfXH5ZJqamveD6kwQ= X-Gm-Gg: AYBFou1xnikIquwxCxheiQI9AJfWlbLCU2luWDGhHKnZxS9ekzZPeMKprefkDKwmCNj 0HB6QxtxACXYXDEacFHYyEgI9z41xxPlM18JJMwd5hYVfvwNJ4+Y/W2RKreKeKw4BN4XXccmKAO 5G1Un24KXySQCmLQUV2zIPkj4VaSOaGuEmBqPE6f+zBOV4pma/DXg75ZfvUXZvN2B4p80cXSFvH j4Ae7791L4yesFtemwrMtafICGE+mR3nANHwuECMJfHVzaDyktCPA8XpxLZTV1vZ2s6vtlYcBs5 g/zL8xZzuFiD6ZxHN3DoGfPU3npQJ0Jf7bLUShCymTXHwq7cfhF4WfyLCB+RJHSqZvZj//DPOxi Ppndo/cmgxnoV5A== X-Received: by 2002:a05:620a:56d:b0:937:6772:d8d with SMTP id af79cd13be357-939804030ecmr1377322085a.20.1788770314190; Mon, 07 Sep 2026 01:38:34 -0700 (PDT) X-Received: by 2002:a05:620a:56d:b0:937:6772:d8d with SMTP id af79cd13be357-939804030ecmr1377319885a.20.1788770313688; Mon, 07 Sep 2026 01:38:33 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:33 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 05/11] ASoC: SDCA: add populate_function hw_op for DT function data Date: Mon, 7 Sep 2026 09:37:19 +0100 Message-ID: <20260907083727.733705-6-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-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=QPhYgALL c=1 sm=1 tr=0 ts=6a9e780b cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=biI7FBfO6UU1CUG-efUA:9 a=O8hF6Hzn-FEA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 X-Proofpoint-GUID: DIFvwze6LA4O7Y7rk3qAZ7MaEHOSsSBe X-Proofpoint-ORIG-GUID: DIFvwze6LA4O7Y7rk3qAZ7MaEHOSsSBe X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX/MF6pllhspVT R2Og/a9KOnn6PDx+Hyn+Gc48QQuukGj/xoff7YEEYlMssni79XJPTsiNWUtd0i9ZMlZCY8YszYH WAR0gxkVBdyOxcaae2DsMKaDfDJbsBQ= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX7G65VMeSNtQ2 fbWr23mdgQTHQycxQNncVFOFXHjJ8mNwHZfroHuajSBcgHrAb03YyKgHPBXcTDuHkTbU1taepdR AD4EfSKUlH9dw7H8k8DfsFtBcc5JlWO9ewcU0T9nT9uY1mUiFl3tCufn+xulI+qYJp67SR/dtag Xct9iyOg2GaMSrNXht13ESY+Tv1WIe8FRv42GTqeF76RX8o57v/gka/tOm3AaxyNBOkffnFii46 tSkAXRI9gEBCf9a68NrYbcz9ZoVV/JxIUGx3YFVLO98IUlRW7xgug2qt8Qzxwfv6Ai97AhMfQb2 r/ZObwnhLPgvEg8avAdOLDQPdxZSHLD53Ai1G8B7R/M2oXOv5kPt2LzSRqo8mgBtl2uWDamqVkM WdX6PSeOeS7gLafJL04amD/BJiSEvSuaE6IXIFomQjhB0lFTI4ZLpO088zOdt7HVq1ztRmNN24W rcU3BCPGW6LoASCcs3w== 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-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 adultscore=0 spamscore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 impostorscore=0 malwarescore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 Content-Type: text/plain; charset="utf-8" sdca_parse_function() walks a firmware node, but on DT there is no DisCo node -- sdca_lookup_functions() is a no-op and the SDCA function descriptors come with a NULL fwnode. Add a populate_function hw_op that the class function driver falls back to when @function->desc->node is NULL: it fills the caller-owned sdca_function_data (entities, clusters, init_table, delays) from the codec's static tables, matching by function type. Leave @function->desc alone -- the framework owns the per-instance descriptor, so devices with more than one function of the same type keep their per-instance SoundWire address. Signed-off-by: Srinivas Kandagatla --- include/sound/sdca_class.h | 6 ++++++ sound/soc/sdca/sdca_class_function.c | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/sound/sdca_class.h b/include/sound/sdca_class.h index 3342937d09fd..3a1b6d65048f 100644 --- a/include/sound/sdca_class.h +++ b/include/sound/sdca_class.h @@ -26,9 +26,15 @@ struct sdca_function_data; * before the class regmap is created and before the slave is * ATTACHED; callers needing bus I/O must sdw_slave_wait_for_ini= t() * first. + * @populate_function: fill @function (entities, clusters, init_table, ...) + * from static tables in place of sdca_parse_function() on + * DT/non-DisCo platforms. Must leave @function->desc alone. + * Return 0 on success or a negative errno. May be NULL. */ struct sdca_class_hw_ops { int (*hw_init)(struct sdw_slave *slave); + int (*populate_function)(struct sdw_slave *slave, + struct sdca_function_data *function); }; =20 struct sdca_class_drv { diff --git a/sound/soc/sdca/sdca_class_function.c b/sound/soc/sdca/sdca_cla= ss_function.c index 10a2b031b572..8bca88865a4d 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 (drv->function->desc->node) { + ret =3D sdca_parse_function(dev, drv->function); + } else if (core->hw_ops && core->hw_ops->populate_function) { + ret =3D core->hw_ops->populate_function(core->sdw, 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 23:54:04 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 29D51446C18 for ; Mon, 7 Sep 2026 08:38:37 +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=1788770320; cv=none; b=HJv7HoagOTRFghvbu5+6lin+QdlcyFTpa8mAiab88eGPxQso9slzJc1H/NZGJx2DZD+v6yPG/1YfW3ojGvJ3z8FMTvpWfi7oegjCSu+mjolyGQKJY5D4kb04NfNrsW5xzEXuaoadzji5DxxW+hyhO7j6Ki0WjpDoxUAEcTE7rbk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770320; c=relaxed/simple; bh=DgNygwjQW1S4gERxv8XXOx2YJrza1CSfHMZkNg6qCgo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DXzsL65TOwptqqGgG0+W8OxrgLp9Dp3//c3Qx1oTaPR26GqcxAwu15wGxpFVjs6y43uRFohOEV5kZSeWdKxKvrKlD+W7d4wyMgH9E2nOxHsQS7gjWTcmTC5VOui9qxWHIaU3rOi8d/2SmVvGBwfrl0YMJz/axgsQHair3VfImJI= 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=O1BcE7H0; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Uxbh1zN1; 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="O1BcE7H0"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Uxbh1zN1" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68777chD2146240 for ; Mon, 7 Sep 2026 08:38:36 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=AiIpEIEQZ4E IiKlUje19hDPydG7qbYBZVrWugQnhc24=; b=O1BcE7H07hA/E8X4Ke6ZC51W6EL JXB9T1CcoEbIS2uQp/76XoB4zlRJJUrNEfCluZnQREdn3Mp/eQZK1nenAFsGFide s+gN1NR9QvSojOak4yBNowyeO5ueTqOokjVTmMFyILqu9ZpGegRLG7/heMc+eY7t 9Soqr8bXRFM0t0wG/Xpjuvxv3I46TbIpxHlgyObieJJpAgvShK64bcDf4O32TSSw rxLTqTt5EymSsxmDmOVyqETFFyC5vqvoYmxNf8vadf9hUNGUyzSL2GgUgGd2EgFU 4TOyYy1/Ygo/lf3UzCEk0dEe2BCkU2PCiGK0bDcTnD5kun0slgVYNzZakTg== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ggc8jdvxh-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:36 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-92e5e38fbc5so561654685a.2 for ; Mon, 07 Sep 2026 01:38:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770315; x=1789375115; 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=AiIpEIEQZ4EIiKlUje19hDPydG7qbYBZVrWugQnhc24=; b=Uxbh1zN1N6fVS1GpJWrFhgiDl+iiiihUJk8jL6HFNqKLhZ7liZAIO4C/ARoiVLN41x gTyd4IkS/LuWkbE/hL8UkCzmNcNywbwceJkrYns5uURbPG1R7KbgIWs0CYeVkMtYIrrG JUFlTjF+KG1biAotBKRIvza1op9BL5I6XybkqahQOURZMHWDD8GCNAbzDhp5tvm5sD/F Pl+6g1utQkmjSUVvqGQ2MDCgw7YQ3xsKcwRrDlY4O8ZEpx5EUoTFD1ToPXUh7YYxzSee 2+Nkr0Yu1eF6HEMH5nXWDcPJq6OJXuG9m7jncv3DI4vRJpUhCv/NkaMEuDn+Ji4htPY1 Dviw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770315; x=1789375115; 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=AiIpEIEQZ4EIiKlUje19hDPydG7qbYBZVrWugQnhc24=; b=J+sLfHf8dpM0YSqzujy1GL4ntPfv2bcvH7kFaIkrz0tdWu78sEnXu1JqCxNkkvkwmV 6oAzujbnygsk7UJvZoIdLyI423d+w75xqvVqD9yHMJyTQOQ5c8005h7XmbQf24ur1qTB i+4R12QRwGKx1+mXGpOynJIcK0+OGYdVG2DseA/u+UDU3CcA5BkJzIKGWlKMe3fW+Bwp 4iBzEG9JUAf/mngQS1bnMOFHaHECp+E6QfAkbAdPqs0mZH3+nuf7m3Ojaiz9tVzuU00G Z8oIAP2w7N+uICBQiFhW6voJ7+R258eE3RNXlJ+luko7AewC+vLsFHBDrhcVw1Qobg/y qrvQ== X-Forwarded-Encrypted: i=1; AKwUvByUj59pmEyXbMwnYkf9VEig3pfTW0X/H7jTXbYyplDkzte7EqztJL0arbJ2APAzsa6l2xk2GL4Jo5fq1dI=@vger.kernel.org X-Gm-Message-State: AFuF++l6Md13hFA8TSQP83tPfWL5w58r7mfDDe0kzECL716sNv03ifjA wAELzwRdgYSSoV1hfrs7UdAS3fdV7Bvet+Of/4cthQ+qby6ckPFXY9axXmeyJHmJVU1SgcjlAwC bfF6PKCy19+j6d+5+1Cx+FI2KQcFhPxcJ91IRBQTvH5E9Zl8MveqG0MIYoN59u771jKg= X-Gm-Gg: AYBFou02VXjLaP45unpFB7d2M0NFOoLZGTYc20Bxw+5HyNPsmSWmriJVAhXIY7jxsMX R6e6NJVQ7Db5tzpmKM6O95OCr5Jn/peWwBJHKPFtmMov786J+re8c6DS+n+zmHKDYsH93zIm5R0 ZQHuvoYF31ho1dPbjULPvCNzskx+0epo5+MUBp6G2ZY59MoeN1v8RpxlCQOvroXbvmwxANOuOx4 zDOAzILiElE9usROkCBdUQx2e+svrMzjn6pDiM2Go2MI7FWy2cV65UB0I/yqJX3YtBBChfTYMHw oy4t1UjqLIFCYYegxSjbNlOvzi+0FXisyloGbMc0jwfmiROHAGS5d9oAo+WnrMuMRpLrvdXHblv JXR+CGm7xsoCO1Q== X-Received: by 2002:a05:620a:5642:b0:939:34c6:a333 with SMTP id af79cd13be357-939804a4609mr1838514785a.40.1788770315555; Mon, 07 Sep 2026 01:38:35 -0700 (PDT) X-Received: by 2002:a05:620a:5642:b0:939:34c6:a333 with SMTP id af79cd13be357-939804a4609mr1838512185a.40.1788770315103; Mon, 07 Sep 2026 01:38:35 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:34 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 06/11] ASoC: SDCA: class_function: xlate sound-dai cell by entity index Date: Mon, 7 Sep 2026 09:37:20 +0100 Message-ID: <20260907083727.733705-7-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: N-qKOpmElMfVg9BMVI8XwSZdaBMPNx1b X-Proofpoint-ORIG-GUID: N-qKOpmElMfVg9BMVI8XwSZdaBMPNx1b X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX3fg3fAWhGayo W2XHkyrvzKJxWvokVDu2fyNeAN0Ijeo0B5dKqoLZP5KErviTC7ECwvEodPLbTmEG2fYB9LSCSUR l5o5+9Z3AgKyHIwC79DvSHDi2jkB6FBdaBvMG0ffKusXQ2CWnE9u9cnOVr3BdfUKw7eMQr1zvFi A6KDEgros+0erx113/4LCgDAS2k3B6Dw90IpklUCx72sPfbC92/CQbElfOQSQzxiWBDAeblxp6Z Yv6YLo37glb+gR/PAnOJtREYxOkfZlW7qJ/j1HUgqGcMD4CMf6efbAwldB+iw41I9NZwJSK3Mpj dwz31lOjpm6AGGfYjbRbWhXwzfrJPcvnhSzqrN4kTyPfQU9OosRT97buljLaDJL6Kw11SzqOPMY Z/Sfx/gSJjb5/KAFwr4aL2TczsymQKObbVo9uNxY7C3A2iKhRnD3tAQF4eERtNCTKE1p27q7RW/ lLQTJpLAWD0xVFUL4Aw== X-Authority-Analysis: v=2.4 cv=DYgnbPtW c=1 sm=1 tr=0 ts=6a9e780c cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=D7LRd5SpCY7MsyqoJ6wA:9 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX+S25FyZDo+g7 ZT7iY/3rnTFiYSuw8t6JRPTJ6rVm9JRFksUXZHv6Rds6dPZoxBdNxt6SF9VKIWIMHIMLyP5y30M GiW4sD6BLbj3dc3kREbpLWrJJb7kQVA= 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-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 clxscore=1015 bulkscore=0 suspectscore=0 malwarescore=0 adultscore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 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 8bca88865a4d..ab043e23878e 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 23:54:04 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 6D46F4483A5 for ; Mon, 7 Sep 2026 08:38:39 +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=1788770321; cv=none; b=SZML8VkC7lXiVbnKsVFaFRr911zl3emMUl3CB3wuuZDuyOQhhEQyqezyLQl/Grdu4/oPc5/+JuUsC+rOmZpBwHhb9rrMKI9R0ggUbklqdiigri28nF+OJYxXgFwOfdlkdQHuKp5CFyM6V03K4fTwpGn+p+ylaFFmHhlvzdSat5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770321; c=relaxed/simple; bh=KSMNo8g9EzvzwyGzuw9rT37GzWc3bg5wEFNUMeWd3m4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KGP93SNyJWZijxQ/kmQq5+YdfMsmG8VTSy7zSC2tnhwEa8bQeKIXqDdvDfTcCukL+jlVGjqZJZ33dIxgtMwJqSRaGQN3SirJ4HpAr3JapLsE6YD3vIGXSfgIV/B2q7SAkZJXWy7DeWFlcN9qS+m3IIgk4UVtLs5gY+TWY22w1RI= 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=V5Xu8pKf; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=gKjnsxOp; 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="V5Xu8pKf"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="gKjnsxOp" 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 68777JEO4161116 for ; Mon, 7 Sep 2026 08:38:38 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=Ip+eqAI2Rmw ja7TOAXqTLr12NGGvPjVQ2o1ftxzlnKw=; b=V5Xu8pKfscCanne5RdqZbZbv202 ETrilp+J6RiBrhsE6t8prwrm9uPVAUL5WMoGIcsPXThNk0zh1xoFpbXldBW1wJNt wrOR0PORIlees9NixTlZ7jOT6DFkOjGkxB8Zi9+mZViE80XZHVucKyalIrQ7i0S7 HDBF2BhbAb3gqqciPNfbD5qhIei/ZSXoErEZO/0HpPifloasjh5kY+B2szIlLrJd HIuZn4nZ+lMLfo/NYTudOA548nRtIqUYQoX6HYSxT2OB3tej2Tgw7AsbzoEVj87y 3HPm6S1+biQww5SOcUV8kyPnp9b8KkU0bcOEHiZeSzvHo/q0zTPVLmz8ZkA== 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 4ghfwjhrxg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:38 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-93909014c85so542774085a.0 for ; Mon, 07 Sep 2026 01:38:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770317; x=1789375117; 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=Ip+eqAI2Rmwja7TOAXqTLr12NGGvPjVQ2o1ftxzlnKw=; b=gKjnsxOpiHXM5tUTgXzj3U5s1N7LS2oPP/SUZgUuEzhyzG7p56PJcEMsRsmR83ChQ+ hOkXhxxmEYJL9NARhvRtrQDdY3KgJ3cHi7iuRC8O3SRor0tQbCi+cjE4H6wubfeUqLG5 m/0QWW+MhsAwNtgy8Nb00+jNZTN3FvVETigT+SH0K0dqkT+Vs8YLfEj1ZUAqJ68yKDnR IEHkhFQEdNXgGhcS+6d6+OI4LiCZpGCVxi1cwiMEhw3w7gXTtvlzpco10VQheUzjFq9x eMgjIhObOROa0lO3WRSpPjZGi1GJF9am/4zHsl4KRDYXP4rskFBm0PrIv1pNgBubsYCh PtCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770317; x=1789375117; 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=Ip+eqAI2Rmwja7TOAXqTLr12NGGvPjVQ2o1ftxzlnKw=; b=T9cvx2LZ0NKN472Qh43a5knOv5Y36BGh6zSAdQrK059DmPY3ycqd6c45NluHRrnn2s 9XWV/DH4hHOBMXdM2qHA5HnV1aRmgeDUMXW9DHq/s64A11wA+GH1ZaeXwzre1L8w23Ca LIgJYyzKIgIww5MMaqN2x9z1DM3Gp4eobX/vDA9JfC+5idysKueh1Ge2UdZSPVWOdGGN orD/JutxJ2PAugHbiZmHtI0P0gGmJXyAiBz5glxhzXHUtxT5GSzINlK12OiAW+axhAlL nl6pZdZ/BrvZwPSZ9gFesisbmM8HJkUQF5tSroq/BR/lZpJmuAdYF56OaU3TGuX25uXH FYdw== X-Forwarded-Encrypted: i=1; AKwUvBwFtC/TseQG6us/TDsOqUjB9G4hYWvsE9EuD+G5g0cs9NljTYiarpKIMU5RYg16xfvOKFM/pH8Yvzyeyfc=@vger.kernel.org X-Gm-Message-State: AFuF++kWe/eG+Bwg0IXDov2PkOq2YjObz54ETiYiV2+fxFzGfLajaHJt MUSdwLTmytG1oIwbSOOK/UN+gitb0pFDVppPqVtFA+OtF57AFKdZNl3pon7goMkUwecsWKpPeXK LNo7b75NLayaTae8fE2jqeSQPCuL/lat6F2ERv5pHVajyfXUP0UuMHv8QN4IBn9TjFa4= X-Gm-Gg: AYBFou18iT0zIQJS79oRs8IrlCVyVah/dOGf1oEgU+vrFjfLcY8PQO8VQCshEJOzlDA 7K30zMQGoHa7MdhONwbUesf9LCx0toBuVBeC8n1kSpDP4lKItVNzp4KX6iOYbhYb/D7/5Wty4xk WB+JHB2dWhSi+q6+khmsnneTtJQDe1po1gNKw4WeKLMQBQ3rNV96rHySWv6kVT8WxznjS1Heafv 3Uo36s368FiBV0xKwz0YSrITKA35Kw6HMZ12OhrrLtq1l1D86DmvWmU+Rs/izBYggby+U+uIfMa GAk5MJbgcZc6IgtHH7QmCvufCTcRpD5Sh6yK+/+2I5ihMlElYu5eYEU+7bqd17xu3hqLiUuVjHj Tl2SOBlOjwSpULA== X-Received: by 2002:a05:620a:3d02:b0:936:ea3d:9313 with SMTP id af79cd13be357-9398037be5dmr1382139085a.20.1788770316963; Mon, 07 Sep 2026 01:38:36 -0700 (PDT) X-Received: by 2002:a05:620a:3d02:b0:936:ea3d:9313 with SMTP id af79cd13be357-9398037be5dmr1382134685a.20.1788770316450; Mon, 07 Sep 2026 01:38:36 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:35 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 07/11] ASoC: SDCA: register SDCA_FUNCTION_TYPE_SIMPLE_JACK in class function driver Date: Mon, 7 Sep 2026 09:37:21 +0100 Message-ID: <20260907083727.733705-8-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-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: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfXzBXTVPG12G7y 4uOvvvJQkXMcJ/0jJnQeUG63jqmJQCcBXxfdgyb9TmmiKpC8j5I/ho04BBydZpOwTLlqfThOBN3 Cn099AK7Y5QgWXojXlCcgHeZYR0H72U= X-Authority-Analysis: v=2.4 cv=NanWEWD4 c=1 sm=1 tr=0 ts=6a9e780e cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=w1d2syhTAAAA:8 a=IEwj7ntJ1M3WgPGe5dsA:9 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-GUID: vEknHVSImaQyvkYWqUM7h-7z4BqJOzxm X-Proofpoint-ORIG-GUID: vEknHVSImaQyvkYWqUM7h-7z4BqJOzxm X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX4u/NmUU5VDHg 9dEBcyk8xC5T4GphOi09BBPDpbKTpSuFqGUa54pkVfocUJRkOSqVMoEVWZqocZD/cPSPqj5ySRv k64YhVxIY+UY/gE5CFyVj37A4KLIxEH0z3CS2GCPZY+kwct4rrCXy5Z70aCS7hjMraZhBtbT+c1 IbKqx6o4+IvzEDwz2qv9qTlhE21U25XnGBRfww9qFH4sARdMeaWOFbQ8MeSgiFRFs0toiKFaF6u /dGtx9DaqPmB7MW+z26pt/6RHdFp9iLgPxou2Fr5ei+WtdofYR51ZN/xgqUEdEWYvMTbDZH24L8 pd9eAU3mq/FgsoEVbZhVGWp07p88wwOUuD5kDRrNiJ9X4CIeM+GvY1Ne3Vj0xXNtCx+3SeIb7VC iKxKDegaFxNU2D8zWaYT6W2BW13STfKOm2DOINhHzYdTzHUb7MXe0nZ/JheSuaHt5EdQOyUAwJ1 Iu/8OCYD+5xpA2q3R9Q== 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-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 impostorscore=0 suspectscore=0 adultscore=0 priorityscore=1501 lowpriorityscore=0 phishscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 Content-Type: text/plain; charset="utf-8" Add SDCA_FUNCTION_TYPE_SIMPLE_JACK to the class function driver's auxiliary id table so a SimpleJack auxdev is bound and enumerated as an ASoC component. Wire set_jack for this function type so the machine driver can register an ASoC jack against it. Signed-off-by: Srinivas Kandagatla Reviewed-by: Charles Keepax Reviewed-by: Pierre-Louis Bossart --- sound/soc/sdca/sdca_class_function.c | 5 +++++ sound/soc/sdca/sdca_functions.c | 2 ++ 2 files changed, 7 insertions(+) diff --git a/sound/soc/sdca/sdca_class_function.c b/sound/soc/sdca/sdca_cla= ss_function.c index ab043e23878e..713a34d5954a 100644 --- a/sound/soc/sdca/sdca_class_function.c +++ b/sound/soc/sdca/sdca_class_function.c @@ -408,6 +408,7 @@ static int class_function_probe(struct auxiliary_device= *auxdev, switch (drv->function->desc->type) { case SDCA_FUNCTION_TYPE_UAJ: case SDCA_FUNCTION_TYPE_RJ: + case SDCA_FUNCTION_TYPE_SIMPLE_JACK: cmp_drv->set_jack =3D class_function_set_jack; break; default: @@ -593,6 +594,10 @@ static const struct auxiliary_device_id class_function= _id_table[] =3D { .name =3D "snd_soc_sdca." SDCA_FUNCTION_TYPE_RJ_NAME, .driver_data =3D SDCA_FUNCTION_TYPE_RJ, }, + { + .name =3D "snd_soc_sdca." SDCA_FUNCTION_TYPE_SIMPLE_NAME, + .driver_data =3D SDCA_FUNCTION_TYPE_SIMPLE_JACK, + }, {}, }; MODULE_DEVICE_TABLE(auxiliary, class_function_id_table); diff --git a/sound/soc/sdca/sdca_functions.c b/sound/soc/sdca/sdca_function= s.c index 47dedb62c24c..25f95575c731 100644 --- a/sound/soc/sdca/sdca_functions.c +++ b/sound/soc/sdca/sdca_functions.c @@ -79,6 +79,8 @@ static const char *get_sdca_function_name(u32 function_ty= pe) return SDCA_FUNCTION_TYPE_SPEAKER_MIC_NAME; case SDCA_FUNCTION_TYPE_RJ: return SDCA_FUNCTION_TYPE_RJ_NAME; + case SDCA_FUNCTION_TYPE_SIMPLE_JACK: + return SDCA_FUNCTION_TYPE_SIMPLE_NAME; case SDCA_FUNCTION_TYPE_COMPANION_AMP: return SDCA_FUNCTION_TYPE_COMPANION_AMP_NAME; case SDCA_FUNCTION_TYPE_IMP_DEF: --=20 2.53.0 From nobody Fri Sep 25 23:54:04 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 6FB2043D4E9 for ; Mon, 7 Sep 2026 08:38:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770322; cv=none; b=eHjqvg13JQxP9IOA2Ggs8uL/VC7OvtGYgfGI29eQqtUsY64FOgPAV9+ODhJ5iiA0EJK23d3zIbttDutHkM42kfdPKnAGLzj9KaOtV+KPmPL7pm6+XrG9CQztpXRA0R3U5wkpOr7FWo5kybSg/rEi6ddw7YbW1NZ7SI3I71QGx54= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770322; c=relaxed/simple; bh=nGv5PetXuMnjGRkeIe8kY1eFNyjb5QBvGtSYOUuF9OQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vy4ExtdxE+x70Mp71D0Jde6p21NceB9+9dyhxA3EHCDin842v9yJZ0JWnp0sFjXncmu89Wkl79y5TlMkGs/ATdxf0rxz/8iuvS36IC7V8LR2ZcUohq7NxolD/rWB4bZqgUHjjUh/y0DaHTuhi+SDRmddb/qCdnkzXuK+iJeFSWw= 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=Fm3ix7CK; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=YKnK4BJE; 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="Fm3ix7CK"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="YKnK4BJE" 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 6877NNBn333059 for ; Mon, 7 Sep 2026 08:38:39 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=uo7ZUub3lrZ EEc8DFMNE8az0niDw3dx2TBatUAmNhAA=; b=Fm3ix7CKWGUCowiXlEr+Uue7Hnz 3gZYvz4/FECE38qiTik1WO1XqhLpLh/tXjDOMSzVb7gh78zy406jE4pi9R17GJLH UidSOTET8i3AaPVVo+nrCNNrKZv1dnPUoDhu5/LUdElUHWucW09C+s6Wdju0oH09 j8XC56KYJwf/VgX+RgK1tsXpEOMiSO4/HVFzmUYcihiXkVjDUk6NellH8RAQPv9F WozCSvnD1WMwEV9wB98ZPjg2WJbi6dMwzWk9mpchUF3AjKvhbCEA8lIOg7/dmyQZ kdzvmmxeSTi64DP3ccaVdoTvAb5ktBYX9Syt3lfykjVaW0uysSazeeuxLHg== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghrua8efp-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:39 +0000 (GMT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-91051512080so18445716d6.3 for ; Mon, 07 Sep 2026 01:38:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770318; x=1789375118; 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=uo7ZUub3lrZEEc8DFMNE8az0niDw3dx2TBatUAmNhAA=; b=YKnK4BJEUcJga8PapVQCfwFPvuE67segraz7Z8xE9zBF66w5IAP51EPRNKyG7i5vLA Nmm6jDmOxq2s53LGjLsoV5XrHsU5gWu7s24Rojf60P/O5Sfg2UK+NHlbIMI69664EpMa IJer1kQtfwIUoibaVaKMrErudHUrNxIWYD3lNmSkOfP+TTQ6UGR7zur/0ILEuY0DWIbl 6fyRjwjp59fh/y9R8k9LWKy53qTMlyjfAF2TLgo05kSRvsR1ORHbjYc/5uETFxDSb780 o9ua+hqxo+oJDoRJ3ehOiWb3+AHZvtgMc/w8OtGbIF99Y+RsrAu9E1zQgl3yRtNXU0jm lfXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770318; x=1789375118; 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=uo7ZUub3lrZEEc8DFMNE8az0niDw3dx2TBatUAmNhAA=; b=FgZEt61SW0mLtQAr0ZnTa/fTb1PfyjhmQiJAJqNExglPYzeOFyJP8TMJXf9JmcFPGi 9j2GwY6Qn3U3CD/WsUo1W6pXm/Vea4yhZG0dmGcfYwjH7ZMn9BQvETuH5gTYfsHgHObN Z80ew3Fi9Oe9DfMXSZW9bD2/h9C7glvqhl9f8QFoMvuqkD5f3Ktca5Q8f9Qk5tyPFt2+ jfWj0b0XXN7qYKo9HG64kWk1EkVXg5/YaSGCXDVgoMMmO53mtb0HMmMQnrwp8Ip4Iwls izOpfLTESolfWGKZTGCcSVeFO30t87DG99Rza5lH/vMmHlyBA5rv6mC599eyaUrLROIL zoWw== X-Forwarded-Encrypted: i=1; AKwUvBzmr32kBlbhU4/sipfD55eHSO7OwxGfLM91pf46aD+T05ZgVROYcyb3JhqG2KsIuLbiQnWTFP9PuMR4DW0=@vger.kernel.org X-Gm-Message-State: AFuF++l9PGDAf/LAJOd0i2nAyiiDa9c9NpytRzijopH208KA4EtXIVYt C90ZgLDPgkN+nn2WCfkc3p/IIs634wK1OKAmjCIIfPe/qRhe5HWbapaCqHp4vBL/sms617Fm/Oh FfEDx/2tElGejhaf68tgsFNaOii923QE8t8tMNrBE1RE34fgoAAoRpQXVG5tjakVSS04= X-Gm-Gg: AYBFou3Tocr7iwqIXgQXuUtkGhWlFFIlDe5YlKvTvFeMcL/wwAOxYfnhoOqwZLAyJT+ Dj55/fwRHCqz6xjgwKPH8RVUJ4/4MTxMwTQctj0LATK1bKuFWxGIpQ06udSx401zhXIx831O0Ed +yCmDToDVSXfpHyV1nnlYMVQSs+D9Tk2CZ1q4fOWSb0ltZlPBJg6ljXvlKsvRF2w8TG+U7WnVmB gInEM+FedpajPMfrCfivLB6W4nfIW7idoSJl449Ik+s3ZVQ77kQHYuN0+WKH+d3Nm5I4iHBhDT/ iB8VV7KJ8J8kVvx/6N2rGTGzB/YcxLsY39XGekeOYTadp3I7XMGv7yxQMX8RjYDKPuJqrwhj43S TNtwqW1NhoZYAIA== X-Received: by 2002:a05:620a:1a03:b0:934:ab73:ac53 with SMTP id af79cd13be357-9398013bb1emr2209543485a.0.1788770318376; Mon, 07 Sep 2026 01:38:38 -0700 (PDT) X-Received: by 2002:a05:620a:1a03:b0:934:ab73:ac53 with SMTP id af79cd13be357-9398013bb1emr2209538885a.0.1788770317851; Mon, 07 Sep 2026 01:38:37 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:37 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 08/11] ASoC: SDCA: make find_sdca_control_reset() return void Date: Mon, 7 Sep 2026 09:37:22 +0100 Message-ID: <20260907083727.733705-9-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-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: 9WMvIcIPZSEfUTmvTQnOei7UE3IT19bG X-Authority-Analysis: v=2.4 cv=U+aiy+ru c=1 sm=1 tr=0 ts=6a9e780f cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==: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=-Ca9_MJ7E5AnbNBKvfgA:9 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-GUID: 9WMvIcIPZSEfUTmvTQnOei7UE3IT19bG X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX/ryBKlVV+WsD pxn/6E9eVqKcJpnf9ZH7kzW3Eli0nzPhQdszC3n+pSIRa4wlPeHw6s0Nz9bD7CoH7ZDEbGk0Fmv prLlf2EB6kR6FRDGlM2YRGZNoLeGuuc= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX+F+e5Jykc/ls cN+lnGd/2xKQn5oie1zvw5JWgJeOO/+IQiqv+z4hVagQ8rewvLb7065kIYEfqkxZ20oVa/k9Joi I1CW8Kht4QMhlzKfA8HXdSQ6D+rfe/IH7jeWHYaZ3iQsfVAbZOkc6ct+fp8xkklAvgpVZ9IO5AG JfC46qzrnrOzaBi/u3RhqJ835/z+YBRNvpI49LY0JaWanQqvP0mqRXix5rSO+LLlaufLIfWAPzM 3Jzv5rhh5uxF3c/+ujslkY3a0HDfx5tMSssKwtj/XbNJN19RUkGW2Cvdnwc1NUqBGgqm7eEN1Ks hFJKVEBSkpE/BcCTY6gzSYqqsGy8CeeBiYTjqvSsolKbeaUrcAzkWpIzEXAwLpBoP5Jy5tbSgCM 1fpXNeQsiMKCO1TGdvJiIVtWpU0L9Vgw+lsmdjBV/eld3IFdBJHkyDHHBz/rtVU5IN4XzUICn+x WfBcRazfpu4rzEK0LdA== 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-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 impostorscore=0 adultscore=0 bulkscore=0 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 Content-Type: text/plain; charset="utf-8" find_sdca_control_reset() only ever returns 0 -- it just sets control->has_reset / control->reset for the framework-known (entity type, control selector) mappings. The int return + caller error check in find_sdca_entity_control() are dead code. Convert to void and drop the check. No functional change. Signed-off-by: Srinivas Kandagatla Reviewed-by: Charles Keepax Reviewed-by: Pierre-Louis Bossart --- sound/soc/sdca/sdca_functions.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/sound/soc/sdca/sdca_functions.c b/sound/soc/sdca/sdca_function= s.c index 25f95575c731..68a50552f4e4 100644 --- a/sound/soc/sdca/sdca_functions.c +++ b/sound/soc/sdca/sdca_functions.c @@ -922,8 +922,8 @@ static int find_sdca_control_value(struct device *dev, = struct sdca_entity *entit return 0; } =20 -static int find_sdca_control_reset(const struct sdca_entity *entity, - struct sdca_control *control) +static void find_sdca_control_reset(const struct sdca_entity *entity, + struct sdca_control *control) { switch (SDCA_CTL_TYPE(entity->type, control->sel)) { case SDCA_CTL_TYPE_S(FU, AGC): @@ -950,8 +950,6 @@ static int find_sdca_control_reset(const struct sdca_en= tity *entity, default: break; } - - return 0; } =20 static int find_sdca_entity_control(struct device *dev, struct sdca_entity= *entity, @@ -1032,9 +1030,7 @@ static int find_sdca_entity_control(struct device *de= v, struct sdca_entity *enti =20 control->is_volatile =3D find_sdca_control_volatile(entity, control); =20 - ret =3D find_sdca_control_reset(entity, control); - if (ret) - return ret; + find_sdca_control_reset(entity, control); =20 ret =3D find_sdca_control_range(dev, control_node, &control->range); if (ret) { --=20 2.53.0 From nobody Fri Sep 25 23:54:04 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 99A9A448BAF for ; Mon, 7 Sep 2026 08:38:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770324; cv=none; b=OxtXsGuotj9s9AjiuAJJxMtbUUrQ9jRDy+0BAErdrwP7IAPve83yZISNowpZWvd3eKxBI7OInqxWxZazX//fadaNk1vukuAJZ4Tq8i0BzmEg1qI2y1hjjbpIsbP5CflNagBItMDUwtfpTdZQB1F7oVs/FeMciuBN+IxaJhFi2TA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770324; c=relaxed/simple; bh=iW28TnsYJ0VMS/rwDLxo2MLYsPIWZDhDjeusU3juDdo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=g4W8qNEBj7eToHUjX3vfa312lrNq0QGHT8mKF7vTzqm7Xe7PaPmYGbmQ8mDkIrhyyEHMDXpOetAIRxz8eIyl20KWkn9oH+sGaiKxDS0VKnaLM7gpF4s+h0BrB6EziepkXK1ux/tj+i0PPEFoHothd0OuJGBuEbxpUWrX3VZwjvI= 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=Aia4/VqN; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=NTWIltLH; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Aia4/VqN"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="NTWIltLH" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68787YEb3411570 for ; Mon, 7 Sep 2026 08:38:40 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=NZJ7nSDv9GL /FplrIRnBTH7KK1iSSswSLlWYBNxdg58=; b=Aia4/VqNgfaAFLH8Fc401vv3Ocx gjJUCCh3hgLDHq8fZR5/Lr949yRtMXhQJ0wXNgL+mG8pUgAxmVkOygG9wjCh5j8M xXITpR1o+ArulQ1SmaH89MkJx2yUMUMyM38TQdHeutrt9/WA57HXJpjxGGl+AT+4 H0F/LlrMuYDjfhDSAXO5+MKUk4q6q0OmMFi1+pI3EKtkpFJ1l5SMv0n+GPXGBI22 ZstC+2mmh4fexTcz/1slAjvUQRe6VKx/Bzc7+aWhc4Bfe6uMLXHS+35BnBYAT8qB KefzXzZPRDrhrOlhVSXe7gWjQeU3NL0MP16ai6fENDxtZVNZnpR9hPr60Ug== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghsfyg4ae-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:40 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-92e62e3459fso512305185a.0 for ; Mon, 07 Sep 2026 01:38:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770320; x=1789375120; 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=NZJ7nSDv9GL/FplrIRnBTH7KK1iSSswSLlWYBNxdg58=; b=NTWIltLHAxoQUWLV6qKjWYthEkibG0mbKamHyTRuDmsR3W6pQIFTCjsom6tmTLb4Qw Q2t2P6eOUndYxqMtVeISgu8fOJVA6tYEC/vArPsplXRQ+Vdwm+54Ph6RCs4oKOaNnc4F 2ycLHooJnwXB8LVKgdienLM4cfPCh6/NJVturHLEjHzjC0rqmqZVIfgt2qzhCtF2Xmic 8nS08KCOyH1aa7loFyGMyb9JRLb+49UIB5ltBN464X3MjuHtKLgxRDh8y7kKw6WycikT DseKlCuHZDNhEm8TXmqlrp/PJZ8XBgpNc0sIKlMzX6mkAPq8rt8CbLk/H+StnF3EklXK DjWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770320; x=1789375120; 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=NZJ7nSDv9GL/FplrIRnBTH7KK1iSSswSLlWYBNxdg58=; b=B46P/rG+wosEyhYheM0MpeDsVLqfaMQTV3siOma74J7ooVEN6E5OQmVFIkPu6aXR1x 5qBFkM5HPqEwHV95FfUFGhv1Rp0Hc1Dm3DeML23o7AaE6N5bfhkMx2+9/y7QU7wNZvi1 bgwQK32fs7ISA3j3P51K7mcwzymvUCuY6K9EK1H0Q6F0kJXzCazPDLVQl1c4qFcJpdGm KsGhtaVXFiR5ZW/wZPKCmZnza+pPcQDWwqMxus+pTrzfkQ3PrCnBoAOWzsKrE+OdqmUi FciHGRcUnZaXnktYmLxbLyhmtvyrvjHQJbd878zd0A+ouaDV9RRCekFwl80y3F8f95J/ 3hUg== X-Forwarded-Encrypted: i=1; AKwUvByEWiATeEtU53URdSrCY5waCRdo4ZWUcq09JdLHYHmeCTze3DH+cCZrHPAD0hEDYD4tXAiidOWvQZ/BPHg=@vger.kernel.org X-Gm-Message-State: AFuF++mHzNjlDTuNcCo5wFJAYMZHiCRbsBedy1JMi8ouOkWYddDFSFzj GqfKA+vGCcTqhrhwkoIZ2AoBbtmBiriHjg9xTqn8ZP9FOYPg0dchr+vTKLfWLfV0DibZM7mtafo 1w4NQfwL0H3BYCwjYqJGXpNbSeg7PFfwvwD8rceWgjtfDzEJPdxi6to58QeCzkH6hq+E= X-Gm-Gg: AYBFou1eNw72QH2aJjgr2bqjjD/hljOxU4ZnAJuZIufGtiO8eX8WiRJQ2ezyKHOp+d3 ClCD7qZ/fLhv4oC8Bdjzw1ILzotalV/VjDjMkwoFc4RwXP7gC4GyrM9Ls1AreB1goEWzxiZ164m kRj4FhLofP7ue8yo3oZbhkys+nSptJJixfOH08a+wUusqyGl2t9TsUDaB+Vjg3v+eNwr/6A2cNF tOh7BSU5iXdCASuhe7FdZ72r2ADf5PqP2OG9iR94CvkEFji+imI3WS8mh3XsS7i2+T2oy5GILYB 5GX9MVxYiEqHZqpbODW9ht+CkS9mRafLCh5arW1QBPm/lqVfzEXt3z6bXpiXD/3rTUDAy6A0r3p 5Bw99Z/F213680A== X-Received: by 2002:a05:620a:2720:b0:939:6dea:374a with SMTP id af79cd13be357-939804f807fmr2245690485a.46.1788770319793; Mon, 07 Sep 2026 01:38:39 -0700 (PDT) X-Received: by 2002:a05:620a:2720:b0:939:6dea:374a with SMTP id af79cd13be357-939804f807fmr2245686585a.46.1788770319319; Mon, 07 Sep 2026 01:38:39 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:38 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 09/11] ASoC: SDCA: add sdca_apply_default_control_classifiers() helper Date: Mon, 7 Sep 2026 09:37:23 +0100 Message-ID: <20260907083727.733705-10-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-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: Hx0Snnpoq0dQHYv5w_2zBWaWRkUNxQGa X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX+bnosoq/Y1S8 4FffeMc7OT7NBlwoXl54M7jeJSnNw1YGd5ZOL/Lqa0kP/LQ6mSoaeHuabl6944ehAqac9f/NX2x U5xypOWlMNfG5B3jZloOjzzUmfKj9GTqiQfJEbXdjz54Wnf3V+rURsju7AvUj34oWcRgmv6DI5Z z87NUb9wbbFSDD76Kefb1sbQF+hm6Y0/en3BYr/KmxUXy/63R68w22ckJQ6gj3F6RDxTdTlkb9W sFf8GmWOOA5irVxIzvKFsYno60pnC41TtZrA3VVLLzgajYnVDMrFhO8ei2PqTyYsBKv4kp6i0kN 2Aj4yz+HjBHPAh0ffHWMTZFTY+lN3S7chJm2NISWT2fW9ZjooMQ7/+xF0Nxv+ot58YRECjsYe9p E8URlCIgYGO4DSeMaG5LeaJ+2NQYle25SMqzhiKbQr68sx7mhzlIjZ7lfwRGxQrqOy3c8HmBI8U HAlcG2j7l20DZZfqIVQ== X-Proofpoint-GUID: Hx0Snnpoq0dQHYv5w_2zBWaWRkUNxQGa X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfXyfH33G2D3iDt cuTewcmR7Rtqb2OSsdWqVFmx1kimRYL15+OFoDeBKGB6g9pc3/6j0boWYjA0WqDjt4neWhT68au 3TJREW4I7fZpuXJp4/KHKSsR3Hqayhg= X-Authority-Analysis: v=2.4 cv=AduB2XXG c=1 sm=1 tr=0 ts=6a9e7810 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=KCW3dyBotJ-MOgbrRv8A:9 a=O8hF6Hzn-FEA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 spamscore=0 bulkscore=0 adultscore=0 phishscore=0 clxscore=1015 suspectscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 Content-Type: text/plain; charset="utf-8" sdca_parse_function() derives is_volatile (see c7b6c6b60594) and the spec-defined reset value (see 02d851b46b36) from each Control's (entity type, selector, access mode). Codecs that ship static SDCA tables via populate_function skip that path, so RW1S action Controls end up with is_volatile=3D0 and get replayed on every regcache_sync. Add sdca_apply_default_control_classifiers() to re-run those two classifiers over a Function. Elevate-only, so codec-set flags win. Call from the tail of populate_function. Signed-off-by: Srinivas Kandagatla --- include/sound/sdca_function.h | 2 ++ sound/soc/sdca/sdca_functions.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/sound/sdca_function.h b/include/sound/sdca_function.h index e580201d69d5..d3d77d8bb7cd 100644 --- a/include/sound/sdca_function.h +++ b/include/sound/sdca_function.h @@ -1464,6 +1464,8 @@ static inline u32 sdca_range_search(struct sdca_contr= ol_range *range, =20 int sdca_parse_function(struct device *dev, struct sdca_function_data *fun= ction); =20 +void sdca_apply_default_control_classifiers(struct sdca_function_data *fun= ction); + const char *sdca_find_terminal_name(enum sdca_terminal_type type); =20 struct sdca_control *sdca_selector_find_control(struct device *dev, diff --git a/sound/soc/sdca/sdca_functions.c b/sound/soc/sdca/sdca_function= s.c index 68a50552f4e4..8f4d04e09032 100644 --- a/sound/soc/sdca/sdca_functions.c +++ b/sound/soc/sdca/sdca_functions.c @@ -2268,6 +2268,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 23:54:04 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 A30E544AB97 for ; Mon, 7 Sep 2026 08:38:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770326; cv=none; b=E3RtEKd4Je0yLNP8a+zfnr341PFB/Fkv37o/0NhVFFmHyZl9gjc9rNrmbZsA+C1lGosBVLx+ZWGUrj2Lft2r4WrfW+BUB/uZAmocWoxY7LnYNORH6sO8ghipFFuOFAA9NYYXSffwhZ0IrVUzoDb4RgGdl/pZAkhjaUi/e9Pwf/4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770326; c=relaxed/simple; bh=5BRFpMT2458/X4jlA/c8yR3sX4VMh8e71LTTWl+feMc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vjo//bm8v9ihsGcugL9/hdqJ3ZBFdSgeSsgwMKEVZOOhF7zvjS/NedYSsKVAj49eQKJRsAht6JxufdwSHgPaKhWkW6J7p30mydI7yeQGQOxojVzx3Y7gVejgAsSVcggk3Oc3YWpO43HS3UCQyXvMF74pW8D+L/+LWcUKHzKSADo= 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=S+ZVwGFX; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ezz8Edl8; 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="S+ZVwGFX"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ezz8Edl8" 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 68777Mal2838813 for ; Mon, 7 Sep 2026 08:38:42 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=S+ZVwGFX9MAu9gFBtvFndu3TRM4 IU6/knzwcEG56mpDCbEzlFgBJT6X5ALKdPqzwWvlYwXTrRjZ9kztxdKlKNnp3e5H gEz9FvOVbVs4POPWBHUYslA1WibdPhgNSbETKNmSZj0535JinTEo8B2JUnmWBgub WKbDsr7dEOMC9E1NrZYaEp4Gd0a7NrvG0/y3bv6p9XaBfUZyTckrxtS0ZSzLPK8x 8w1vuaSQfbpB/hbTW3G7JnpUq+pJ8p97RZr47obGShqMdWLwmBD6b/DAYFEoDs36 1aZ/czedRfMb7DISmFJercsPcA8sEcEVZOj3BYDkP9qMY2o6i1CZVUVmjiQ== 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 4ggbuep0tj-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:42 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-938153538caso527822585a.1 for ; Mon, 07 Sep 2026 01:38:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770321; x=1789375121; 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=ezz8Edl8uk2ijm8lLfpqNo9+nMJ01YWPGj6rOFB6zLQJRuVneXfXRG8fdkfYwQMvC3 9CTwM7/xyLSjojc2SakwAwV4vHplUCp3rKGcnE07WtcJjB+GzMMU2v1vgt3OXQBHn+vt 3VCty6cycuslvQULkRjxBgEN8xEKT7XVL/h2mp5AZx31Aa1PKEsTYpYi4oCe/nBb1ItF uB1RAvNGTV7nVm2f+TFSiRetoi1jqqLbIo2RUOOdTYArDihjScxREDa+gx7jQSeEUsBO zyiZSB4ezRjRY0ybF5Iw35GQrd+JldyasKL4bKj62neu4aBIg0Cg7X9p5Sq8OHFgWy/Q ViRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770321; x=1789375121; 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=VXMttere0+6TSVervtSyC278HDBa1ptJUPkdfZcy7JAFExfoltFwOyV83j0ZGDWQfd qB+fq3+ZwQZy4zf4czspJz3OjFqaRIn6LiLwcUbpLsB8rGtfiJdoSK9KgjxSh4WcI5XH 95lWSr5eX4M/y5nttEjBHReTbH8AgGe8/WHUUZMPXayH/UfeWZkCxm0WD1F9vEA/QdGN 7uIs9PofHtkSk9DFiG3t4gNIHiX5klzZHWD6JetY7Eknep2I25LLpkIM8voGden+CRnc TGSkOeAoPXNlCYoHCN+8lKfxLyR22pm9X5UHtr7nlS6zY0LTyLvv+TPZqPg41PiPqI0O kTPA== X-Forwarded-Encrypted: i=1; AKwUvBxtC9lfwBukPGF6QO6zpJdZCTgsrQdUA3QcbFnWcprgtNOz8V5eEkyv0aIvrTwywmFBQUNtT2zzTY1uuso=@vger.kernel.org X-Gm-Message-State: AFuF++n9mLl9sWZCxpa/BXXEVLcQG2y+fiY9RtjSBkB7qhxq4OX7PVU6 zBikUl3EyN9beMdNxvsEnAX/ZO3Qou0mRDC76/DpOtEfSvdPFw7BGSTxWCVEPTFTnBKIWo+/n/N T4bZuzaDUKuJsULZAnaA916ubU2JamPNGrv+0CKIMNE+Jt89kBOwDWi1jSZMnBQiVdck= X-Gm-Gg: AYBFou3YlcFatNgffa8xdrGu4NS9j3pKedfQdzOE0feb/54tmqPz0byb2iBL3CajKjb 8cc4n3Fl9hGSxERRTN5mfTQRZJXOGkcf7MtF1I2Udu7DKNbjSWDPxoFrRTh4M6CiNw9YK2nGFAF YcbVQqIzi+qLjPehssw24ce8I5ErDub+QZvJlqVuBpL/YWleiTCtVF/1j40iLK85TRvtCI+2KAW JT3Umt1TYaQ4bNA/jy5c2q4WoddcJHICiGPy17Fw0Qka7qgUq0xpsHhm3mMWhXwj+beMEtlytKu kFHS5b8Tz2PTPNDv8G+kp9CKNuSXdd8fdT61ehLOegAD8sTTkpo8mTAqSHnW2itHySuD2ffBp8w aabe8fi47jtI2NQ== X-Received: by 2002:a05:620a:460c:b0:930:a26a:fb2a with SMTP id af79cd13be357-9398031b58fmr2040001485a.2.1788770321141; Mon, 07 Sep 2026 01:38:41 -0700 (PDT) X-Received: by 2002:a05:620a:460c:b0:930:a26a:fb2a with SMTP id af79cd13be357-9398031b58fmr2039997385a.2.1788770320710; Mon, 07 Sep 2026 01:38:40 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:40 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 10/11] dt-bindings: sound: qcom: add Tambora WCD9378 SDCA codec Date: Mon, 7 Sep 2026 09:37:24 +0100 Message-ID: <20260907083727.733705-11-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX1AhuLFkFWdGQ uPoRZO8Oit/SXUuyB4OERisCo76pplgQkpbblUrLThCT+xi32Fc7b9GT5gJlG+5Qd0pn/qkN9AJ DTxlg6LdD0/VxEBy0hUPFH2TsP8dIm3eXVaSAdVqNLMKOHjH7igGBQ/0siuIz2ajat3WG7g2XdH iWVfBVdyC0B5UkLYnykQ2fGIu6jRiWGtqx46k5sqcHJyTruZgtXAN1P9mA33l0nHBn+DciM+J/C w7nx+0TxbwJTuF/6/njNHKFScW4vvBKiYK+Do5BNT/oKgtaENGl/p4AN1CNPIDm3VeuVnhlnK1M agabcvyyGLd1YQEWSQKfFck9AinW3FSffK/aarV7Yet/sld8ZNvNntpSuzhIRAIm3iYrPTQNGl/ 5t+6qOGI5XGGxZN81426b3blFvvm8YsSEDmKPprKbW3rROJuncAGNRzAxkFcZS8LP19sgkakP5p JENrKTbWBvS1ktIWg1Q== X-Authority-Analysis: v=2.4 cv=P8AKQCAu c=1 sm=1 tr=0 ts=6a9e7812 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=gEfo2CItAAAA:8 a=EUspDBNiAAAA:8 a=fAJwNmJgYEpPzymNVfgA:9 a=IoWCM6iH3mJn3m4BftBB:22 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-GUID: KuXEeYwpsXXHRgc7PXNlujzeeS5rR10h X-Proofpoint-ORIG-GUID: KuXEeYwpsXXHRgc7PXNlujzeeS5rR10h X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX7cr9+vszNT7h hCA4SLLHVdGW7to3QbWO46flh88lKemEvUmvYcFv2ieyT6ygbOouXBtEgZb/rzk4yvz8uWP7F3M rsHBCjYXFXcdZ+KTnlQ3/Kcr0a/E9Jo= 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-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 impostorscore=0 bulkscore=0 clxscore=1015 adultscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 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 23:54:04 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9CDDC44AB6B for ; Mon, 7 Sep 2026 08:38:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770331; cv=none; b=iLioyQA7MPNgCet9lCIToQyyQ6kj/QGRhW7X030Uv/qcLWFk3rq1v7wxljCnGhaj/fca61x9/1NmE7EejqG6rmZax5HaFRO4+FcTSE1UijEH6owvb2eD26L4sqNbGz9+s4JTgYJjEaINL/1dPhJaZ5NvrhrF1Tth226dNzJZTT8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788770331; c=relaxed/simple; bh=FrXonC2+/IyblXJC+JFELyLdP0Ac3ErpZxsvETuzc9A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=F4b2LobkF3VgxndDqjDwIzTl/ko9Qk3bocBVeCdJpL5cRVO37xf38H6K2tuvgI7+VYtX+i0Iw+omwsCloMUjpfIK/Y+NXKQ800QESRn/g8oYm384cDLYPnSOJKzW73dGESES2k67N24kFK59Ez3tLhlQe0dR8TJo2rEMBzOEvrU= 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=e5Wt82b8; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=OhZDza1C; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="e5Wt82b8"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="OhZDza1C" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68787U923411513 for ; Mon, 7 Sep 2026 08:38:44 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= Kalo9Zdylxlhho1RNg7qHqkPWIz2gs0tdjhU0otJiA4=; b=e5Wt82b8++x7AQYg ZONqQsA+GWOwEIb2sF0LUZlPSu6sWvqNJMmPNewdgLdjBEyYf0aOcEceUcDelMEj Php0PfMupaq53sW97hx8x4MIEfGxjHJUPwdGiwtsL+Hf9ZnUgurkjMPEno95CQec 2QonG8FD1dN9cvRrAWkKkKlXlOTIS54LxSnGjMZyguvFIgOVEX7BciI0OthZw/rA vlk09ih9MmPsyQLMlOh06lsr0jmDaRf54Nwxg+1o2wWCfkTHvwBSrtLv/3mpKodJ h0NYUKKhLBZRZ9hzvN8hrqInYCYubgs3tSdb/rNzTHhB1Gmqb6EbbKAz0If4N29a pRF7aQ== Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghsfyg4ap-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 08:38:44 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-9382f9430deso564226985a.1 for ; Mon, 07 Sep 2026 01:38:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788770324; x=1789375124; 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=Kalo9Zdylxlhho1RNg7qHqkPWIz2gs0tdjhU0otJiA4=; b=OhZDza1C8c2zhIe9BPKdQSWfqtMPFgOy1FkW0tHD6zC0Ee0AcC4F9wQhQCt1sn6nlY Hch6htFLleXs1klh1lQQsBPLR2fN9oJupez05RdOAco3x0gW5yOaB5Z+T+tU8+9zvAjS rOy5sDG5rwOLYM5x80oMGDDjs7befhGowOyKhHgmQoQvdFfA/uF4OdJI0Uu52JiwTYaK XKAPoGvSf9008A2kV0++iXQHs7S5zRqKcZHbZfr3h6Z0u/4nOlZN/o9x9LUBUl1OBQIj s2mns6SqHjZI9iRJGkn2bHJHQX2ueYMjRoksQj93lWimvmYsD3iX31pj0JeMyB0aTzv1 zPGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788770324; x=1789375124; 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=Kalo9Zdylxlhho1RNg7qHqkPWIz2gs0tdjhU0otJiA4=; b=BLlUxrA1a89UDO/zSYbMZgCiTAulxdualcbvQUcPG6/oeF2hE1SSICWJfLsLV8XukN Qsf4sMmKsBCpl60AdBnQYOGHXVb3glbEZIn2lxE0qvU2KCHpWUau9xJFkSSJyquay2kk nDvKhH0HDkQEAqd+uApzAGhQETveXnsIpm1ZvKmLPHezzlv32UI5lhNpQWbFgUxVPNzR Z8d1N8Y2KhjyU9W8hxOriWftUcjpPSjoaX9B5psdhNEzgtwvWWNFCz1FzTk7CPpcQiYT iuRZzY3BA/2G1EkDtgs8ETRHrfMaeZpvLP/OH+vi8l3hx1JNsYLvOHKTdUB7nMyBhykH bSsA== X-Forwarded-Encrypted: i=1; AKwUvBzwb0w5li3OOZtazJwkiIiBiw7KGK+6gCgH7BgafTudJDHRIbJDO8Fhgyj0I3GRUUxmnxjNwkFCmQaXDSc=@vger.kernel.org X-Gm-Message-State: AFuF++kZOowjT41Z70q9bxe8mIwJZ/f0tBB9vlL20cSoRauppc5xwSeg e0VjGkvJR1sV5CSmIw24godh9dCu6C+xvuORIFRG+WNeLC2MlbIPR/s2Aw3ZtZimcrP/ANu8HbO fcsgO0hEKzcjO3H7qNmtHXhp6nKhvABLNhgPQBWRG4kdQTHsfGl+LU5yj3gFOYIWF1JQ= X-Gm-Gg: AYBFou0WuXwDg+Ad8QHqEs3gmY9B4Z0Lr6REHkNUuPeoTYn9gp2+6GhozNN99byHFpn SnwjrhSdlL9gX9ZCt7WpmN9jpGNA1wNIj7rdbX/W9FBTMR7p2Ems8SzMzybNWxrRiuHo3QxwUwi C3yFg6n6BSm/4mHj0E9Awx4FXG5HLxbX504wovwprjjM2rojxWlMfuI4dTkmtZiefZtEuqcAde/ P/VfBqWWNLjcPh+EUw7mrXrOMwYA7IRKwwRwL/SqtJiYMBzJMZVVAsZUg8jEmD2Fc3Dohawrm3c jXmiposFcZifmPD3fN2c7ECSEOcV+siBaLBY3lzkn+GweMSx8tPgJtxpfmTRvuvkGecsDeMpD8b NFoYs4klfYVYP3Q== X-Received: by 2002:a05:620a:40c7:b0:939:2bbb:b266 with SMTP id af79cd13be357-939802f7944mr2176605685a.8.1788770323004; Mon, 07 Sep 2026 01:38:43 -0700 (PDT) X-Received: by 2002:a05:620a:40c7:b0:939:2bbb:b266 with SMTP id af79cd13be357-939802f7944mr2176599885a.8.1788770322188; Mon, 07 Sep 2026 01:38:42 -0700 (PDT) Received: from debian ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-485883c6ba4sm30852179f8f.25.2026.09.07.01.38.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 01:38:41 -0700 (PDT) From: Srinivas Kandagatla To: Mark Brown , Rob Herring , Charles Keepax Cc: Krzysztof Kozlowski , Conor Dooley , Bard Liao , Jaroslav Kysela , Liam Girdwood , Maciej Strozek , Pierre-Louis Bossart , Takashi Iwai , Faiz Nabi Kuchay , Jorijn van der Graaf , patches@opensource.cirrus.com, linux-sound@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v2 11/11] ASoC: codecs: add Qualcomm Tambora (WCD9378) SDCA codec Date: Mon, 7 Sep 2026 09:37:25 +0100 Message-ID: <20260907083727.733705-12-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260907083727.733705-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260907083727.733705-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-ORIG-GUID: elPH_7QF8CmtbwPeFg4GxNDBBEWC7vzK X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX7P6OYcoM5SXa 6A5to0KL3QHK+PXl+7iaW/kfQiqGJg1o05YKWCb/IGjTqIv6IsKgXwCqBPvHIIb+SZp9OFrDtLP MTgehEAkSlsrNf3I9KSqnYp7m+YKN6WoTl7mXrVwFH3WTgK+6bsj6j7hIjmyIZVl7ALZlUWMl1M g4ruJ5nSXI3J5YA78F8UQvIHheKokOClnbbwAT9eiuCnrmYimwtMcKIPNlTP6+raGCmVIRcElr4 vhPUYCBHGk0u5uqfEbfcqd22UnlfcW3T8nVhQjudLgklyW2iieoWyPgg4T196m+e/zUk9eoNr+Q D7MNbAjIM2DPl49Bki+qc/CNEDckgfzM3yV83rW/XdLc4CyynpdhDzuv0SyiFNwc0KR/ThdKpOo r+T4sAipmdQtsTjlYf/8gfdtZoLhwyJzpbyoxFDwx0Y/CFc7obhsmuRMGWKTD4c0yGCdM3cPiGK KFxmhybT1AUOxKJJc9w== X-Proofpoint-GUID: elPH_7QF8CmtbwPeFg4GxNDBBEWC7vzK X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDA5MyBTYWx0ZWRfX6PV6PJGW5Dpa MKg03DzeGZupciZlUrmxkQHMLPxR0nuNn2mu3TqmIxYXs+Q7s7hLuRug5bQZQGZlfOUeaztvwCA qpvV3epEXZKoht8E0tV8IYt2n4OhJn4= X-Authority-Analysis: v=2.4 cv=AduB2XXG c=1 sm=1 tr=0 ts=6a9e7814 cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=JcVUG4dzAMI90bsB3XgA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=O8hF6Hzn-FEA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-07_02,2026-09-03_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 spamscore=0 bulkscore=0 adultscore=0 phishscore=0 clxscore=1015 suspectscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070093 Add support for the Qualcomm Tambora (WCD9378) headset codec in SDCA mode over SoundWire. On ARM/DT platforms without ACPI/DisCo firmware the SDCA topology and SoundWire port properties are supplied as static data through the codec driver. The codec exposes a single SimpleJack SDCA Function providing: - Headphone playback via FU 6 (mute + Q7.8 volume) and OT 43/45. - Headset mic capture via IT 33 with MICB2 bias derived from DT (qcom,micbias2-microvolt). - MBHC-based headset jack detection. Implements: - sdw_slave_ops.read_prop: SoundWire slave properties and dpn caps for the compute-mode dataports. - sdca_class_hw_ops.hw_init: enables supplies, toggles the reset GPIO, and enables the vendor TX PDM clock via SCP. - sdca_class_hw_ops.populate_function: fills the SDCA Function data (entities, clusters, init_table) from static tables and patches the IT 33 MIC_BIAS default with the DT-derived per-slave value. Binds SoundWire slave id 0x0217:0x0110 when qcom,compute-mode is set on the DT node. Signed-off-by: Srinivas Kandagatla --- sound/soc/codecs/Kconfig | 11 + sound/soc/codecs/Makefile | 2 + sound/soc/codecs/wcd9378-sdca.c | 1010 +++++++++++++++++++++++++++++++ sound/soc/codecs/wcd9378-sdca.h | 20 + sound/soc/codecs/wcd9378-sdw.c | 52 ++ 5 files changed, 1095 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 f9a47e262a77..94b6606d5e3f 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -2526,6 +2526,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 3d122ace75ad..4d8fdd3be79b 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile @@ -366,6 +366,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 @@ -819,6 +820,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..6a77fac01700 --- /dev/null +++ b/sound/soc/codecs/wcd9378-sdca.c @@ -0,0 +1,1010 @@ +// 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 sdca_class_read_prop(slave); + if (ret) + return ret; + + /* 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_hw_init(struct sdw_slave *slave) +{ + struct device *dev =3D &slave->dev; + struct gpio_desc *reset; + int ret; + + /* 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 at hw_init 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); + + 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_hw_ops wcd9378_sdca_hw_ops =3D { + .hw_init =3D wcd9378_sdca_hw_init, + .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; + + /* + * 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); + + /* 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_hw_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