From nobody Sat Jun 13 15:17:30 2026 Received: from out-179.mta1.migadu.com (out-179.mta1.migadu.com [95.215.58.179]) (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 65F0336164B; Wed, 6 May 2026 20:43:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100194; cv=none; b=GSsxvUwFZlTmysNb5AZtkn93K9PPV32RntBDopmbNx4YXcG8YDVCsOYWJV1tgoqCKU9mNI+ZMwU6lJ2akqnVcddE2KaBX85XHZP1loGVnB7tZElmkaoqyb6Q+pWi8JFNU4vBLFtruyK4rzrizVDvkLoxbmr7wptQJb63N23SR2g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100194; c=relaxed/simple; bh=0QiQBPIOcLjIk+6uVZ2ym6r2K6OOhQg2VGfU3Pf5PwM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RHQFyxOXNaC37FFFPn6hOyeBzozmnvOpDzShc2e9MIpEJSK3R81Cl2qi4bDqNROSuOKL0ouMpKDDO4BDjUS3QvhHh1eJiB+dTbkDoSzIjbYJHDha/86Jn/SgyAy10mrSGP5RrOcDa7CnnGaYWtDCtlMIqMfJnLLASAcN961/jK8= 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=UL1QvyZO; arc=none smtp.client-ip=95.215.58.179 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="UL1QvyZO" 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=1778100189; 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=W1Y43cl3NFWC2uTS5PoFccmqAiBjm5cvOxvgFfBLr4E=; b=UL1QvyZOPHYGTO8hTStY+HmqBR5MB/RV8keKyFDCly7SbFDcejaobMPNs/TrHa2iMhHHlJ Vr15Te0ceR05o3mpRksK2X/Rg2UeAYWrd5wrm6CEwJfahREWQwHe8l7ywzjUeDTIC1QFuv NcVvW4a8WNvg0uTVxRnEdCNbnx+9JHLPM82DutEKnHpDihPlYUX5v0rfT/FWyM06wJlL9U Xy2c7AdEE3Hzfp/lNVF8Y+Y2avwYnAZNkUAg7ocPolOUAmzZutvnxMiPpq+S2EnqZVvWu8 FCQ7qpwNh70TeHhAT7foA4+2+hcXU2RzN5YrLcPxvuR+0P/566/ifWA1Nr0HLw== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Srinivas Kandagatla , 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, stable@vger.kernel.org Subject: [PATCH v2 1/6] ASoC: qcom: qdsp6: q6afe: fix clk vote response type mismatch Date: Wed, 6 May 2026 17:33:02 -0300 Message-ID: <20260506204142.659778-2-val@packett.cool> In-Reply-To: <20260506204142.659778-1-val@packett.cool> References: <20260506204142.659778-1-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 some reports of random 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. Cc: stable@vger.kernel.org Link: https://lore.kernel.org/all/5976946.DvuYhMxLoT@antlia/ Fixes: 55e07531d922 ("ASoC: q6dsp: q6afe: add lpass hw voting support") Reviewed-by: Srinivas Kandagatla Signed-off-by: Val Packett --- 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 Sat Jun 13 15:17:30 2026 Received: from out-174.mta1.migadu.com (out-174.mta1.migadu.com [95.215.58.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 0B5BE3AF66E for ; Wed, 6 May 2026 20:43:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100199; cv=none; b=o1OZCY+zgDG+6mPuZ5K5VGRKcY9pytSX6J1pFlKHYI1VJlyE8eMPv8/BUOYOPVuIPk58HAmgMA34KQtUekzrE6XfT/Xgi2T3w4eeP5InWgBt7f87r8Hl8lwKhTUNb6kBLroWQtEPmnnfXMxClRwps9+UFsMndBfF6kLta3IzzjQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100199; c=relaxed/simple; bh=2yxpfwbmtMhGY7toV/DOGqB0FSWoIMgpc7O5paD+vro=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qzL4woCfLYt9v5eO8P9J+/OeNAKnSvck7WSZgCKMAghQfzumLwV0Rnfp+ve1kB4Y9LEoO5NvTBhyBPBidvQj9WZh1Z5Myk7TWfhSOY6CUf1jXx5RfhL2ZIglDKU0XMjKqgbfFQktAYzY56qZ5/g7xuP8TMUv/WNj7GQBbHbRFCs= 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=kPerp9wx; arc=none smtp.client-ip=95.215.58.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="kPerp9wx" 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=1778100194; 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=kPerp9wxHVJwxiQAqn6fQ1OIn2j97rvSrgT3dYiymEbjTwaWHB/EGAIN6bTznvfsmeJASy Edn7lWOIZLAmbhUL++3zgLTK3mp0xHY6UsY5ydP6j0PJLYw/3cTObQvBAno6o6h5l8rArS IlP9W4PwpXRua9rXTj2OsnU/jsscwZNXyA3FS1p0cMHUiglGiNuobIaXQmAMzdjw3OvHKb enZSJPEAAMKkHuveQLJxedTKLNboi+nO7roN7MMUPy1jen6fMdhzYOP6V3A5ihPn/Vyr+e cdkLl82S4d3WoVtJAiJSUS9mQSXLg1rRsdCBHEKyA9GnLlPdGP2zFIouZTBRKA== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Srinivas Kandagatla , 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 v2 2/6] ASoC: qcom: qdsp6: q6routing: add Senary MI2S ports Date: Wed, 6 May 2026 17:33:03 -0300 Message-ID: <20260506204142.659778-3-val@packett.cool> In-Reply-To: <20260506204142.659778-1-val@packett.cool> References: <20260506204142.659778-1-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 Reviewed-by: Srinivas Kandagatla --- 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 Sat Jun 13 15:17:30 2026 Received: from out-189.mta1.migadu.com (out-189.mta1.migadu.com [95.215.58.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 D9AF73B0AEF for ; Wed, 6 May 2026 20:43:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.189 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100202; cv=none; b=c9MgJrF6G5m6Hk2Oa8/7RP1fmqYz9L7eTUV6iPTjbTK19vYG7X2wCYq9N5nff7S1d3LVfk4j31ieQ0oNg9C33cGngasp/3+CapiidxRCgaLOCTR9l4vY/SnHePoDo1AT43Hg+Z5fZN3pQMjuoqA9oxON7uM6fy77gZm2ZoeU3bE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100202; c=relaxed/simple; bh=KK4PCBaRdORX6zmggbvhDPAyBW9xmTKLJ7Lr4HzmAFI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nlJ9zkit7RgXWX0WmC9K9rHYcJUX60ScVNveaCutPbPVNobbiERexLYu+BAGQrHa3aPl3tIp09pUlmDZ79JGcgLASH5/TqlYRiZhHxIhZVvHJnUjdkqC+H0dGCY9KZhnc8sAZWAxBW5+jsf45C+szodN3bwhr6rXZHMT/tONllY= 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=pwSb404N; arc=none smtp.client-ip=95.215.58.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="pwSb404N" 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=1778100198; 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=pwSb404Ncyky1c/VDBuTSk1jeQ14hmKYkGvGvd3oP00kD8PBTWx7Xh77OeWDbc7rhKx0g0 Sv8UctKkMjisAbn3D45ZEbDh2ZBhGhgbqaRTm6pJis3mCmv7N1uuR0NJPHY7mrMHXzhd+O 1KD7WTch+QWPp/lsuBqY8ce8NMQhMnWR1IF7XR67E/W0AaT+wnD08EWkjKGdqb6P7fDQH9 4pgCwd537XtBSRRGdVRSR2HsdemYNAoifLhOPCiV0Gm5vDhIRf82pOugGsfoNx2ZPMisM9 aBgZYoP4PTEJQX37YC+55TCzw3cRLY+5mmtJnxUyD9usj7NM3UGv2xD4Mqi95Q== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Srinivas Kandagatla , 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 v2 3/6] ASoC: qcom: sm8250: add Senary MI2S RX support Date: Wed, 6 May 2026 17:33:04 -0300 Message-ID: <20260506204142.659778-4-val@packett.cool> In-Reply-To: <20260506204142.659778-1-val@packett.cool> References: <20260506204142.659778-1-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 Reviewed-by: Srinivas Kandagatla --- 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 Sat Jun 13 15:17:30 2026 Received: from out-187.mta1.migadu.com (out-187.mta1.migadu.com [95.215.58.187]) (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 B060D3AF65F for ; Wed, 6 May 2026 20:43:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.187 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100208; cv=none; b=boReH87dzASrRrHDmAi2yIsuKVmXyuGvbtOapuKXskguRzG7OGGHwWamf0RHhd9j5rdnBpme/EEI0N8y6bqwn8Hg26UV7zOQdMerD6dS27YXcP/foTLNi+IcOA2yqBEuDbsjJJh5Y6NNOkJR61dk+IgqI3yYN8bYC5wGWeBp25M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100208; c=relaxed/simple; bh=9cqY5Ei5/Xd+BUyLi7B0HYfLfTRUBd/DmkQpssIit/g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ale/agmZJCRssEeDNEArXGONOv6TxQJjwjwGjJ9nEwpaSR4MCt/73hefPpPRZpDztmQgzAkffjHY6gfoK3iUsbrc39epAD+AXO7QCHv+qXEUWGCO1Euv3DbxwX2srBdmaOAd7xKKyQ2StBN5fkBbmFT19hYIZPzXl5t1JbPCtaE= 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=XFLiYNXd; arc=none smtp.client-ip=95.215.58.187 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="XFLiYNXd" 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=1778100203; 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=Ujeou9PrF70xNxDNtL4x4ZU2rn4Mnf7hRj3ZTMa6ymY=; b=XFLiYNXdkolsdpNiI0zEOt/0dD6PisS5aKc/po5DJ2XmpVp0Ze1ltdfl00GO8cBXI8WXsi D2g4kTw2iUT3kzp2tyUz9H0ZCjk9xznZVHlRuZo+vwv2OZWmj3zgLgNxGvAWWVGh6ck2DA rLudB4HMLctablP5+mxu9FVG3+ZX8vexkZXnmB/RGC1C60zNC5SMujsDBEIltl3zOFSDrv eWfzu8GfUe8SbMOP+QxwAhFkiEIwEnHMukzRyLwk8tU4jfcYknP7yIPJLe13O66Fkf1HdM cUltZqt2DHjzIiedeA6PSF9o9NtCCnQ3RAPXprRuIB00HWJnY5AMMhbpBorJoA== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Srinivas Kandagatla , 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 v2 4/6] ASoC: qcom: sm8250: add TDM RX support Date: Wed, 6 May 2026 17:33:05 -0300 Message-ID: <20260506204142.659778-5-val@packett.cool> In-Reply-To: <20260506204142.659778-1-val@packett.cool> References: <20260506204142.659778-1-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. Channels are assigned based on the codec DAI names for a quad-speaker setup such as on the xiaomi-pipa tablet. Signed-off-by: Val Packett --- sound/soc/qcom/sm8250.c | 141 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c index a675913da943..b64fd3970ba1 100644 --- a/sound/soc/qcom/sm8250.c +++ b/sound/soc/qcom/sm8250.c @@ -17,6 +17,10 @@ #include "sdw.h" =20 #define MI2S_BCLK_RATE 1536000 +#define TDM_BCLK_RATE 6144000 +#define NUM_TDM_SLOTS 8 + +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 +59,89 @@ 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); + struct snd_soc_dai *codec_dai; + unsigned int rx_mask; + int ret =3D 0, j; + 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; + } + } + + for_each_rtd_codec_dais(rtd, j, codec_dai) { + if (strstr(codec_dai->component->name_prefix, "PL")) { + rx_mask =3D BIT(0); + } else if (strstr(codec_dai->component->name_prefix, "PR")) { + rx_mask =3D BIT(1); + } else if (strstr(codec_dai->component->name_prefix, "SL")) { + rx_mask =3D BIT(2); + } else if (strstr(codec_dai->component->name_prefix, "SR")) { + rx_mask =3D BIT(3); + } else { + rx_mask =3D 0; + dev_warn(rtd->dev, "%s: codec DAI name '%s' not recognized\n", + __func__, codec_dai->component->name_prefix); + } + ret =3D snd_soc_dai_set_tdm_slot(codec_dai, 0, rx_mask, + NUM_TDM_SLOTS, slot_width); + if (ret < 0) { + dev_err(rtd->dev, "%s: failed to set TDM slot, 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 +207,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 +267,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 Sat Jun 13 15:17:30 2026 Received: from out-176.mta1.migadu.com (out-176.mta1.migadu.com [95.215.58.176]) (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 95A723AF667 for ; Wed, 6 May 2026 20:43:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100213; cv=none; b=rUVEPm9wpZPj1UfMHbc1rurntSXmjV/4f0YA3WKKDW1KHJ4eLmFkY2JCPCLzPUSC1V++UGTr02aqAvkBeHLy8hLroiVtsKzCUvtQes12Mcqr0IsXvTbemnUvjrg2LTqRWgaGZN3bchiNahQTay5tXWMrvKcyk1HqNdZgfWQNsto= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100213; c=relaxed/simple; bh=edYLieIDPBhCD3StzZq9rRArw/5rQDHxmGyYGxgiUXY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N/OaguLSAXut6yWPUePR9CwzPNqULUW18NDebvWxt8bJFVKGIyS9mVXVL9OD0TIwa1DP5/IhPfbqCiI4o52nHNrQC4avcTvJYkj8SszycTn/3t2BaSMSY0B8hfHEveudh+ZK9NpkixbyZVNrZQy1oC4GzSsMBNwj8jy50od2f3w= 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=QdY+WYAI; arc=none smtp.client-ip=95.215.58.176 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="QdY+WYAI" 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=1778100208; 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=TGyIQHm1frgCjrMqtV3tvUoJBEcUKkCxoYR5gVevYVI=; b=QdY+WYAIggoFN5TdvYRR55g+BEhODBx9nokzd7jGBmmJdRGnqL7S1m77RBdbknDmlihh8n UiUbP+7jk7ofPx+He7D1D9USLax8RNtmDiYkjxZwNFIHxeU37cxyuW8r62hN5wsWG6vGpn ypURdLzjg5zvKKcPgxhlDMmT7w6iTCFdYaUjfAZqwBOB3ZdlP0ShAWE5/K+iK0OWz1Lbaa I9ctgckQFP48XuUGmh4B4dtM5we5D9SMbxyXLIQ91qZrQ1yZvs21g+CzkA4MlQn8i0vG+m 02EngM3Mose9sF5O2Q99E/2BNtizcJK5xVH/PDwfIYMJUqXoPjQs3Q282EZpDA== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Srinivas Kandagatla , 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 v2 5/6] ASoC: qcom: sm8250: shut down MI2S/TDM AFE port clocks Date: Wed, 6 May 2026 17:33:06 -0300 Message-ID: <20260506204142.659778-6-val@packett.cool> In-Reply-To: <20260506204142.659778-1-val@packett.cool> References: <20260506204142.659778-1-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 --- 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 b64fd3970ba1..9f0f846a14bb 100644 --- a/sound/soc/qcom/sm8250.c +++ b/sound/soc/qcom/sm8250.c @@ -24,6 +24,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; @@ -163,83 +164,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: @@ -249,6 +262,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); @@ -287,7 +375,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 Sat Jun 13 15:17:30 2026 Received: from out-170.mta1.migadu.com (out-170.mta1.migadu.com [95.215.58.170]) (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 4AD353AF65F for ; Wed, 6 May 2026 20:43:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100217; cv=none; b=j4Chy7pDTmXd1F8teiDOJjBha5EsWyBU8iAxqkaDd+nilVjXRBwYtEKwoN6k4Yc9vhHwh3DpLaf/SHIstTeWwrzjgj4f7pwQzlyVLPL5KwXwPQme9r+2nP0gXOvqqqHAk1wKqrFdbYufSlRCeKBxYNi8byZjk2i2C+p1fVDs1sM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778100217; c=relaxed/simple; bh=mkrWHkKQZ9EXxIWk183p4Zi2Dz7rdySdphV8oksIZCI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Mq3wKngfPnisg66SNtBP0KKyGbHcVd1hmicFriftYIX9QqV6GN39xVU03lrsCPRlz48CJltDKGnIFbfqtkhUtZk3SUzoF78ikt/z8tSTrUcQ/N7yzdztuDXKuyv9Y7PIbhYrcYedfYVZgO/QvDXeG7pvlYF1YBFETzgOeZPdeIo= 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=TmcAFRI2; arc=none smtp.client-ip=95.215.58.170 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="TmcAFRI2" 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=1778100213; 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=8zbFSBdUC9xyHfVZkO54oOJ7WRei6/sQgEnNOLMqrdM=; b=TmcAFRI2HTH9Hvp2Df0XjwLHCT+LX00wS/b1+gIm9h0mXUyq6tNUy1Qn1zox1GQOVm0buI x0oDjXHDK77BppoMwYApd8siBZNstquFypeL14kgrjrVvbuxi2/RrJ3MqMI5mixUGK2+iv qaS0KNngyHhHyArrxF6bXAz3MhL0sDnfv/JKZhJgCgH3h23jqGPjno6iiwxPfp/ZteREs3 Q5rwGPVJbNWBN1V994KX8Y9CMwclYhzwarNgwt6iyTtmC3wmixVOvl/2tYDKBPUC8f6LyO fBmNdlSEz1vUgBIVwzNg8QeGI3ucphh3V3iI6iR7+Hwd/FC3H7tbAJuNajek+g== From: Val Packett To: Srinivas Kandagatla , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Val Packett , Srinivas Kandagatla , 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 v2 6/6] ASoC: qcom: sm8250: apply codec_fmt to all codec DAIs Date: Wed, 6 May 2026 17:33:07 -0300 Message-ID: <20260506204142.659778-7-val@packett.cool> In-Reply-To: <20260506204142.659778-1-val@packett.cool> References: <20260506204142.659778-1-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 9f0f846a14bb..7bfe6d282231 100644 --- a/sound/soc/qcom/sm8250.c +++ b/sound/soc/qcom/sm8250.c @@ -167,7 +167,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: @@ -177,7 +178,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; @@ -186,7 +188,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; @@ -195,7 +198,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; @@ -204,7 +208,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; @@ -213,7 +218,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; @@ -221,7 +227,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; @@ -229,7 +236,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; @@ -237,7 +245,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; @@ -245,7 +254,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; @@ -253,7 +263,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