Пример #1
0
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);
   
}
Пример #2
0
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;
}