FAILED: patch "[PATCH] ASoC: q6apm: add q6apm_get_hw_pointer helper" failed to apply to 5.15-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x 0badb5432fd525a00db5630c459b635e9d47f445
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2025041744-riding-smartness-2638@gregkh' --subject-prefix 'PATCH 5.15.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 0badb5432fd525a00db5630c459b635e9d47f445 Mon Sep 17 00:00:00 2001
From: Srinivas Kandagatla <[email protected]>
Date: Fri, 14 Mar 2025 17:47:57 +0000
Subject: [PATCH] ASoC: q6apm: add q6apm_get_hw_pointer helper
Implement an helper function in q6apm to be able to read the current hardware pointer for both read and write buffers.
This should help q6apm-dai to get the hardware pointer consistently without it doing manual calculation, which could go wrong in some race conditions.
sound/soc/qcom/qdsp6/q6apm.c +17 -1
@@ -494,6 +494,19 @@ int q6apm_read(struct q6apm_graph *graph) }EXPORT_SYMBOL_GPL (q6apm_read); +int q6apm_get_hw_pointer (struct q6apm_graph *graph,int dir) +{ +struct audioreach_graph_data *data; + +if (dir ==SNDRV_PCM_STREAM_PLAYBACK ) + data = &graph->rx_data; +else + data = &graph->tx_data; + +return (int )atomic_read (&data->hw_ptr); +} +EXPORT_SYMBOL_GPL (q6apm_get_hw_pointer); +static int graph_callback (struct gpr_resp_pkt *data,void *priv,int op) {struct data_cmd_rsp_rd_sh_mem_ep_data_buffer_done_v2 *rd_done;
@@ -520,7 +533,8 @@ static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op) done = data->payload; phys = graph->rx_data.buf[token].phys;mutex_unlock (&graph->lock); - +/* token numbering starts at 0 */ +atomic_set (&graph->rx_data.hw_ptr, token +1 );if (lower_32_bits (phys) == done->buf_addr_lsw &&upper_32_bits (phys) == done->buf_addr_msw) { graph->result.opcode = hdr->opcode;
@@ -553,6 +567,8 @@ static int graph_callback(struct gpr_resp_pkt *data, void *priv, int op) rd_done = data->payload; phys = graph->tx_data.buf[hdr->token].phys;mutex_unlock (&graph->lock); +/* token numbering starts at 0 */ +atomic_set (&graph->tx_data.hw_ptr, hdr->token +1 );if (upper_32_bits (phys) == rd_done->buf_addr_msw &&lower_32_bits (phys) == rd_done->buf_addr_lsw) {
sound/soc/qcom/qdsp6/q6apm.h +3 -0
@@ -2,6 +2,7 @@#ifndef __Q6APM_H__#define __Q6APM_H__#include <linux/types.h> +#include <linux/atomic.h> #include <linux/slab.h> #include <linux/wait.h> #include <linux/kernel.h>
@@ -77,6 +78,7 @@ struct audioreach_graph_data {uint32_t num_periods;uint32_t dsp_buf;uint32_t mem_map_handle; +atomic_t hw_ptr; };struct audioreach_graph {
@@ -150,4 +152,5 @@ int q6apm_enable_compress_module(struct device *dev, struct q6apm_graph *graph,int q6apm_remove_initial_silence (struct device *dev,struct q6apm_graph *graph,uint32_t samples);int q6apm_remove_trailing_silence (struct device *dev,struct q6apm_graph *graph,uint32_t samples);int q6apm_set_real_module_id (struct device *dev,struct q6apm_graph *graph,uint32_t codec_id); +int q6apm_get_hw_pointer (struct q6apm_graph *graph,int dir);#endif /* __APM_GRAPH_ */