diff --git a/src/trace/dma-trace.c b/src/trace/dma-trace.c index 779480e49468..5107eda0d76f 100644 --- a/src/trace/dma-trace.c +++ b/src/trace/dma-trace.c @@ -475,26 +475,34 @@ void dma_trace_flush(void *t) void dma_trace_on(void) { struct dma_trace_data *trace_data = dma_trace_data_get(); + uint32_t flags; if (!trace_data || trace_data->enabled) return; - trace_data->enabled = 1; + spin_lock_irq(&trace_data->lock, flags); + schedule_task(&trace_data->dmat_work, DMA_TRACE_PERIOD, DMA_TRACE_PERIOD); + trace_data->enabled = 1; + spin_unlock_irq(&trace_data->lock, flags); } void dma_trace_off(void) { struct dma_trace_data *trace_data = dma_trace_data_get(); + uint32_t flags; if (!trace_data || !trace_data->enabled) return; + spin_lock_irq(&trace_data->lock, flags); + schedule_task_cancel(&trace_data->dmat_work); trace_data->enabled = 0; + spin_unlock_irq(&trace_data->lock, flags); } static int dtrace_calc_buf_overflow(struct dma_trace_buf *buffer, diff --git a/src/trace/trace.c b/src/trace/trace.c index fb21dc5ce229..32f968c9f6e4 100644 --- a/src/trace/trace.c +++ b/src/trace/trace.c @@ -486,11 +486,11 @@ void trace_on(void) struct trace *trace = trace_get(); uint32_t flags; - spin_lock_irq(&trace->lock, flags); - - trace->enable = 1; + /* should not do this with trace->lock held as there is trace calling internal */ dma_trace_on(); + spin_lock_irq(&trace->lock, flags); + trace->enable = 1; spin_unlock_irq(&trace->lock, flags); } @@ -499,11 +499,11 @@ void trace_off(void) struct trace *trace = trace_get(); uint32_t flags; - spin_lock_irq(&trace->lock, flags); - - trace->enable = 0; + /* should not do this with trace->lock held as there is trace calling internal */ dma_trace_off(); + spin_lock_irq(&trace->lock, flags); + trace->enable = 0; spin_unlock_irq(&trace->lock, flags); }