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; }
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; }