On 9/4/25 11:18 AM, Krzysztof Kozlowski wrote: > If earlier opening of source graph fails (e.g. ADSP rejects due to > incorrect audioreach topology), the graph is closed and > "dai_data->graph[dai->id]" is assigned NULL. Preparing the DAI for sink > graph continues though and next call to q6apm_lpass_dai_prepare() > receives dai_data->graph[dai->id]=NULL leading to NULL pointer > exception: > > qcom-apm gprsvc:service:2:1: Error (1) Processing 0x01001002 cmd > qcom-apm gprsvc:service:2:1: DSP returned error[1001002] 1 > q6apm-lpass-dais 30000000.remoteproc:glink-edge:gpr:service@1:bedais: fail to start APM port 78 > q6apm-lpass-dais 30000000.remoteproc:glink-edge:gpr:service@1:bedais: ASoC: error at snd_soc_pcm_dai_prepare on TX_CODEC_DMA_TX_3: -22 > Unable to handle kernel NULL pointer dereference at virtual address 00000000000000a8 > ... > Call trace: > q6apm_graph_media_format_pcm+0x48/0x120 (P) > q6apm_lpass_dai_prepare+0x110/0x1b4 > snd_soc_pcm_dai_prepare+0x74/0x108 > __soc_pcm_prepare+0x44/0x160 > dpcm_be_dai_prepare+0x124/0x1c0 > > Fixes: 30ad723b93ad ("ASoC: qdsp6: audioreach: add q6apm lpass dai support") > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@xxxxxxxxxx> > > --- > > Changes in v2: > 1. Use approach suggested by Srini (you gave me some code, so shall I > add Co-developed-by?) don't worry about it. LGTM, Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxxxxxxxx> --srini > --- > sound/soc/qcom/qdsp6/q6apm-lpass-dais.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/sound/soc/qcom/qdsp6/q6apm-lpass-dais.c b/sound/soc/qcom/qdsp6/q6apm-lpass-dais.c > index a0d90462fd6a..20974f10406b 100644 > --- a/sound/soc/qcom/qdsp6/q6apm-lpass-dais.c > +++ b/sound/soc/qcom/qdsp6/q6apm-lpass-dais.c > @@ -213,8 +213,10 @@ static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct s > > return 0; > err: > - q6apm_graph_close(dai_data->graph[dai->id]); > - dai_data->graph[dai->id] = NULL; > + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { > + q6apm_graph_close(dai_data->graph[dai->id]); > + dai_data->graph[dai->id] = NULL; > + } > return rc; > } >