From nobody Wed Jun 17 05:11:18 2026 Received: from out-183.mta0.migadu.com (out-183.mta0.migadu.com [91.218.175.183]) (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 70CEE379ED2 for ; Thu, 23 Apr 2026 05:09:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.183 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776920968; cv=none; b=WjSimhV0QA3j/DjfjNN3X7mEvHhBY+W/xzU0RKUxVWkD4BBqaZl7QOL7DD9bWXLLr5kVrlVLGpZpvz2/DLxGCIFXl193rg1tP72To6A9Ve4/6uodTk9nEU+BpNM0Lu1WmxkzREBwPqBv/hLFwsWOI3+O5YPce5dMIwAFgZ6VPwQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776920968; c=relaxed/simple; bh=Awsbmf/is2gTwwsBREmIDYrM0WfnGvu/erL9Jv0a49A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lnkLPt7b6Dz+0Xyw51TJr+4BtDWltGf7OqNcm8RMQUcX3lF3+5ChlWOY8a0Pryy8e352IY0shTkuZL/PW1K52qWZHNDOHSHPdOjGr1gxU18eMHGoE35nRm4/RfR7nd/0fABukGBjH2isQBeK49eFLIqY2RxsOlnr1G71LIXw0k8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool; spf=pass smtp.mailfrom=packett.cool; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b=GtdnJKtv; arc=none smtp.client-ip=91.218.175.183 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=packett.cool Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b="GtdnJKtv" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=packett.cool; s=key1; t=1776920964; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=41KJpIHP9HEj9do1wX0yPVovg9t4I3SZtimzUmaH4dA=; b=GtdnJKtvRlYdz+w9F2yE+7+yMoL9OAvAU0QFCYpvt86NHtEkUZwROSyONTowBFSizdLXig QBtjpwlzO/0LmXLUVz7dR7GHYr0kAPNtnnofyYFkSvppHrv9n5cZ96mV7RBdTVDW/MA3Z6 z6XBJxlHtIEDgZBICwba5zadPzN0FF6FBVBj4yVKjqlUqUD/l4smueARJHbgvrbetG3x4t XZe1LYhnvAdGgblQgRba0YqFIGmTgzSnyee9l6ejMX8U6D9+7uxl/Z2IB8Yvf+SDVlh6ok 1R3dzEydwBQ6am6/B7oWuBQMeC9qYl9zcDiV74EjbQGrHCVH8qPomQtRZj2Ifg== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Bhushan Shah , Luca Weiss , Antoine Bernard , ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/6] ASoC: qcom: qdsp6: q6afe: fix clk vote response type mismatch Date: Thu, 23 Apr 2026 01:41:01 -0300 Message-ID: <20260423050801.210840-3-val@packett.cool> In-Reply-To: <20260423050801.210840-2-val@packett.cool> References: <20260423050801.210840-2-val@packett.cool> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" The response sent by the firmware when requesting a clock vote (opcode AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST) does not actually have the same opcode + status payload as APR_BASIC_RSP_RESULT. Rather, it returns one single u32 which is the client_handle that must be used in future unvote requests for the same clock. As a result of this type confusion, the status returned by the callback to q6afe_vote_lpass_core_hw was actually an out-of-bounds read. It was only interpreted as success (0) most of the time due to luck, but there are reports of random ("more likely on cold boot", "depending on hacks made in other drivers") errors such as: [ 20.961100] qcom-q6afe aprsvc:service:4:4: AFE failed to vote (3) [ 20.961131] Failed to prepare clk 'core': -110 Fix by correctly interpreting the response as a single u32, and actually store it as the client_handle to ensure unvote would work correctly. Link: https://lore.kernel.org/all/5976946.DvuYhMxLoT@antlia/ Signed-off-by: Val Packett Reviewed-by: Srinivas Kandagatla --- Found by reading and comparing with downstream: https://github.com/YumeMichi/kernel_xiaomi_pipa/blob/27190355fb31284988ddf5= 05cb7cfba5128104cf/techpack/audio/dsp/q6afe.c#L1261-L1263 What's really bizzare though is that some of the logs go: [ 10.827469] qcom-q6afe aprsvc:service:4:4: cmd =3D 0x100f4 returned error=20 =3D 0x16 [ 10.827512] qcom-q6afe aprsvc:service:4:4: Unknown cmd 0x100f4 [ 14.052896] qcom-q6afe aprsvc:service:4:4: AFE failed to vote (3) ..where the "returned error =3D" message is something that can only be printed by the callback if it goes into the **other** switch() branch, i.e. when hdr->opcode =3D=3D APR_BASIC_RSP_RESULT. How reading out-of-bounds only in the AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST branch would cause that to happen (even on a subsequent vote after the first one to perform the read) is beyond me. Still, the person that reported this heisenbug told me that this has actually completely fixed it. --- sound/soc/qcom/qdsp6/q6afe.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sound/soc/qcom/qdsp6/q6afe.c b/sound/soc/qcom/qdsp6/q6afe.c index 40237267fda0..28b5b6b91897 100644 --- a/sound/soc/qcom/qdsp6/q6afe.c +++ b/sound/soc/qcom/qdsp6/q6afe.c @@ -379,6 +379,7 @@ struct q6afe { struct q6core_svc_api_info ainfo; struct mutex lock; struct aprv2_ibasic_rsp_result_t result; + uint32_t vote_result; wait_queue_head_t wait; struct list_head port_list; spinlock_t port_list_lock; @@ -968,13 +969,14 @@ static int q6afe_callback(struct apr_device *adev, co= nst struct apr_resp_pkt *da const struct aprv2_ibasic_rsp_result_t *res; const struct apr_hdr *hdr =3D &data->hdr; struct q6afe_port *port; + uint32_t *vote_res; =20 if (!data->payload_size) return 0; =20 - res =3D data->payload; switch (hdr->opcode) { case APR_BASIC_RSP_RESULT: { + res =3D data->payload; if (res->status) { dev_err(afe->dev, "cmd =3D 0x%x returned error =3D 0x%x\n", res->opcode, res->status); @@ -1001,8 +1003,10 @@ static int q6afe_callback(struct apr_device *adev, c= onst struct apr_resp_pkt *da } break; case AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST: + vote_res =3D data->payload; afe->result.opcode =3D hdr->opcode; - afe->result.status =3D res->status; + afe->result.status =3D 0; + afe->vote_result =3D *vote_res; wake_up(&afe->wait); break; default: @@ -1899,6 +1903,8 @@ int q6afe_vote_lpass_core_hw(struct device *dev, uint= 32_t hw_block_id, AFE_CMD_RSP_REMOTE_LPASS_CORE_HW_VOTE_REQUEST); if (ret) dev_err(afe->dev, "AFE failed to vote (%d)\n", hw_block_id); + else + *client_handle =3D afe->vote_result; =20 return ret; } --=20 2.53.0 From nobody Wed Jun 17 05:11:18 2026 Received: from out-174.mta0.migadu.com (out-174.mta0.migadu.com [91.218.175.174]) (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 1BBEC3C198D for ; Thu, 23 Apr 2026 05:09:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776920976; cv=none; b=scL9+3AZBxwYJiAiddBsBHRcSFPV6LLKN7lZUYzw6i5rYo2SytlL/M+chg6Z7o1jjq0uf2fxZgUjzyz+v4c4Yy8lXgyTJ+U+e3vkEcDh4oObDiW376xjjqeXlT9Nc+5E6OD+CS2QCtK9m9Ek+Mz9ksrwdwiUqQz/dxbYe+OKQ1A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776920976; c=relaxed/simple; bh=2yxpfwbmtMhGY7toV/DOGqB0FSWoIMgpc7O5paD+vro=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JsLFUlMpFFkaVXO3at5o1mShh9L7BTUierfz/LxHQEUQ0x+6IVvybKhsXVddq04BFUycMF+Stnt1GPjfqyRBvlklDMWIFlhrVGXhpxN8QRzDWfVhp8NfFcVLbAZcDZV1/ySC9ijZODBazRhrVbnNUJYv0GANR4OtsJe9SFa1dFY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool; spf=pass smtp.mailfrom=packett.cool; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b=w5/nUPSo; arc=none smtp.client-ip=91.218.175.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=packett.cool Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b="w5/nUPSo" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=packett.cool; s=key1; t=1776920972; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XJvn4Kmgr3hYMJPtGfeLpjqkFYR7MaG36asqmMm2Wkg=; b=w5/nUPSomFR26SfFQM/pfJdzfn/lNYsunzIQF0/c2GWwEyFhdnnrHfLu6U/287nrSf3lsg CGUq4Wc1SaAiLWjJXaWgmUU9n93I/H3PCkNHrNdgk7CGy9rS+8bHUXDW4w2JG8cJwZQsZt kD8loCDGfBrbG9c6+ZdECt313+XHCR5xfyjpXWU1fnmZsBaTbMhuibO+fGb8RTpmV9UKlt YqlIDLOkC6M2yIFTK0xsxV/QPmcjDndcjh+DVqgmyDX6qYdRWrUy1Sqb9VCoBDgNv7Redf 8C+Qn1Lkq/PEyLiCjdOZgN2iaEq2H2PyAT6lTWMDgJ6/3xb7Cf+aSyVpfywI/A== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Bhushan Shah , Luca Weiss , Antoine Bernard , ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/6] ASoC: qcom: qdsp6: q6routing: add Senary MI2S ports Date: Thu, 23 Apr 2026 01:41:02 -0300 Message-ID: <20260423050801.210840-4-val@packett.cool> In-Reply-To: <20260423050801.210840-2-val@packett.cool> References: <20260423050801.210840-2-val@packett.cool> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" This commit adds support for senary MI2S mixers. Signed-off-by: Val Packett --- sound/soc/qcom/qdsp6/q6routing.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sound/soc/qcom/qdsp6/q6routing.c b/sound/soc/qcom/qdsp6/q6rout= ing.c index 7386226046fa..55119cc33d95 100644 --- a/sound/soc/qcom/qdsp6/q6routing.c +++ b/sound/soc/qcom/qdsp6/q6routing.c @@ -68,6 +68,7 @@ { mix_name, "SEC_MI2S_TX", "SEC_MI2S_TX" }, \ { mix_name, "QUAT_MI2S_TX", "QUAT_MI2S_TX" }, \ { mix_name, "QUIN_MI2S_TX", "QUIN_MI2S_TX" }, \ + { mix_name, "SEN_MI2S_TX", "SEN_MI2S_TX" }, \ { mix_name, "TERT_MI2S_TX", "TERT_MI2S_TX" }, \ { mix_name, "SLIMBUS_0_TX", "SLIMBUS_0_TX" }, \ { mix_name, "SLIMBUS_1_TX", "SLIMBUS_1_TX" }, \ @@ -145,6 +146,9 @@ SOC_SINGLE_EXT("QUIN_MI2S_TX", QUINARY_MI2S_TX, \ id, 1, 0, msm_routing_get_audio_mixer, \ msm_routing_put_audio_mixer), \ + SOC_SINGLE_EXT("SEN_MI2S_TX", SENARY_MI2S_TX, \ + id, 1, 0, msm_routing_get_audio_mixer, \ + msm_routing_put_audio_mixer), \ SOC_SINGLE_EXT("SLIMBUS_0_TX", SLIMBUS_0_TX, \ id, 1, 0, msm_routing_get_audio_mixer, \ msm_routing_put_audio_mixer), \ @@ -535,6 +539,9 @@ static const struct snd_kcontrol_new quaternary_mi2s_rx= _mixer_controls[] =3D { static const struct snd_kcontrol_new quinary_mi2s_rx_mixer_controls[] =3D { Q6ROUTING_RX_MIXERS(QUINARY_MI2S_RX) }; =20 +static const struct snd_kcontrol_new senary_mi2s_rx_mixer_controls[] =3D { + Q6ROUTING_RX_MIXERS(SENARY_MI2S_RX) }; + static const struct snd_kcontrol_new tertiary_mi2s_rx_mixer_controls[] =3D= { Q6ROUTING_RX_MIXERS(TERTIARY_MI2S_RX) }; =20 @@ -777,6 +784,9 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widge= ts[] =3D { SND_SOC_DAPM_MIXER("QUIN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, quinary_mi2s_rx_mixer_controls, ARRAY_SIZE(quinary_mi2s_rx_mixer_controls)), + SND_SOC_DAPM_MIXER("SEN_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, + senary_mi2s_rx_mixer_controls, + ARRAY_SIZE(senary_mi2s_rx_mixer_controls)), SND_SOC_DAPM_MIXER("TERT_MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0, tertiary_mi2s_rx_mixer_controls, ARRAY_SIZE(tertiary_mi2s_rx_mixer_controls)), @@ -969,6 +979,7 @@ static const struct snd_soc_dapm_route intercon[] =3D { Q6ROUTING_RX_DAPM_ROUTE("SLIMBUS_6_RX Audio Mixer", "SLIMBUS_6_RX"), Q6ROUTING_RX_DAPM_ROUTE("QUAT_MI2S_RX Audio Mixer", "QUAT_MI2S_RX"), Q6ROUTING_RX_DAPM_ROUTE("QUIN_MI2S_RX Audio Mixer", "QUIN_MI2S_RX"), + Q6ROUTING_RX_DAPM_ROUTE("SEN_MI2S_RX Audio Mixer", "SEN_MI2S_RX"), Q6ROUTING_RX_DAPM_ROUTE("TERT_MI2S_RX Audio Mixer", "TERT_MI2S_RX"), Q6ROUTING_RX_DAPM_ROUTE("SEC_MI2S_RX Audio Mixer", "SEC_MI2S_RX"), Q6ROUTING_RX_DAPM_ROUTE("PRI_MI2S_RX Audio Mixer", "PRI_MI2S_RX"), --=20 2.53.0 From nobody Wed Jun 17 05:11:18 2026 Received: from out-189.mta0.migadu.com (out-189.mta0.migadu.com [91.218.175.189]) (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 359D0379ED2 for ; Thu, 23 Apr 2026 05:09:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.189 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776920989; cv=none; b=pcKiH1UQDYsRYvSVYd2iOt2wxh1wy4K/rzXzgvGu3i7/rg4Uzi/FALmW8+3Y8qQf1D9YuTWTWOj+71H6Gz2UjKO/ElfLgQy8wOnqXbGJPdFNvmqEazCsb7TPE/5mpHGe4VPHwNi/rGAtUx6FKLizOYcwC7cpGGbJyGxT0uZx9Mw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776920989; c=relaxed/simple; bh=KK4PCBaRdORX6zmggbvhDPAyBW9xmTKLJ7Lr4HzmAFI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FKghUOzujb/CmM3Db7qVzxUWEbHYETuYTy+cwZK+wqSzokTnWUl4rjVDmmfJETfR6TqjRhgkQm/UOxTtoA+NDF0w2AiNMUGv2EGUndEFIFQAblxPdnn3DTEC029fpi3vh0T2SPPl5zroMULo8Xq1WhSYc5+9APG1idTaMeyF15o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool; spf=pass smtp.mailfrom=packett.cool; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b=WcDSDhwF; arc=none smtp.client-ip=91.218.175.189 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=packett.cool Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b="WcDSDhwF" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=packett.cool; s=key1; t=1776920986; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hZApfdz3ALUTL6N7BA3ZFZeFOe0Ov8S9Lcryp9JLM2M=; b=WcDSDhwFUzJHDbgNTIpIsBcfDj8w+9BdUrvDUBB+22oajcdqDUvom5f6HGVMe6oHLpSpmA 4vGovVOxSYymWbZwQJMKNrVgiWTViHgRpn6f4OCKIrdFssFUYwvepczIdt09G8+k9zZ4ct NywHR+x7Uy8N7Xr0zOf7tOfOFXfhSrLD9UFe0Px6ORuGCqawpTicH4xvMI0SJlaQlHVhib wkMfgAe91tYWNgXlwFavB5suY+wJrag+BCz1G2vhtW9EH6hkyUH5d9VOpW+2UV+Y4GiUhs /qyqv4/nTi9Nup41dGjZamxsy/lr3BsTr+31Y6HEE/+oddRMwYydoejv6MKXSg== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Bhushan Shah , Luca Weiss , Antoine Bernard , ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/6] ASoC: qcom: sm8250: add Senary MI2S RX support Date: Thu, 23 Apr 2026 01:41:03 -0300 Message-ID: <20260423050801.210840-5-val@packett.cool> In-Reply-To: <20260423050801.210840-2-val@packett.cool> References: <20260423050801.210840-2-val@packett.cool> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Add support for the SENARY_MI2S_RX DAI which is used on some devices to send audio data to speaker amplifiers. Signed-off-by: Val Packett --- sound/soc/qcom/sm8250.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c index f193d0ba63d0..a675913da943 100644 --- a/sound/soc/qcom/sm8250.c +++ b/sound/soc/qcom/sm8250.c @@ -112,6 +112,14 @@ static int sm8250_snd_startup(struct snd_pcm_substream= *substream) snd_soc_dai_set_fmt(cpu_dai, fmt); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; + case SENARY_MI2S_RX: + codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT, + MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + snd_soc_dai_set_fmt(cpu_dai, fmt); + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + break; default: break; } --=20 2.53.0 From nobody Wed Jun 17 05:11:18 2026 Received: from out-182.mta0.migadu.com (out-182.mta0.migadu.com [91.218.175.182]) (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 E1D4821E098; Thu, 23 Apr 2026 05:09:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776920997; cv=none; b=gCF3LBMs7DM3MI087z3sQXBXHmVsnz9SiAXY/VceG/OIWxzn2eOnCvFaOKaHAVKv8Ia+yl66jmGx1DgYsPsli/M+fV81z9yVvJLRKBVCUvAFiQmoZteyB9FkYahCfGAzesZxdig1AqR1+ll0NolWwV9hpyW3tr8CdR6NU/NCUG0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776920997; c=relaxed/simple; bh=a7UPogdHx0uTuy2OsCzLEkJENRdBPtTEH0oDkrvEHyU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Zk5gyWF/JzJAf4iaHryjMNP8QqqTKhUF8HP3mKuQCswTDFXkfy11RABxOKzAVx5j797ThF1B5aek1jgNxOYIPwFW2ExA2w1duO3Q91S+Hhn5TMIjUioeHeXuEciMmHNvhci81EbEvTEDUBjEq6ucwtrzkDtPIObLCJNvpDCo59Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool; spf=pass smtp.mailfrom=packett.cool; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b=l0DIAqww; arc=none smtp.client-ip=91.218.175.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=packett.cool Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b="l0DIAqww" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=packett.cool; s=key1; t=1776920994; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lSL7pttxE/JRyeaeRaF62RvxOJmYhiI+wpWXkA20nbI=; b=l0DIAqwwyQY36KZQZ5WW/UZDPJlZ9MXFoFHsTH5vIds1lE1Z3mrTafN0plFaIB+9XO8uXt gUJKGRkZ0ptQ1XwuVOE0lQXued9P9ZWDZaOz8SBFQOTqwN+UsRgZkBHjaNTljE1ouILgtD Sta4B9gQvf6DlPK5Qlty2zYRoMKWfNGdp6LK94iKcBmugS7HM8VLf4GvUI+Mnma34x1gCs p4BnUf1B+CSH3icm3+w/cVLuqEUWqY/0/NxNMik89WaN8ZjmEgTUwdYGXeqO2D3Hkq4Hsy MvolBddAatscoDTtOr3zr5ZQtBV5K8u+J9g8H1iY20GOTpYYX7evEYe39PGrlg== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Bhushan Shah , Luca Weiss , Antoine Bernard , ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/6] ASoC: qcom: sm8250: add TDM RX support Date: Thu, 23 Apr 2026 01:41:04 -0300 Message-ID: <20260423050801.210840-6-val@packett.cool> In-Reply-To: <20260423050801.210840-2-val@packett.cool> References: <20260423050801.210840-2-val@packett.cool> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Add support for TDM RX DAIs which are used on some devices to send audio data to speaker amplifiers. Signed-off-by: Val Packett --- This is mostly just based on sdm845.c. Is SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B correct? Who actually decides these, or does this file arbitrarily dictate them? sdm845 also has some snd_soc_dai_set_tdm_slot(codec_dai, ..) calls with "magic" constants like SPK_TDM_RX_MASK =3D=3D 0x03 which seem to be probably specific to the first external codec that was used on an sdm845 device? So I didn't copy that, but I'm still curious as to what even that is. --- sound/soc/qcom/sm8250.c | 115 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c index a675913da943..ab1ba44baffb 100644 --- a/sound/soc/qcom/sm8250.c +++ b/sound/soc/qcom/sm8250.c @@ -17,6 +17,9 @@ #include "sdw.h" =20 #define MI2S_BCLK_RATE 1536000 +#define TDM_BCLK_RATE 6144000 + +static unsigned int tdm_slot_offset[8] =3D {0, 4, 8, 12, 16, 20, 24, 28}; =20 struct sm8250_snd_data { bool stream_prepared[AFE_PORT_MAX]; @@ -55,6 +58,64 @@ static void sm8250_snd_exit(struct snd_soc_pcm_runtime *= rtd) =20 } =20 +static int sm8250_tdm_snd_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd =3D snd_soc_substream_to_rtd(substream); + struct snd_soc_dai *cpu_dai =3D snd_soc_rtd_to_cpu(rtd, 0); + int ret =3D 0; + int channels, slot_width; + + switch (params_format(params)) { + case SNDRV_PCM_FORMAT_S16_LE: + slot_width =3D 16; + break; + default: + dev_err(rtd->dev, "%s: invalid param format 0x%x\n", + __func__, params_format(params)); + return -EINVAL; + } + + channels =3D params_channels(params); + + if (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { + ret =3D snd_soc_dai_set_tdm_slot(cpu_dai, 0, 0x3, + 8, slot_width); + if (ret < 0) { + dev_err(rtd->dev, "%s: failed to set tdm slot, err:%d\n", + __func__, ret); + goto end; + } + + ret =3D snd_soc_dai_set_channel_map(cpu_dai, 0, NULL, + channels, tdm_slot_offset); + if (ret < 0) { + dev_err(rtd->dev, "%s: failed to set channel map, err:%d\n", + __func__, ret); + goto end; + } + } else { + ret =3D snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0, + 8, slot_width); + if (ret < 0) { + dev_err(rtd->dev, "%s: failed to set tdm slot, err:%d\n", + __func__, ret); + goto end; + } + + ret =3D snd_soc_dai_set_channel_map(cpu_dai, channels, + tdm_slot_offset, 0, NULL); + if (ret < 0) { + dev_err(rtd->dev, "%s: failed to set channel map, err:%d\n", + __func__, ret); + goto end; + } + } + +end: + return ret; +} + static int sm8250_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, struct snd_pcm_hw_params *params) { @@ -120,6 +181,41 @@ static int sm8250_snd_startup(struct snd_pcm_substream= *substream) snd_soc_dai_set_fmt(cpu_dai, fmt); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; + case PRIMARY_TDM_RX_0: + codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + break; + case SECONDARY_TDM_RX_0: + codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + break; + case TERTIARY_TDM_RX_0: + codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + break; + case QUATERNARY_TDM_RX_0: + codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + break; + case QUINARY_TDM_RX_0: + codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + break; default: break; } @@ -145,10 +241,29 @@ static int sm8250_snd_hw_free(struct snd_pcm_substrea= m *substream) return qcom_snd_sdw_hw_free(substream, &data->stream_prepared[cpu_dai->id= ]); } =20 +static int sm8250_snd_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd =3D snd_soc_substream_to_rtd(substream); + struct snd_soc_dai *cpu_dai =3D snd_soc_rtd_to_cpu(rtd, 0); + int ret =3D 0; + + switch (cpu_dai->id) { + case PRIMARY_TDM_RX_0...QUINARY_TDM_TX_7: + ret =3D sm8250_tdm_snd_hw_params(substream, params); + break; + default: + break; + } + + return ret; +} + static const struct snd_soc_ops sm8250_be_ops =3D { .startup =3D sm8250_snd_startup, .shutdown =3D qcom_snd_sdw_shutdown, .hw_free =3D sm8250_snd_hw_free, + .hw_params =3D sm8250_snd_hw_params, .prepare =3D sm8250_snd_prepare, }; =20 --=20 2.53.0 From nobody Wed Jun 17 05:11:18 2026 Received: from out-180.mta0.migadu.com (out-180.mta0.migadu.com [91.218.175.180]) (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 41B04375F6C; Thu, 23 Apr 2026 05:10:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776921005; cv=none; b=T01U2Abs2EL7y9h1cJPDAySwVZ0RQ6lKbp8bfU8IVcZeL7j0BGvywZCoPxMWGEdZtIbMpvbIP+T1I+HAHMgr+JwVJwPSv1d7laBpmfZq3KojgGZXox5M2VyvSsJABWVRshu2VRc3Egl1KpAlG49B6isdTtfSL+cH/Qt6Gx8VaKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776921005; c=relaxed/simple; bh=SdCcf5dN89huOvpVrHBJ2dyu0Bk+dVbbZzmmkUL0o0Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fcmrp8DPESVI41r9TI5c/VFhL2Q69E/IS1iIhbsZghYKSVNZiB3UhD7isDtC1yqOeHA4QfLK9sdGnig9YHHlpYUl6H03hiTj1SeYVUOfOP19XuVuoL+mHuItTmXX2zX0VDezqHvl/L9MjjbU3oy8XdAHyMN9qUndG2lW8NbhB9Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool; spf=pass smtp.mailfrom=packett.cool; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b=Kff6Qqbj; arc=none smtp.client-ip=91.218.175.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=packett.cool Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b="Kff6Qqbj" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=packett.cool; s=key1; t=1776921000; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L28Te4sCpLg/GnJfgmPRQX0eBmeHEV/a2SFB/bXF6yw=; b=Kff6QqbjxNcoaYbUzRjEzKxMtJq7bGgjdONXizMYPG+XGyX9yBFobSGvQBuLl1+yqu/SBd TVlB9XT45eyln6I8BjSNL+jlNxNb0qTfeiseftWlZaWZ3ORH4Od/xk7Upb6ScGTQetonBR K5XE7TG4G/IRZ/8/DIH+8wXuuW6b/759agc45Ooq7Orjit2wzON/7eSWjOtBtBsxcK6+WE jKKtmCAzUFsfrcVKpMscYBLhM8CDcAHrHx+mvshV0pkclN+kHAoxvs+yMs0ECMzxtEMSvS 84z4G0EYYHfeIeu4RzQE3ZuIszVhjqFMJwTWmIAwQqBYqFyd/X/bZMXeQPHKhA== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Bhushan Shah , Luca Weiss , Antoine Bernard , ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/6] ASoC: qcom: sm8250: shut down MI2S/TDM AFE port clocks Date: Thu, 23 Apr 2026 01:41:05 -0300 Message-ID: <20260423050801.210840-7-val@packett.cool> In-Reply-To: <20260423050801.210840-2-val@packett.cool> References: <20260423050801.210840-2-val@packett.cool> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" These port clocks were never being turned off, leading to increased power consumption after a sound was played through any of these ports for the first time. Use enable counters to disable the clocks in the shutdown callback, similar to how it's done for sdm845. Signed-off-by: Val Packett --- Mostly just noticed in comparison to sdm845 buuut I do wonder if this is one of the things holding up adsp from suspending (/sys/kernel/debug/qcom_stats/adsp is all 0 on my kodiak device).. among with the macros not dropping the LPASS_HW_MACRO_VOTE/etc. during runtime suspend? --- sound/soc/qcom/sm8250.c | 150 +++++++++++++++++++++++++++++++--------- 1 file changed, 119 insertions(+), 31 deletions(-) diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c index ab1ba44baffb..d67b7bd09c94 100644 --- a/sound/soc/qcom/sm8250.c +++ b/sound/soc/qcom/sm8250.c @@ -23,6 +23,7 @@ static unsigned int tdm_slot_offset[8] =3D {0, 4, 8, 12, = 16, 20, 24, 28}; =20 struct sm8250_snd_data { bool stream_prepared[AFE_PORT_MAX]; + uint32_t clk_count[AFE_PORT_MAX]; struct snd_soc_card *card; struct snd_soc_jack jack; struct snd_soc_jack usb_offload_jack; @@ -137,83 +138,95 @@ static int sm8250_snd_startup(struct snd_pcm_substrea= m *substream) unsigned int fmt =3D SND_SOC_DAIFMT_BP_FP; unsigned int codec_dai_fmt =3D SND_SOC_DAIFMT_BC_FC; struct snd_soc_pcm_runtime *rtd =3D snd_soc_substream_to_rtd(substream); + struct snd_soc_card *card =3D rtd->card; + struct sm8250_snd_data *data =3D snd_soc_card_get_drvdata(card); struct snd_soc_dai *cpu_dai =3D snd_soc_rtd_to_cpu(rtd, 0); struct snd_soc_dai *codec_dai =3D snd_soc_rtd_to_codec(rtd, 0); =20 switch (cpu_dai->id) { case PRIMARY_MI2S_RX: codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, - MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[PRIMARY_MI2S_RX]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, + MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case SECONDARY_MI2S_RX: codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, - MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[SECONDARY_MI2S_RX]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, + MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case TERTIARY_MI2S_RX: codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, - MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[TERTIARY_MI2S_RX]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, + MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case QUINARY_MI2S_RX: codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, - MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[QUINARY_MI2S_RX]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, + MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case SENARY_MI2S_RX: codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT, - MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[SENARY_MI2S_RX]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT, + MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case PRIMARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT, - TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[PRIMARY_TDM_RX_0]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case SECONDARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT, - TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[SECONDARY_TDM_RX_0]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case TERTIARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT, - TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[TERTIARY_TDM_RX_0]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case QUATERNARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT, - TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[QUATERNARY_TDM_RX_0]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case QUINARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; - snd_soc_dai_set_sysclk(cpu_dai, - Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT, - TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); + if (++(data->clk_count[QUINARY_TDM_RX_0]) =3D=3D 1) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT, + TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; default: @@ -223,6 +236,81 @@ static int sm8250_snd_startup(struct snd_pcm_substream= *substream) return qcom_snd_sdw_startup(substream); } =20 +static void sm8250_snd_shutdown(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd =3D snd_soc_substream_to_rtd(substream); + struct snd_soc_card *card =3D rtd->card; + struct sm8250_snd_data *data =3D snd_soc_card_get_drvdata(card); + struct snd_soc_dai *cpu_dai =3D snd_soc_rtd_to_cpu(rtd, 0); + + switch (cpu_dai->id) { + case PRIMARY_MI2S_RX: + if (--(data->clk_count[PRIMARY_MI2S_RX]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + case SECONDARY_MI2S_RX: + if (--(data->clk_count[SECONDARY_MI2S_RX]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + case TERTIARY_MI2S_RX: + if (--(data->clk_count[TERTIARY_MI2S_RX]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + case QUINARY_MI2S_RX: + if (--(data->clk_count[QUINARY_MI2S_RX]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + case SENARY_MI2S_RX: + if (--(data->clk_count[SENARY_MI2S_RX]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + case PRIMARY_TDM_RX_0: + if (--(data->clk_count[PRIMARY_TDM_RX_0]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + case SECONDARY_TDM_RX_0: + if (--(data->clk_count[SECONDARY_TDM_RX_0]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + case TERTIARY_TDM_RX_0: + if (--(data->clk_count[TERTIARY_TDM_RX_0]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + case QUATERNARY_TDM_RX_0: + if (--(data->clk_count[QUATERNARY_TDM_RX_0]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + case QUINARY_TDM_RX_0: + if (--(data->clk_count[QUINARY_TDM_RX_0]) =3D=3D 0) + snd_soc_dai_set_sysclk(cpu_dai, + Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT, + 0, SNDRV_PCM_STREAM_PLAYBACK); + break; + default: + break; + } + + qcom_snd_sdw_shutdown(substream); +} + static int sm8250_snd_prepare(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd =3D snd_soc_substream_to_rtd(substream); @@ -261,7 +349,7 @@ static int sm8250_snd_hw_params(struct snd_pcm_substrea= m *substream, =20 static const struct snd_soc_ops sm8250_be_ops =3D { .startup =3D sm8250_snd_startup, - .shutdown =3D qcom_snd_sdw_shutdown, + .shutdown =3D sm8250_snd_shutdown, .hw_free =3D sm8250_snd_hw_free, .hw_params =3D sm8250_snd_hw_params, .prepare =3D sm8250_snd_prepare, --=20 2.53.0 From nobody Wed Jun 17 05:11:18 2026 Received: from out-173.mta0.migadu.com (out-173.mta0.migadu.com [91.218.175.173]) (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 C62E73CCFAB for ; Thu, 23 Apr 2026 05:10:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776921008; cv=none; b=lEx2g/sn5Zl+3GrnEn9p308P4tpbzL7NURLNz4uOo3HBhQBw5aCikeJWby1rNP08lmYXaNTFikHzq1w1B6PKoGLXPvVXYBaS+VXWf5enDgS7auW5hkb3lRWm7zyKzQzrsmMH6J24xx9zDc2NB/tpS6qpXKDRiQOdbf89+7wr4Xs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776921008; c=relaxed/simple; bh=OlY99gRCdd5x9WMjHA+ibN+2JjyLjohIWqWM8HbFr+4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IHKg8zFItVXdt5zD0nMbuX1qLNTyKAQo8+dr2iuEdCLoxnZDWOzaHgJbQdxbq6RQ/dijyPG7IYvQbPa1eyXNdZ4DWkzeL1oxkWLGCCWZwgzTZs8J0ogDwQjTM7/U3PP2vt6JPHegUArXmJDCh7avU4Sgc+bgUHRo+6DXDZmU3pQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool; spf=pass smtp.mailfrom=packett.cool; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b=oqmThNId; arc=none smtp.client-ip=91.218.175.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=packett.cool Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=packett.cool Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=packett.cool header.i=@packett.cool header.b="oqmThNId" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=packett.cool; s=key1; t=1776921005; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZCMXnLkh1m7lCUTps3Ofi8S7MMCahQQbrgJ4E1PAcvQ=; b=oqmThNIdIGUuYcCp6H6A2yYdCnvzcSAzw3kbdrmgRTunem+4d2T1h/pdko87ni2Hyf0F1b M+3Y9/euNm42Lrp8YOwBzxMj5uY7rxitvpdAHG/wEgaMXKaY7/hdrEwRIya9Y0skMPZ0RL iMU7aF6SSAH9MxmtXYFpAUOktg60oEXuSirWR1yaYYJJ8MwORMXHYdRteRoC6Bf/HDkQrW gR8Q4gZnXD4mj9RGGSa+C3wp+hWphh33mZOZj5N8jbNR1sCfOXF69G+OZBaAew81VS5yEZ F3apud3YgfwOOuLr6TEYd1WwQTrWwugcieO7BIgpZ2r35DsJVBJ7FIKBjIMT9w== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Bhushan Shah , Luca Weiss , Antoine Bernard , ~postmarketos/upstreaming@lists.sr.ht, phone-devel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 6/6] ASoC: qcom: sm8250: apply codec_fmt to all codec DAIs Date: Thu, 23 Apr 2026 01:41:06 -0300 Message-ID: <20260423050801.210840-8-val@packett.cool> In-Reply-To: <20260423050801.210840-2-val@packett.cool> References: <20260423050801.210840-2-val@packett.cool> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" With MI2S and TDM interfaces, multiple codecs typically share one bus. All codecs on the bus should receive the same format configuration, so apply the codec_fmt to all of them. Signed-off-by: Val Packett --- sound/soc/qcom/sm8250.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c index d67b7bd09c94..6e0e3e0ad55f 100644 --- a/sound/soc/qcom/sm8250.c +++ b/sound/soc/qcom/sm8250.c @@ -141,7 +141,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) struct snd_soc_card *card =3D rtd->card; struct sm8250_snd_data *data =3D snd_soc_card_get_drvdata(card); struct snd_soc_dai *cpu_dai =3D snd_soc_rtd_to_cpu(rtd, 0); - struct snd_soc_dai *codec_dai =3D snd_soc_rtd_to_codec(rtd, 0); + struct snd_soc_dai *codec_dai; + int j; =20 switch (cpu_dai->id) { case PRIMARY_MI2S_RX: @@ -151,7 +152,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT, MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case SECONDARY_MI2S_RX: codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; @@ -160,7 +162,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT, MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case TERTIARY_MI2S_RX: codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; @@ -169,7 +172,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT, MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case QUINARY_MI2S_RX: codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; @@ -178,7 +182,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT, MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case SENARY_MI2S_RX: codec_dai_fmt |=3D SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S; @@ -187,7 +192,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT, MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); snd_soc_dai_set_fmt(cpu_dai, fmt); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case PRIMARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; @@ -195,7 +201,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) snd_soc_dai_set_sysclk(cpu_dai, Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT, TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case SECONDARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; @@ -203,7 +210,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) snd_soc_dai_set_sysclk(cpu_dai, Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT, TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case TERTIARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; @@ -211,7 +219,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) snd_soc_dai_set_sysclk(cpu_dai, Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT, TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case QUATERNARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; @@ -219,7 +228,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) snd_soc_dai_set_sysclk(cpu_dai, Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT, TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; case QUINARY_TDM_RX_0: codec_dai_fmt |=3D SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_DSP_B; @@ -227,7 +237,8 @@ static int sm8250_snd_startup(struct snd_pcm_substream = *substream) snd_soc_dai_set_sysclk(cpu_dai, Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT, TDM_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK); - snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); + for_each_rtd_codec_dais(rtd, j, codec_dai) + snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt); break; default: break; --=20 2.53.0