aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>2016-04-06 06:21:54 -0400
committerMark Brown <broonie@kernel.org>2016-04-06 13:15:21 -0400
commit5847609edb3c80be07e897e449a9bb579a0fe9d8 (patch)
treebd22f1b0a2c93483d5d4278e6a09b4e15cabb7bb
parent9771b18a0b374b6e6ecfa84c8b59d5ef79e969b1 (diff)
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: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/codecs/wm_adsp.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index f70c60914042..3ac2e1f06ad3 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -2853,7 +2853,7 @@ int wm_adsp_compr_handle_irq(struct wm_adsp *dsp)
2853 2853
2854 ret = wm_adsp_buffer_get_error(buf); 2854 ret = wm_adsp_buffer_get_error(buf);
2855 if (ret < 0) 2855 if (ret < 0)
2856 goto out; 2856 goto out_notify; /* Wake poll to report error */
2857 2857
2858 ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(irq_count), 2858 ret = wm_adsp_buffer_read(buf, HOST_BUFFER_FIELD(irq_count),
2859 &buf->irq_count); 2859 &buf->irq_count);
@@ -2868,6 +2868,7 @@ int wm_adsp_compr_handle_irq(struct wm_adsp *dsp)
2868 goto out; 2868 goto out;
2869 } 2869 }
2870 2870
2871out_notify:
2871 if (compr && compr->stream) 2872 if (compr && compr->stream)
2872 snd_compr_fragment_elapsed(compr->stream); 2873 snd_compr_fragment_elapsed(compr->stream);
2873 2874
@@ -2928,6 +2929,10 @@ int wm_adsp_compr_pointer(struct snd_compr_stream *stream,
2928 * DSP to inform us once a whole fragment is available. 2929 * DSP to inform us once a whole fragment is available.
2929 */ 2930 */
2930 if (buf->avail < wm_adsp_compr_frag_words(compr)) { 2931 if (buf->avail < wm_adsp_compr_frag_words(compr)) {
2932 ret = wm_adsp_buffer_get_error(buf);
2933 if (ret < 0)
2934 goto out;
2935
2931 ret = wm_adsp_buffer_reenable_irq(buf); 2936 ret = wm_adsp_buffer_reenable_irq(buf);
2932 if (ret < 0) { 2937 if (ret < 0) {
2933 adsp_err(dsp, 2938 adsp_err(dsp,