static void jz_pcm_stop_substream(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct device *dev = dai->dev; PCM_DEBUG_MSG("enter %s, substream = %s\n", __func__, (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? "playback" : "capture"); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { if (__pcm_transmit_dma_is_enable(dev)) { __pcm_disable_transmit_dma(dev); __pcm_clear_tur(dev); /* Hrtimer mode: stop will be happen in any where, make sure there is * no data transfer on ahb bus before stop dma * Harzard: * In pcm slave mode, the clk maybe stop before here, we will dead here */ while(!__pcm_test_tur(dev)); } __pcm_disable_replay(dev); __pcm_clear_tur(dev); } else { if (__pcm_receive_dma_is_enable(dev)) { __pcm_disable_receive_dma(dev); __pcm_clear_ror(dev); while(!__pcm_test_ror(dev)); } __pcm_disable_record(dev); __pcm_clear_ror(dev); } return; }
/*##################################################################*\ |* functions \*##################################################################*/ static irqreturn_t pcm_irq_handler(int irq, void *dev_id) { unsigned long flags; irqreturn_t ret = IRQ_HANDLED; spin_lock_irqsave(&pcm_irq_lock,flags); if (__pcm_test_tur()) { printk("UNDERRUN HAPPEN\n"); __pcm_clear_tur(); } spin_unlock_irqrestore(&pcm_irq_lock,flags); return ret; }