From mboxrd@z Thu Jan 1 00:00:00 1970 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 8031F47CC6F for ; Thu, 4 Jun 2026 12:48:45 +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=1780577329; cv=none; b=Oz7IhijmTjWdWSYHVa5rmGUOIYH4LDOhfBhvXPkDZIy72WQ39d1nyNrLAwyqOzXuptPunAuF0Z0JjI5jq/mm5O8MFQGVaFNJvDfJkiTIeRFLb6HniTf05LtJLb7ZhACFYsN83LJkgp+V/YdgS/gKelg+w6xNy6Su1+u6S9FDZEQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780577329; c=relaxed/simple; bh=LYlQL8slJT2X3TsQrVJGOcIURgOr7EAYfQdBwvHGCbM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=hYURHnrzi4t1zXMQzmjyXqnGZMYC9u5F4XiP0ybjTxTm2240O7AscH+9r/W0IMLCly4ThZ1lNOH95Fwj62hj61BfWg4gJHHbpa1Kh3sQ+5+JVSKYeJZMg04/5LeRY9B1396qshlefuJzh3Kqa+Esst9vJ/G16drYqw3xRjmXAg8= 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=eyKcdI9k; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Q5qBgIBC; 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="eyKcdI9k"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Q5qBgIBC" 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 6546uqPi2477822 for ; Thu, 4 Jun 2026 12:48:45 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=g3+Ward7dHQ 7AzvjxSqcPJkFYwCD8AMq1fWcD6KwA/s=; b=eyKcdI9kbP8lRGFUMD6l1oNBrja 1BIspPSONk33sTK3NAs7W2zBeVExNakfQyt4yUgiFtYugv3zmNrgqyXtcGyedzXC K865Oa1rHTMKxgXsFFaTpD4VF04ASVfWOEo69ltTnHIFhy56LrHIADAIT7Ygymju Tk9ZVoYZVgaI/7JKJXaafd80uFrxPzW5ADn2Bh/lKu1wv8btt8WZci+mEp6WTKet fSj1R7kV2ju8RwgOr0shAfxTEKTOZXvOCuiZOHhQ/ceaUe+j4KhupYbaSFeI1GTk jp1HaYwpZrnohDxhxR5DJ6trNnu9bozdlPTqdYcCLal4mNOnJz6BV8FrMDA== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ek4hvha6x-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 04 Jun 2026 12:48:44 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-c85807671b1so412209a12.2 for ; Thu, 04 Jun 2026 05:48:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1780577324; x=1781182124; 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; bh=g3+Ward7dHQ7AzvjxSqcPJkFYwCD8AMq1fWcD6KwA/s=; b=Q5qBgIBCJXBhA0nrbKMvvFayCL13H8bo2kANmq/8aaJ2+W3NdCkgoBKwiXgm3NOu/7 LjG3JcmDBFrW7ce+IRKfFd4JUDvCkV20eAcKQT//4UwdpWCms3mlQgeuTMHeeZTRuyZ5 /cK8TYrI1wv6XxfWhxduC6rlZz82YcNYzBXDIXraQFTBUFy2OHhG1+Lq4O3BmfSo9KeI fWJXXYMpheMtoCxbtCFmq8bGwx8Oz8VZxL564LNvvstP7OA+BGBs5cTdYoCR3OCmGPIj 9bJwZCH4EojIuHnPIsaxaoYxCo4Acm6whSRKOAQul9ivU6LMH75hiLBhHvs0jx3iGBUk 0t/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780577324; x=1781182124; 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; bh=g3+Ward7dHQ7AzvjxSqcPJkFYwCD8AMq1fWcD6KwA/s=; b=WoSriL5VYVDzoKQEX+k02r0xyT7Lf2xaNe9H4XYNYndtJFU6Rp3FOVLkzx2AHcgDU7 p/Ez13mtwzsyQXxbHNgPSOL17z7ViH3cmGJr/bEm3hkZrfOE58n5HCm84BRHqdz8dUES MDKxZrfUWxygp6TQ/25kWbCa9A05UtLNeu3GCQsoBCQNQHfHsaGNw6HzxmOCtu9H5yB4 kUtNuknGArSR5rMTEWhVs1aVPpVQGmb/T3rz7qgqIlTrPNiXNP6eMHbKOJIBFmh3pz6F RqNyMP1v/UT/1y7VadBgU9QCDuUEhYB/z/dtj1NH0CgvKqwYhZW8Rmj7zpVAPZJ5x3L9 +DEA== X-Forwarded-Encrypted: i=1; AFNElJ8a5l/zPLWBYmF8Cj6amlTxDZWNvhAWxtvQcHtXpB6hxwRLVwmwipoEhUgYeyrQDz2eGyF5dnyTMKm4JkY=@vger.kernel.org X-Gm-Message-State: AOJu0YwNJHJ6BbAO+n4iUh3JOUXQl+AfaJWI76NO3KoNlmY4Xr/HNTJT hl6HNP76cPkb78nJ7XNtD4aFptWBSmzLDucUxnehrGSLkFCD9c2TkoHB/w47pM7HDXnKMSZ0GEi J9AoYwZzUAOPFtcTLPUwQqA5MdnOI/TAptWEnQlJVRPNgieVoBpw51SKA21gEkceByKE= X-Gm-Gg: Acq92OEKeofSnGNsZCqLnoF0Nmw1nxyhM/L+ylbwEJrrqXHCga7b3LLbspJIpOCs6DO Z+U+2bHaNy++L+uhVfGE/nQ1SwrhGhmCwoh6skewPvdR5joUaAVGWh0rfEnE/Ztoloo/SrB6IPT gTpvOWSa68ie7gbeeVzL5aMqr3l6HPZOm6ix2W+wi2qypTIY2HtKy8GexwGmKgBCA6QNivLomXs nRVO/0G6zMY9pgtv5OC9Hh5n6GifPsXKzp10KksHPFBkejKajjJgMfizVoEyN4xg2ugKMsowl7D jrcTpUmVj2N8Gm6xX6OPkNU5T8CT9Y9s3ZYRGV8iSnvqRARY8ODM5yl4RoQcAoPp09J1Q3BtVbV j8NgmcBmqeae7IcrH0rsYGb6keiWyGOS7G4VOL+9u/NuRleWY7MVmO3hf+XU+ X-Received: by 2002:a05:6a20:d80d:b0:3b3:e05:7fc4 with SMTP id adf61e73a8af0-3b4979a261amr8468714637.30.1780577324066; Thu, 04 Jun 2026 05:48:44 -0700 (PDT) X-Received: by 2002:a05:6a20:d80d:b0:3b3:e05:7fc4 with SMTP id adf61e73a8af0-3b4979a261amr8468679637.30.1780577323518; Thu, 04 Jun 2026 05:48:43 -0700 (PDT) Received: from hu-nandam-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c85df04311bsm4911811a12.9.2026.06.04.05.48.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Jun 2026 05:48:43 -0700 (PDT) From: Ajay Kumar Nandam To: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Srinivas Kandagatla Cc: linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, mohammad.rafi.shaik@oss.qualcomm.com, ajay.nandam@oss.qualcomm.com Subject: [PATCH v6 1/3] ASoC: codecs: lpass-wsa-macro: Switch to PM clock framework for runtime PM Date: Thu, 4 Jun 2026 18:18:21 +0530 Message-Id: <20260604124823.3467457-2-ajay.nandam@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260604124823.3467457-1-ajay.nandam@oss.qualcomm.com> References: <20260604124823.3467457-1-ajay.nandam@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: 8bit X-Proofpoint-GUID: PoQzKOzq1lqcJMPG3SipxyjmjPQH0oII X-Proofpoint-ORIG-GUID: PoQzKOzq1lqcJMPG3SipxyjmjPQH0oII X-Authority-Analysis: v=2.4 cv=Zp/d7d7G c=1 sm=1 tr=0 ts=6a21742c cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=FelO9ux0wxsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=0L53WUX8MMYAS1EgRPIA:9 a=x9snwWr2DeNwDh03kgHS:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjA0MDEyNCBTYWx0ZWRfX32Hx/+X9lDgm hMtGvttNoBUwVhflL2fNa0G5bDKZzcjtMM5UBMkAisz+LNTUEzS+j0zaC/n8T1XmHibURd2QWt2 t9DCGex42yRVgzoi3Z5sjQpBvVtlXdixZZX5zIB1MUucdg2D4fNRNcgCG/SIlXYFdAq5FGPWIcx UxkAEz1nCaifhBHhLjlS2m3zNU+PfGPzhTH12EFrm64T4a5kDYhM3o2ZK4boWLiBbWwsTByEulq ScKftR32FRgpT/f6xmTdl3uO8wvzGmqBIT1OvgA2XtEqghARKKkAOTI1Ukmk6zqd7WNk3n7kpFl AlckoAprN7ji9LW7fvFcZwLHdA/J/KCgRkUXQxdfLqDiJaM1YL2gr8+Q7wPad89EiNDRUq/DKei s2NqRAw/2VUzRQUgpJ+QvefW+o0XQzSD0/obU9kwcEO02qJHYmziM5c62Zlh/k9VIsa/KmlqVmQ rrys1hQhJeF+GnSPFqw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-04_04,2026-05-28_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 phishscore=0 lowpriorityscore=0 impostorscore=0 malwarescore=0 bulkscore=0 adultscore=0 suspectscore=0 priorityscore=1501 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605210000 definitions=main-2606040124 Convert the LPASS WSA macro codec driver to runtime PM clock management by using the PM clock framework. Replace manual macro/dcodec/mclk/npl/fsgen clock toggling with PM clock helpers and runtime PM callbacks. Keep the SWR gate runtime PM reference from SWR clock enable until disable so autosuspend does not gate clocks while SWR is still prepared. Set autosuspend delay to 100 ms so PM-clock-managed votes are dropped soon after idle while still avoiding suspend/resume churn on short gaps. Add a PM_CLK dependency to SND_SOC_LPASS_WSA_MACRO since this patch introduces PM clock APIs. Tighten error unwind by checking pm_runtime_put_sync_suspend() in probe and by restoring regcache state if pm_clk_resume()/regcache_sync() fails. Signed-off-by: Ajay Kumar Nandam --- sound/soc/codecs/Kconfig | 1 + sound/soc/codecs/lpass-wsa-macro.c | 126 ++++++++++++----------------- 2 files changed, 53 insertions(+), 74 deletions(-) diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index a7c61f7c7f4c..458ea62ad983 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -2889,6 +2889,7 @@ config SND_SOC_LPASS_MACRO_COMMON config SND_SOC_LPASS_WSA_MACRO depends on COMMON_CLK + depends on PM_CLK select REGMAP_MMIO select SND_SOC_LPASS_MACRO_COMMON tristate "Qualcomm WSA Macro in LPASS(Low Power Audio SubSystem)" diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c index 5ad0448af649..5952bd6638ae 100644 --- a/sound/soc/codecs/lpass-wsa-macro.c +++ b/sound/soc/codecs/lpass-wsa-macro.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "lpass-macro-common.h" @@ -2529,15 +2530,13 @@ static const struct snd_soc_dapm_route wsa_audio_map[] = { static int wsa_swrm_clock(struct wsa_macro *wsa, bool enable) { struct regmap *regmap = wsa->regmap; + int ret; if (enable) { - int ret; - - ret = clk_prepare_enable(wsa->mclk); - if (ret) { - dev_err(wsa->dev, "failed to enable mclk\n"); + ret = pm_runtime_resume_and_get(wsa->dev); + if (ret < 0) return ret; - } + wsa_macro_mclk_enable(wsa, true); regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, @@ -2548,7 +2547,10 @@ static int wsa_swrm_clock(struct wsa_macro *wsa, bool enable) regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, CDC_WSA_SWR_CLK_EN_MASK, 0); wsa_macro_mclk_enable(wsa, false); - clk_disable_unprepare(wsa->mclk); + + ret = pm_runtime_put_autosuspend(wsa->dev); + if (ret < 0) + dev_warn(wsa->dev, "runtime PM put failed: %d\n", ret); } return 0; @@ -2774,25 +2776,23 @@ static int wsa_macro_probe(struct platform_device *pdev) clk_set_rate(wsa->mclk, WSA_MACRO_MCLK_FREQ); clk_set_rate(wsa->npl, WSA_MACRO_MCLK_FREQ); - ret = clk_prepare_enable(wsa->macro); + ret = devm_pm_clk_create(dev); if (ret) - goto err; - - ret = clk_prepare_enable(wsa->dcodec); - if (ret) - goto err_dcodec; + return ret; - ret = clk_prepare_enable(wsa->mclk); - if (ret) - goto err_mclk; + ret = of_pm_clk_add_clks(dev); + if (ret < 0) + return ret; - ret = clk_prepare_enable(wsa->npl); + pm_runtime_set_autosuspend_delay(dev, 100); + pm_runtime_use_autosuspend(dev); + ret = devm_pm_runtime_enable(dev); if (ret) - goto err_npl; + return ret; - ret = clk_prepare_enable(wsa->fsgen); - if (ret) - goto err_fsgen; + ret = pm_runtime_resume_and_get(dev); + if (ret < 0) + return ret; /* reset swr ip */ regmap_update_bits(wsa->regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, @@ -2809,56 +2809,41 @@ static int wsa_macro_probe(struct platform_device *pdev) wsa_macro_dai, ARRAY_SIZE(wsa_macro_dai)); if (ret) - goto err_clkout; - - pm_runtime_set_autosuspend_delay(dev, 3000); - pm_runtime_use_autosuspend(dev); - pm_runtime_mark_last_busy(dev); - pm_runtime_set_active(dev); - pm_runtime_enable(dev); + goto err_rpm_put; ret = wsa_macro_register_mclk_output(wsa); if (ret) - goto err_clkout; + goto err_rpm_put; - return 0; + ret = pm_runtime_put_autosuspend(dev); + if (ret < 0) + dev_warn(dev, "runtime PM put failed after probe: %d\n", ret); -err_clkout: - clk_disable_unprepare(wsa->fsgen); -err_fsgen: - clk_disable_unprepare(wsa->npl); -err_npl: - clk_disable_unprepare(wsa->mclk); -err_mclk: - clk_disable_unprepare(wsa->dcodec); -err_dcodec: - clk_disable_unprepare(wsa->macro); -err: + return 0; +err_rpm_put: + if (pm_runtime_put_sync_suspend(dev) < 0) + dev_warn(dev, "runtime PM sync suspend failed in probe unwind\n"); return ret; - } static void wsa_macro_remove(struct platform_device *pdev) { - struct wsa_macro *wsa = dev_get_drvdata(&pdev->dev); - - clk_disable_unprepare(wsa->macro); - clk_disable_unprepare(wsa->dcodec); - clk_disable_unprepare(wsa->mclk); - clk_disable_unprepare(wsa->npl); - clk_disable_unprepare(wsa->fsgen); } static int wsa_macro_runtime_suspend(struct device *dev) { struct wsa_macro *wsa = dev_get_drvdata(dev); + int ret; regcache_cache_only(wsa->regmap, true); - regcache_mark_dirty(wsa->regmap); - clk_disable_unprepare(wsa->fsgen); - clk_disable_unprepare(wsa->npl); - clk_disable_unprepare(wsa->mclk); + ret = pm_clk_suspend(dev); + if (ret) { + regcache_cache_only(wsa->regmap, false); + return ret; + } + + regcache_mark_dirty(wsa->regmap); return 0; } @@ -2866,36 +2851,29 @@ static int wsa_macro_runtime_suspend(struct device *dev) static int wsa_macro_runtime_resume(struct device *dev) { struct wsa_macro *wsa = dev_get_drvdata(dev); - int ret; + int ret, sret; - ret = clk_prepare_enable(wsa->mclk); + ret = pm_clk_resume(dev); if (ret) { - dev_err(dev, "unable to prepare mclk\n"); + regcache_cache_only(wsa->regmap, true); + regcache_mark_dirty(wsa->regmap); return ret; } + regcache_cache_only(wsa->regmap, false); - ret = clk_prepare_enable(wsa->npl); - if (ret) { - dev_err(dev, "unable to prepare mclkx2\n"); - goto err_npl; - } - - ret = clk_prepare_enable(wsa->fsgen); + ret = regcache_sync(wsa->regmap); if (ret) { - dev_err(dev, "unable to prepare fsgen\n"); - goto err_fsgen; + regcache_cache_only(wsa->regmap, true); + regcache_mark_dirty(wsa->regmap); + sret = pm_clk_suspend(dev); + if (sret) + dev_err(dev, + "failed to suspend clocks after regcache sync failure: %d\n", + sret); + return ret; } - regcache_cache_only(wsa->regmap, false); - regcache_sync(wsa->regmap); - return 0; -err_fsgen: - clk_disable_unprepare(wsa->npl); -err_npl: - clk_disable_unprepare(wsa->mclk); - - return ret; } static const struct dev_pm_ops wsa_macro_pm_ops = { -- 2.34.1