提交 5847609e 编写于 作者: C Charles Keepax 提交者: Mark Brown

ASoC: wm_adsp: Improve DSP error handling

If we encounter an error on the DSP side whilst user-space is
waiting on the poll we should call snd_compr_fragment_elapsed,
although data is not actually available we want to wake
user-space such that the error can be propagated out
quickly. Additionally some versions of the DSP firmware are
not super consistent about actually generating an IRQ if they
encounter an error, as such we will check the DSP error status
every time we run out of available data as well, to ensure we
catch it.
Signed-off-by: NCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: NMark Brown <broonie@kernel.org>
上级 9771b18a
...@@ -2853,7 +2853,7 @@ int wm_adsp_compr_handle_irq(struct wm_adsp *dsp) ...@@ -2853,7 +2853,7 @@ int wm_adsp_compr_handle_irq(struct wm_adsp *dsp)
ret = wm_adsp_buffer_get_error(buf); ret = wm_adsp_buffer_get_error(buf);
if (ret < 0) if (ret < 0)
goto out; goto out_notify; /* Wake poll to report error */
ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(irq_count), ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(irq_count),
&buf->irq_count); &buf->irq_count);
...@@ -2868,6 +2868,7 @@ int wm_adsp_compr_handle_irq(struct wm_adsp *dsp) ...@@ -2868,6 +2868,7 @@ int wm_adsp_compr_handle_irq(struct wm_adsp *dsp)
goto out; goto out;
} }
out_notify:
if (compr && compr->stream) if (compr && compr->stream)
snd_compr_fragment_elapsed(compr->stream); snd_compr_fragment_elapsed(compr->stream);
...@@ -2928,6 +2929,10 @@ int wm_adsp_compr_pointer(struct snd_compr_stream *stream, ...@@ -2928,6 +2929,10 @@ int wm_adsp_compr_pointer(struct snd_compr_stream *stream,
* DSP to inform us once a whole fragment is available. * DSP to inform us once a whole fragment is available.
*/ */
if (buf->avail < wm_adsp_compr_frag_words(compr)) { if (buf->avail < wm_adsp_compr_frag_words(compr)) {
ret = wm_adsp_buffer_get_error(buf);
if (ret < 0)
goto out;
ret = wm_adsp_buffer_reenable_irq(buf); ret = wm_adsp_buffer_reenable_irq(buf);
if (ret < 0) { if (ret < 0) {
adsp_err(dsp, adsp_err(dsp,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册