static int idma_trigger(struct snd_pcm_substream *substream, int cmd) { struct idma_ctrl *prtd = substream->runtime->private_data; int ret = 0; pr_debug("Entered %s\n", __func__); spin_lock(&prtd->lock); switch (cmd) { case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: prtd->state |= ST_RUNNING; idma.trigger_stat = LPAM_DMA_START; idma_ctrl(LPAM_DMA_START); break; case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: prtd->state &= ~ST_RUNNING; idma.trigger_stat = LPAM_DMA_STOP; idma_ctrl(LPAM_DMA_STOP); break; default: ret = -EINVAL; break; } spin_unlock(&prtd->lock); return ret; }
static int idma_prepare(struct snd_pcm_substream *substream) { struct idma_ctrl *prtd = substream->runtime->private_data; pr_debug("Entered %s\n", __func__); prtd->pos = prtd->start; /* flush the DMA channel */ idma_ctrl(LPAM_DMA_STOP); idma_enqueue(substream); return 0; }