void rk29_audio_buffdone(void *dev_id, int size, enum rk29_dma_buffresult result) { struct snd_pcm_substream *substream = dev_id; struct rockchip_runtime_data *prtd; #if PCM_DMA_DEBUG static ktime_t before = {0},after = {0}; s64 t; before = after; after = ktime_get(); t = ktime_to_us(ktime_sub(after, before)); if(result == RK29_RES_OK) { if(t > 23220+73 && t != ktime_to_us(after)) // 4096/4/44100 + 32/44100 { printk(KERN_DEBUG "Time out:: Audio DMA buffdone time out!!! the time = %lld!\n", t); } printk(KERN_DEBUG "audio DMA callback time = %lld\n", t); } // printk(KERN_DEBUG "a %d %d\n", size, result); #endif DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__); if (!substream){ DBG("substream is free\n"); return; } if (!substream->runtime){ DBG("substream->runtime is free\n"); return; } switch(result) { case RK29_RES_OK: break; case RK29_RES_ERR: case RK29_RES_ABORT: DBG("Enter::%s dma about or error result = %d \n",__FUNCTION__,result); return; } prtd = substream->runtime->private_data; // if(prtd->params->channel == 2) DBG("Enter::%s----%d channel =%d \n",__FUNCTION__,__LINE__); if(!(prtd->state & ST_RUNNING)) return; if (substream){ snd_pcm_period_elapsed(substream); } spin_lock(&prtd->lock); prtd->dma_loaded--; if (prtd->state & ST_RUNNING) { rockchip_pcm_enqueue(substream); } spin_unlock(&prtd->lock); }
static int rockchip_pcm_prepare(struct snd_pcm_substream *substream) { struct rockchip_runtime_data *prtd = substream->runtime->private_data; int ret = 0; DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__); /* return if this is a bufferless transfer e.g. * codec <--> BT codec or GSM modem -- lg FIXME */ if (!prtd->params) return 0; if(substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { ret = rk29_dma_devconfig(prtd->params->channel, RK29_DMASRC_MEM, prtd->params->dma_addr); }else{ ret = rk29_dma_devconfig(prtd->params->channel, RK29_DMASRC_HW, prtd->params->dma_addr); } DBG("Enter::%s, %d, ret=%d, Channel=%d, Addr=0x%X\n", __FUNCTION__, __LINE__, ret, prtd->params->channel, prtd->params->dma_addr); ret = rk29_dma_config(prtd->params->channel, prtd->params->dma_size, 1); prtd->params->flag = 1; DBG("Enter:%s, %d, ret = %d, Channel=%d, Size=%d\n", __FUNCTION__, __LINE__, ret, prtd->params->channel, prtd->params->dma_size); ret= rk29_dma_ctrl(prtd->params->channel, RK29_DMAOP_FLUSH); DBG("Enter:%s, %d, ret = %d, Channel=%d\n", __FUNCTION__, __LINE__, ret, prtd->params->channel); prtd->dma_loaded = 0; prtd->dma_pos = prtd->dma_start; /* enqueue dma buffers */ rockchip_pcm_enqueue(substream); return ret; }