Merge remote-tracking branch 'asoc/for-4.19' into asoc-4.20
[muen/linux.git] / sound / soc / amd / acp-pcm-dma.c
index c7e972b17c90205463c5a5991fc57c4d6b1df543..cdebab2f8ce53eb5347525cd1292d9533d1e899d 100644 (file)
@@ -1040,16 +1040,22 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream)
 
        if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
                period_bytes = frames_to_bytes(runtime, runtime->period_size);
-               dscr = acp_reg_read(rtd->acp_mmio, rtd->dma_curr_dscr);
-               if (dscr == rtd->dma_dscr_idx_1)
-                       pos = period_bytes;
-               else
-                       pos = 0;
                bytescount = acp_get_byte_count(rtd);
-               if (bytescount > rtd->bytescount)
+               if (bytescount >= rtd->bytescount)
                        bytescount -= rtd->bytescount;
-               delay = do_div(bytescount, period_bytes);
-               runtime->delay = bytes_to_frames(runtime, delay);
+               if (bytescount < period_bytes) {
+                       pos = 0;
+               } else {
+                       dscr = acp_reg_read(rtd->acp_mmio, rtd->dma_curr_dscr);
+                       if (dscr == rtd->dma_dscr_idx_1)
+                               pos = period_bytes;
+                       else
+                               pos = 0;
+               }
+               if (bytescount > 0) {
+                       delay = do_div(bytescount, period_bytes);
+                       runtime->delay = bytes_to_frames(runtime, delay);
+               }
        } else {
                buffersize = frames_to_bytes(runtime, runtime->buffer_size);
                bytescount = acp_get_byte_count(rtd);