dma burst length optimize
authoryangkai <yangkai@ubuntu-fs>
Thu, 23 Jun 2011 10:37:06 +0000 (18:37 +0800)
committeryangkai <yangkai@ubuntu-fs>
Thu, 23 Jun 2011 10:37:06 +0000 (18:37 +0800)
arch/arm/mach-rk29/include/mach/dma.h
arch/arm/mach-rk29/memcpy_dma.c
arch/arm/mach-rk29/rk29-pl330.c [changed mode: 0644->0755]
drivers/mmc/host/rk29_sdmmc.c
sound/soc/rk29/rk29_pcm.c

index f55f040f9c2259b7b71cce36ea0e209264a4c3b9..25ee4ba8867aaf09d847e6ae5821e365418a920b 100755 (executable)
@@ -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
  *
index d7db46d944e1dd72289c9d787430519bd37a536c..1656db2b84ff4434aedc4d9e917e241de57d5362 100755 (executable)
@@ -75,7 +75,7 @@ static int __init dma_memcpy_probe(struct platform_device *pdev)
       \r
     ret = device_create_file(&pdev->dev, &driver_attr_dmamemcpy);\r
     rk29_dma_request(DMACH_DMAC0_MEMTOMEM, &rk29_dma_memcpy_client, NULL); \r
-    rk29_dma_config(DMACH_DMAC0_MEMTOMEM, 8);\r
+    rk29_dma_config(DMACH_DMAC0_MEMTOMEM, 8, 16);\r
     rk29_dma_set_buffdone_fn(DMACH_DMAC0_MEMTOMEM, rk29_dma_memcpy_callback);\r
     if(ret)\r
     {\r
old mode 100644 (file)
new mode 100755 (executable)
index df99020..09cfe0f
@@ -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);
 
index a77c056ff40211fbf5b2623189ce4fc27f796f2f..8696c6c640e2a325aff3753133333e7bc75bc5fc 100755 (executable)
@@ -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");
index 47c0cd68802a987f1a5eba8e56c0c4c03f841f91..066eaa1ad50f70147c1530f4193ebae341accab3 100755 (executable)
@@ -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,