|
@@ -69,6 +69,23 @@ static void psc_dma_bcom_enqueue_next_buffer(struct psc_dma_stream *s)
|
|
|
|
|
|
static void psc_dma_bcom_enqueue_tx(struct psc_dma_stream *s)
|
|
|
{
|
|
|
+ if (s->appl_ptr > s->runtime->control->appl_ptr) {
|
|
|
+ /*
|
|
|
+ * In this case s->runtime->control->appl_ptr has wrapped around.
|
|
|
+ * Play the data to the end of the boundary, then wrap our own
|
|
|
+ * appl_ptr back around.
|
|
|
+ */
|
|
|
+ while (s->appl_ptr < s->runtime->boundary) {
|
|
|
+ if (bcom_queue_full(s->bcom_task))
|
|
|
+ return;
|
|
|
+
|
|
|
+ s->appl_ptr += s->period_size;
|
|
|
+
|
|
|
+ psc_dma_bcom_enqueue_next_buffer(s);
|
|
|
+ }
|
|
|
+ s->appl_ptr -= s->runtime->boundary;
|
|
|
+ }
|
|
|
+
|
|
|
while (s->appl_ptr < s->runtime->control->appl_ptr) {
|
|
|
|
|
|
if (bcom_queue_full(s->bcom_task))
|