示例#1
0
static int dma_init(struct rk_mmc *host)
{
	int res;

	res = rk29_dma_request(MMC_DMA_CHN, &mmc_client, NULL);
	if(res < 0)
		return res;

	res = rk29_dma_config(MMC_DMA_CHN, 4, 16);
	if(res < 0)
		return res;

	res = rk29_dma_set_buffdone_fn(MMC_DMA_CHN, dma_callback_func);

	return res;
}
static int __init dma_memcpy_probe(struct platform_device *pdev)
{
    int ret;
      
    ret = device_create_file(&pdev->dev, &driver_attr_dmamemcpy);
    rk29_dma_request(DMACH_DMAC0_MEMTOMEM, &rk29_dma_memcpy_client, NULL); 
    rk29_dma_config(DMACH_DMAC0_MEMTOMEM, 8);
    rk29_dma_set_buffdone_fn(DMACH_DMAC0_MEMTOMEM, rk29_dma_memcpy_callback);
    if(ret)
    {
        printk(">> fb1 dsp win0 info device_create_file err\n");
        ret = -EINVAL;
    }
   // printk(">>>>>>>>>>>>>>>>>>>>> dam_test_probe ok>>>>>>>>>>>>>>>>>>>>>>>>");        
    return 0;
}
示例#3
0
static int rockchip_pcm_hw_params(struct snd_pcm_substream *substream,
	struct snd_pcm_hw_params *params)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	struct rockchip_runtime_data *prtd = runtime->private_data;
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
	struct rockchip_pcm_dma_params *dma = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
	struct rockchip_pcm_dma_params *dma = snd_soc_dai_get_dma_data(rtd->dai->cpu_dai, substream);
#else
	struct rockchip_pcm_dma_params *dma = rtd->dai->cpu_dai->dma_data;
#endif
	unsigned long totbytes = params_buffer_bytes(params);
	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 (!dma)
		return 0;

	/* this may get called several times by oss emulation
	 * with different params -HW */
	if (prtd->params == NULL) {
		/* prepare DMA */
		prtd->params = dma;
#ifdef CONFIG_SND_I2S_DMA_EVENT_DYNAMIC
		DBG("params %p, client %p, channel %d\n", prtd->params,prtd->params->client, prtd->params->channel);
		ret = rk29_dma_request(prtd->params->channel, prtd->params->client, NULL);
		DBG("Enter::%s, %d, ret=%d, Channel=%d\n", __FUNCTION__, __LINE__, ret, prtd->params->channel);
		if (ret) {
			DBG(KERN_ERR "failed to get dma channel\n");
			return ret;
		}
#endif
	}

	ret = rk29_dma_set_buffdone_fn(prtd->params->channel, rk29_audio_buffdone);
	if(ret < 0){
		DBG(KERN_ERR "failed to rk29_dma_set_buffdone_fn\n");
		return ret;
	}
	snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);

	runtime->dma_bytes = totbytes;

	spin_lock_irq(&prtd->lock);
	prtd->dma_loaded = 0;
	prtd->dma_limit = params_periods(params);//runtime->hw.periods_min;
	prtd->dma_period = params_period_bytes(params);
	prtd->dma_start = runtime->dma_addr;
	prtd->dma_pos = prtd->dma_start;
	prtd->dma_end = prtd->dma_start + prtd->dma_limit*prtd->dma_period;
	prtd->transfer_first = 1;
	prtd->curr = NULL;
	prtd->next = NULL;
	prtd->end = NULL;
	spin_unlock_irq(&prtd->lock);
	printk(KERN_DEBUG "i2s dma info:periodsize(%ld),limit(%d),buffersize(%d),over(%d)\n",
			prtd->dma_period,prtd->dma_limit,totbytes,totbytes-(prtd->dma_period*prtd->dma_limit));
	return ret;
}