ASoC: qcom: q6apm: keep the graph start count in sync with the DSP

q6apm_graph_start() increments start_count even when APM_CMD_GRAPH_START
fails, leaving the graph counted as running while the DSP never started
it. A later start - a retried prepare, or a resume after a failed start -
then finds a non-zero count, skips the command and returns success with
no data flowing.

Count the graph only once the DSP has accepted the start. The count then
stays at zero for a graph that never started, so also stop decrementing
below zero in q6apm_graph_stop(): the compressed free path stops
unconditionally, and a negative count would make the next start skip the
command in the same way.

Fixes: 5477518b8a ("ASoC: qdsp6: audioreach: add q6apm support")
Assisted-by: Claude:claude-opus-5
Signed-off-by: Jorijn van der Graaf <jorijnvdgraaf@catcrafts.net>
Link: https://patch.msgid.link/20260726211226.94059-1-jorijnvdgraaf@catcrafts.net
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Jorijn van der Graaf 2026-07-26 23:12:26 +02:00 committed by Mark Brown
parent 9e0698b776
commit daa7ffd765
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -802,14 +802,17 @@ EXPORT_SYMBOL_GPL(q6apm_graph_prepare);
int q6apm_graph_start(struct q6apm_graph *graph)
{
struct audioreach_graph *ar_graph = graph->ar_graph;
int ret = 0;
int ret;
if (ar_graph->start_count == 0)
if (ar_graph->start_count == 0) {
ret = audioreach_graph_mgmt_cmd(ar_graph, APM_CMD_GRAPH_START);
if (ret)
return ret;
}
ar_graph->start_count++;
return ret;
return 0;
}
EXPORT_SYMBOL_GPL(q6apm_graph_start);
@ -817,6 +820,9 @@ int q6apm_graph_stop(struct q6apm_graph *graph)
{
struct audioreach_graph *ar_graph = graph->ar_graph;
if (ar_graph->start_count == 0)
return 0;
if (--ar_graph->start_count > 0)
return 0;