From ec3961558c05841b68157c1aabaa42d9b0fcf2a4 Mon Sep 17 00:00:00 2001 From: yangkai Date: Thu, 23 Jun 2011 18:37:06 +0800 Subject: [PATCH] dma burst length optimize --- arch/arm/mach-rk29/include/mach/dma.h | 2 +- arch/arm/mach-rk29/memcpy_dma.c | 2 +- arch/arm/mach-rk29/rk29-pl330.c | 40 +++++++++++++++++++++------ drivers/mmc/host/rk29_sdmmc.c | 2 +- sound/soc/rk29/rk29_pcm.c | 2 +- 5 files changed, 36 insertions(+), 12 deletions(-) mode change 100644 => 100755 arch/arm/mach-rk29/rk29-pl330.c diff --git a/arch/arm/mach-rk29/include/mach/dma.h b/arch/arm/mach-rk29/include/mach/dma.h index f55f040f9c22..25ee4ba8867a 100755 --- a/arch/arm/mach-rk29/include/mach/dma.h +++ b/arch/arm/mach-rk29/include/mach/dma.h @@ -100,7 +100,7 @@ extern int rk29_dma_enqueue(unsigned int channel, void *id, * configure the dma channel */ -extern int rk29_dma_config(unsigned int channel, int xferunit); +extern int rk29_dma_config(unsigned int channel, int xferunit, int brst_len); /* rk29_dma_devconfig * diff --git a/arch/arm/mach-rk29/memcpy_dma.c b/arch/arm/mach-rk29/memcpy_dma.c index d7db46d944e1..1656db2b84ff 100755 --- a/arch/arm/mach-rk29/memcpy_dma.c +++ b/arch/arm/mach-rk29/memcpy_dma.c @@ -75,7 +75,7 @@ static int __init dma_memcpy_probe(struct platform_device *pdev) 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_config(DMACH_DMAC0_MEMTOMEM, 8, 16); rk29_dma_set_buffdone_fn(DMACH_DMAC0_MEMTOMEM, rk29_dma_memcpy_callback); if(ret) { diff --git a/arch/arm/mach-rk29/rk29-pl330.c b/arch/arm/mach-rk29/rk29-pl330.c old mode 100644 new mode 100755 index df9902004e3d..09cfe0fa8a12 --- a/arch/arm/mach-rk29/rk29-pl330.c +++ b/arch/arm/mach-rk29/rk29-pl330.c @@ -455,11 +455,11 @@ static inline int rk29_pl330_submit(struct rk29_pl330_chan *ch, } ch->rqcfg.brst_len = bl; - } else { + }else { if(ch->id == DMACH_EMMC) ch->rqcfg.brst_len = 16; //yk - else - ch->rqcfg.brst_len = 1; + //else + // ch->rqcfg.brst_len = 1; } ret = pl330_submit_req(ch->pl330_chan_id, r); @@ -668,7 +668,7 @@ int rk29_dma_enqueue(enum dma_ch id, void *token, struct rk29_pl330_xfer *xfer; unsigned long flags; int idx, ret = 0; - + spin_lock_irqsave(&res_lock, flags); ch = id_to_chan(id); @@ -737,7 +737,7 @@ int rk29_dma_request(enum dma_ch id, struct rk29_pl330_chan *ch; unsigned long flags; int ret = 0; - + spin_lock_irqsave(&res_lock, flags); ch = chan_acquire(id); @@ -871,7 +871,17 @@ free_exit: } EXPORT_SYMBOL(rk29_dma_free); -int rk29_dma_config(enum dma_ch id, int xferunit) +/** +* yk@rk 20110622 +* config the burst length when dma init or brst_len change +* every peripher has to determine burst width and length by its FIFO +* +* param: +* id: dma request id +* xferunit: burst width in byte +* brst_len: burst length every transfer +*/ +int rk29_dma_config(enum dma_ch id, int xferunit, int brst_len) { struct rk29_pl330_chan *ch; struct pl330_info *pi; @@ -886,7 +896,7 @@ int rk29_dma_config(enum dma_ch id, int xferunit) ret = -EINVAL; goto cfg_exit; } - +#if 0 pi = ch->dmac->pi; dbwidth = pi->pcfg.data_bus_width / 8; @@ -905,7 +915,21 @@ int rk29_dma_config(enum dma_ch id, int xferunit) ch->rqcfg.brst_size = i; else ret = -EINVAL; - +#else + i = 0; + while (xferunit != (1 << i)) + i++; + + if(xferunit > 8) + goto cfg_exit; + else + ch->rqcfg.brst_size = i; + + if(brst_len > 16) + goto cfg_exit; + else + ch->rqcfg.brst_len = brst_len; +#endif cfg_exit: spin_unlock_irqrestore(&res_lock, flags); diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index a77c056ff402..8696c6c640e2 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -1322,7 +1322,7 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) dev_err(&pdev->dev, "rk29_dma_request error\n"); goto err_iounmap; } - ret = rk29_dma_config(host->dma_info.chn, 4); + ret = rk29_dma_config(host->dma_info.chn, 4, 1); if (ret < 0){ dev_err(&pdev->dev, "rk29_dma_config error\n"); diff --git a/sound/soc/rk29/rk29_pcm.c b/sound/soc/rk29/rk29_pcm.c index 47c0cd68802a..066eaa1ad50f 100755 --- a/sound/soc/rk29/rk29_pcm.c +++ b/sound/soc/rk29/rk29_pcm.c @@ -403,7 +403,7 @@ static int rockchip_pcm_prepare(struct snd_pcm_substream *substream) } 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); + prtd->params->dma_size, 1); DBG("Enter:%s, %d, ret = %d, Channel=%d, Size=%d\n", __FUNCTION__, __LINE__, ret, prtd->params->channel, -- 2.34.1