static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(
                struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
-               size_t period_len, enum dma_transfer_direction dir)
+               size_t period_len, enum dma_transfer_direction dir,
+               unsigned long flags)
 {
        return chan->device->device_prep_dma_cyclic(chan, buf_addr, buf_len,
                                                period_len, dir, flags, NULL);
 
        struct dma_chan *chan = prtd->dma_chan;
        struct dma_async_tx_descriptor *desc;
        enum dma_transfer_direction direction;
+       unsigned long flags = DMA_CTRL_ACK;
 
        direction = snd_pcm_substream_to_dma_direction(substream);
 
+       if (!substream->runtime->no_period_wakeup)
+               flags |= DMA_PREP_INTERRUPT;
+
        prtd->pos = 0;
        desc = dmaengine_prep_dma_cyclic(chan,
                substream->runtime->dma_addr,
                snd_pcm_lib_buffer_bytes(substream),
-               snd_pcm_lib_period_bytes(substream), direction);
+               snd_pcm_lib_period_bytes(substream), direction, flags);
 
        if (!desc)
                return -ENOMEM;