From nobody Thu Apr 9 12:54:02 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 3337639A7ED for ; Mon, 9 Mar 2026 11:13: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=1773054811; cv=none; b=igl5f8/aBks2esF5BCnOoKQqO/iGp7QBFAFn0h5mKjca/LyVQXZVFO1rQ3gNudv57Mz1CwK5yjUKeChi2alUfoBvGaEGTnnkxV2qfSGdpKm8ct65aW+WGIsSoYpGQ4uqTm+vXZ6c5b35I89f2ccLfWJzodLkCkK/x+K1c43n7R4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773054811; c=relaxed/simple; bh=Ui0AgihxXCFaYgr+bAZ7i2l9gkj2VFymgy3DBZqKJDc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=r2f2+9hIvAO/QDnPw5z9iLvBjbzH8kT/79YvSb8V6hEEWyVTR4PoKyRWQ5nTowSLkAGLW2oEZU0afJ0uNzH4Cj4kCXgZnHIxGUvgDUICtUCBZBm9fAIn6BjNiT4T1C4bS1SZaA4YIaI7ZzDbtBWcNmBgcv8ZMtOSf5XdJVNTBr8= 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=gf/OaFlJ; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Jnou+BRk; 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="gf/OaFlJ"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Jnou+BRk" 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 629A6f442195131 for ; Mon, 9 Mar 2026 11:13: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=IzHG9N+rOjY zjvGxNKtzO8J7u8GYor9iw76AiyCp3zI=; b=gf/OaFlJrNUbCnPoWTAKVuoVq55 gG4QlkXJT2JR2cPiwy2GxGqYy+i5DrKh8tnfDyu2PkjD6nWuQu69j73uJ53E0nIk sUL9z276Fqp13dnj28oV58oUR5p4wXBQj6bB7aGrZngbQEAMTX9Wt7YovOWoVret yUg/UhUBoJ8PAXk1DJqWoVoA9KFJk6Hra8pT7LGkCiSzPqVGxI/WcI38j0CPrI6/ G+vFTbanXIHbjLF5QRXEBTVpIVtpPFlrwrvUH9jap9hD1tHEmyocZEVwu6EYbIKF BYvBEyq2x8EH4DLCx0ZinTuvlZntIEf5QukImsOmTtIEFHRUTJO94NiQ0iA== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4csv5u86ub-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 09 Mar 2026 11:13:29 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-35979a03106so8639155a91.1 for ; Mon, 09 Mar 2026 04:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773054808; x=1773659608; 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=IzHG9N+rOjYzjvGxNKtzO8J7u8GYor9iw76AiyCp3zI=; b=Jnou+BRkPHOmtuLspsNSsbnv9+g4nzg9lTBTb3DZXHNkSFHQRnSRf3k3L7g+mdyuwT symdd35Vh++pYlm6Ovb+nX8HJhqtMzpnrVNnMCuBigYaeA6c+FWwZC9GdR2KosinX1wT JZd7lomQpPLWXhtKLPfv25mH3cMQFiPkSylACPTYFOx3wA5IvYWK2KHm9PY8thBa0lTK qZ8PGLymD0yeYRh2C5sb6jcU+GxI9g9I8ncA7V/yERsgyTcPXLxny55ADvMWRcw0UWAs CtWQyMO7ySvdY7rdHA2AQs2YxXIHcglNENPWBRTnUizawViR/x1t0Fv0Qa/fCDGExy7d skEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773054808; x=1773659608; 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=IzHG9N+rOjYzjvGxNKtzO8J7u8GYor9iw76AiyCp3zI=; b=Xe8bIsjUAFXOvKCw4XLA3reBUZFX9XnzJtnXAGVri+vma1m4dCPD0EDfHAMZQ159Jj 7HnsQw9nP+CrPww4CArY2KNrMutIjbgCNoHDgdWfhlNsNb9QptUbWtTufyBTx8jSBBHN 0CPYIYfWdgZfmghIG/wjDAZdVUGPigLbaObmQp6Mfu6BNdMaSy9xcVE4etthDhcRH+ql ZDh4QkqD5UVTZdoAaDC91bpL2LNO0eP67ZAUGlMATbvdTeMtAz601oP4BD+3rjC7Lta9 ZLTmZ17mEIp/0guX3hB0vqlf1hgxZR2hN8yB8FggTm0HLBfbL6WEqj5GXW1QCSkmbg79 cbDw== X-Forwarded-Encrypted: i=1; AJvYcCXu4dD0pgl2UmJIRYT07z8xh5vbJfvZWXCxTN0ImEkE28HGBz0AO4DteDlkRaWWEKqUeyuaypEYLjpdF20=@vger.kernel.org X-Gm-Message-State: AOJu0YyW7PhxULIh9yfMMaGG5lcStecXxTm/YuVzFKOmKN6e4ehVOECG FqgAQRf6QUyimQ6if/vpQ1gfv7HEzw12t90ZC3DCuf6Y9uDBhL90b+rIaWJs7ZiUEDLXbaLOP4Y LeGaM14CqEfxBQ/vSlb1wbE4V875ctE3S4rY79wzQLXaGCZJXr5GQdTK6NCGC4GhwrvA= X-Gm-Gg: ATEYQzzBtwoRNw3R2xf3sPKF7Jo6AqZPO0OLUcyinihHhF4LhKCJ5EdXUaPEq922Jnj t3bbijPzeKtjKfOc8L1ZbrKv9rEOJ1ckMkudGQBBMAiXoplos47nQTQUrN1f4MiPlhU0S/CrqQX SC/5ZFzsxOkF9MBf1U4VQpfDqwB+UK/63Hhjupe3gZ1AlPtNnamqJzyZ9gBflvyS1AQu1FI0fU9 FWGTWB36AKIz1uW2gzb3kNZQOoJWmyZFqOWJ5UaY50epvC+aVNGdTOxON0T/S+joqv83eVQxGjG mnj+i5RWq169/Sm+BIOaE9PwLjrhzZdwX0R0AA5kr62ZAtzNooe9FsLixwaElgyARfmMb8flaAb Zd1aGU7rnsraJaNM7oEYSYqwq8fKY7hqSxwoB9xh1dhASCSYSS7Srf51GOQ== X-Received: by 2002:a17:902:f78e:b0:2a0:8ca7:69de with SMTP id d9443c01a7336-2ae8245c38bmr93586515ad.41.1773054807990; Mon, 09 Mar 2026 04:13:27 -0700 (PDT) X-Received: by 2002:a17:902:f78e:b0:2a0:8ca7:69de with SMTP id d9443c01a7336-2ae8245c38bmr93586155ad.41.1773054807476; Mon, 09 Mar 2026 04:13:27 -0700 (PDT) Received: from hu-mohs-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ae840c9967sm145405925ad.90.2026.03.09.04.13.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Mar 2026 04:13:27 -0700 (PDT) From: Mohammad Rafi Shaik To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jaroslav Kysela , Takashi Iwai Cc: Krzysztof Kozlowski , linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH v1 3/4] ASoC: qcom: q6apm-lpass-dais: Add MI2S clock control Date: Mon, 9 Mar 2026 16:42:59 +0530 Message-Id: <20260309111300.2484262-4-mohammad.rafi.shaik@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260309111300.2484262-1-mohammad.rafi.shaik@oss.qualcomm.com> References: <20260309111300.2484262-1-mohammad.rafi.shaik@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: vFZfOfNuqKgQtuRe71AAhhaq8DFF4Adq X-Proofpoint-ORIG-GUID: vFZfOfNuqKgQtuRe71AAhhaq8DFF4Adq X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzA5MDEwMyBTYWx0ZWRfXyVNSc3tDzusR Bn981HInp1+RjMzXHtitrMFdNg8yQoCJaX5Y4JkJ8W3vOxkIkMNozS8UcpHzyR2TRAbo3gCRQgw Sya/hAtSYTVpFB+NMa0nx0PjiqVsB8iAc5nHN8DtEMDtFwRe97ktQC8CJy8L2FnWZf/C7RS4OZe PFmOUq/7zYHLueFp9V8ECJpNiNuFMiYkjx218c7r6oWnVcPMZEXGajeHFrj/XaHMXD9lNuN+aPk BhxnlsHO0Z165BUo4qUEZgBxM3Qppz3ry47xv0r68wbNrpcAFMSEIrSll4aguaj4WLtg6gcwm1I yXwStPNZZ4x6+eZG3toba/4RimzJhQIM3H6hK4lwNwvZLWs4kgfyrValjvqlGeP3nIAVeWg/SYI ru+CkyPVOt2eZTT+Q1+GFEfuaymNzMCuBUfZNzynPrnmL7WRW/MhjOgDR9m8rXpDgG3Zu8HSbFx +VjWIYhFQHy4ofARNtQ== X-Authority-Analysis: v=2.4 cv=Xr/3+FF9 c=1 sm=1 tr=0 ts=69aeab59 cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=A-h2Renr4JBikGDhi8kA:9 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-09_03,2026-03-06_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 spamscore=0 impostorscore=0 suspectscore=0 lowpriorityscore=0 clxscore=1015 phishscore=0 priorityscore=1501 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2603090103 Content-Type: text/plain; charset="utf-8" Add support for MI2S clock control within q6apm-lpass DAIs, including handling of MCLK, BCLK, and ECLK via the DAI .set_sysclk callback. Each MI2S port now retrieves its clock handles from the device tree, allowing per-port clock configuration and proper enable/disable during startup and shutdown. Co-developed-by: Srinivas Kandagatla Signed-off-by: Srinivas Kandagatla Signed-off-by: Mohammad Rafi Shaik --- sound/soc/qcom/qdsp6/q6apm-lpass-dais.c | 137 +++++++++++++++++++++++- sound/soc/qcom/qdsp6/q6prm.h | 4 + 2 files changed, 139 insertions(+), 2 deletions(-) diff --git a/sound/soc/qcom/qdsp6/q6apm-lpass-dais.c b/sound/soc/qcom/qdsp6= /q6apm-lpass-dais.c index 528756f13..1e739a474 100644 --- a/sound/soc/qcom/qdsp6/q6apm-lpass-dais.c +++ b/sound/soc/qcom/qdsp6/q6apm-lpass-dais.c @@ -2,10 +2,12 @@ // Copyright (c) 2021, Linaro Limited =20 #include +#include #include #include #include #include +#include #include #include #include @@ -15,13 +17,22 @@ #include "q6dsp-common.h" #include "audioreach.h" #include "q6apm.h" +#include "q6prm.h" =20 #define AUDIOREACH_BE_PCM_BASE 16 =20 +struct q6apm_dai_priv_data { + struct clk *mclk; + struct clk *bclk; + struct clk *eclk; + bool mclk_enabled, bclk_enabled, eclk_enabled; +}; + struct q6apm_lpass_dai_data { struct q6apm_graph *graph[APM_PORT_MAX]; bool is_port_started[APM_PORT_MAX]; struct audioreach_module_config module_config[APM_PORT_MAX]; + struct q6apm_dai_priv_data priv[APM_PORT_MAX]; }; =20 static int q6dma_set_channel_map(struct snd_soc_dai *dai, @@ -238,6 +249,70 @@ static int q6apm_lpass_dai_startup(struct snd_pcm_subs= tream *substream, struct s return 0; } =20 +static int q6i2s_dai_startup(struct snd_pcm_substream *substream, struct s= nd_soc_dai *dai) +{ + return q6apm_lpass_dai_startup(substream, dai); +} + +static void q6i2s_lpass_dai_shutdown(struct snd_pcm_substream *substream, = struct snd_soc_dai *dai) +{ + struct q6apm_lpass_dai_data *dai_data =3D dev_get_drvdata(dai->dev); + + if (dai_data->priv[dai->id].mclk_enabled) { + clk_disable_unprepare(dai_data->priv[dai->id].mclk); + dai_data->priv[dai->id].mclk_enabled =3D false; + } + + if (dai_data->priv[dai->id].bclk_enabled) { + clk_disable_unprepare(dai_data->priv[dai->id].bclk); + dai_data->priv[dai->id].bclk_enabled =3D false; + } + + if (dai_data->priv[dai->id].eclk_enabled) { + clk_disable_unprepare(dai_data->priv[dai->id].eclk); + dai_data->priv[dai->id].eclk_enabled =3D false; + } + q6apm_lpass_dai_shutdown(substream, dai); +} + +static int q6i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned = int freq, int dir) +{ + struct q6apm_lpass_dai_data *dai_data =3D dev_get_drvdata(dai->dev); + struct clk *sysclk; + bool *enabled; + int ret =3D 0; + + switch (clk_id) { + case LPAIF_MI2S_MCLK: + sysclk =3D dai_data->priv[dai->id].mclk; + enabled =3D &dai_data->priv[dai->id].mclk_enabled; + break; + case LPAIF_MI2S_BCLK: + sysclk =3D dai_data->priv[dai->id].bclk; + enabled =3D &dai_data->priv[dai->id].bclk_enabled; + break; + case LPAIF_MI2S_ECLK: + sysclk =3D dai_data->priv[dai->id].eclk; + enabled =3D &dai_data->priv[dai->id].eclk_enabled; + break; + default: + break; + } + + if (sysclk) { + clk_set_rate(sysclk, freq); + ret =3D clk_prepare_enable(sysclk); + if (ret) { + dev_err(dai->dev, "Error, Unable to prepare (%d) sysclk\n", clk_id); + return ret; + } + + *enabled =3D true; + } + + return ret; +} + static int q6i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { struct q6apm_lpass_dai_data *dai_data =3D dev_get_drvdata(dai->dev); @@ -258,11 +333,12 @@ static const struct snd_soc_dai_ops q6dma_ops =3D { =20 static const struct snd_soc_dai_ops q6i2s_ops =3D { .prepare =3D q6apm_lpass_dai_prepare, - .startup =3D q6apm_lpass_dai_startup, - .shutdown =3D q6apm_lpass_dai_shutdown, + .startup =3D q6i2s_dai_startup, + .shutdown =3D q6i2s_lpass_dai_shutdown, .set_channel_map =3D q6dma_set_channel_map, .hw_params =3D q6dma_hw_params, .set_fmt =3D q6i2s_set_fmt, + .set_sysclk =3D q6i2s_set_sysclk, }; =20 static const struct snd_soc_dai_ops q6hdmi_ops =3D { @@ -280,6 +356,59 @@ static const struct snd_soc_component_driver q6apm_lpa= ss_dai_component =3D { .use_dai_pcm_id =3D true, }; =20 +static int of_q6apm_parse_dai_data(struct device *dev, + struct q6apm_lpass_dai_data *data) +{ + struct device_node *node; + int ret; + + for_each_child_of_node(dev->of_node, node) { + struct q6apm_dai_priv_data *priv; + int id; + + ret =3D of_property_read_u32(node, "reg", &id); + if (ret || id < 0 || id >=3D APM_PORT_MAX) { + dev_err(dev, "valid dai id not found:%d\n", ret); + continue; + } + + switch (id) { + /* MI2S specific properties */ + case PRIMARY_MI2S_RX ... QUATERNARY_MI2S_TX: + case QUINARY_MI2S_RX ... QUINARY_MI2S_TX: + priv =3D &data->priv[id]; + priv->mclk =3D of_clk_get_by_name(node, "mclk"); + if (IS_ERR(priv->mclk)) { + if (PTR_ERR(priv->mclk) =3D=3D -EPROBE_DEFER) + return dev_err_probe(dev, PTR_ERR(priv->mclk), + "unable to get mi2s mclk\n"); + priv->mclk =3D NULL; + } + + priv->bclk =3D of_clk_get_by_name(node, "bclk"); + if (IS_ERR(priv->bclk)) { + if (PTR_ERR(priv->bclk) =3D=3D -EPROBE_DEFER) + return dev_err_probe(dev, PTR_ERR(priv->bclk), + "unable to get mi2s bclk\n"); + priv->bclk =3D NULL; + } + + priv->eclk =3D of_clk_get_by_name(node, "eclk"); + if (IS_ERR(priv->eclk)) { + if (PTR_ERR(priv->eclk) =3D=3D -EPROBE_DEFER) + return dev_err_probe(dev, PTR_ERR(priv->eclk), + "unable to get mi2s eclk\n"); + priv->eclk =3D NULL; + } + break; + default: + break; + } + } + + return 0; +} + static int q6apm_lpass_dai_dev_probe(struct platform_device *pdev) { struct q6dsp_audio_port_dai_driver_config cfg; @@ -287,12 +416,16 @@ static int q6apm_lpass_dai_dev_probe(struct platform_= device *pdev) struct snd_soc_dai_driver *dais; struct device *dev =3D &pdev->dev; int num_dais; + int ret; =20 dai_data =3D devm_kzalloc(dev, sizeof(*dai_data), GFP_KERNEL); if (!dai_data) return -ENOMEM; =20 dev_set_drvdata(dev, dai_data); + ret =3D of_q6apm_parse_dai_data(dev, dai_data); + if (ret) + return ret; =20 memset(&cfg, 0, sizeof(cfg)); cfg.q6i2s_ops =3D &q6i2s_ops; diff --git a/sound/soc/qcom/qdsp6/q6prm.h b/sound/soc/qcom/qdsp6/q6prm.h index 8296370e3..a00d1eda1 100644 --- a/sound/soc/qcom/qdsp6/q6prm.h +++ b/sound/soc/qcom/qdsp6/q6prm.h @@ -3,6 +3,10 @@ #ifndef __Q6PRM_H__ #define __Q6PRM_H__ =20 +#define LPAIF_MI2S_MCLK 1 +#define LPAIF_MI2S_BCLK 2 +#define LPAIF_MI2S_ECLK 3 + /* Clock ID for Primary I2S IBIT */ #define Q6PRM_LPASS_CLK_ID_PRI_MI2S_IBIT 0x100 /* Clock ID for Primary I2S EBIT */ --=20 2.34.1