* 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
*
\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
}
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);
struct rk29_pl330_xfer *xfer;
unsigned long flags;
int idx, ret = 0;
-
+
spin_lock_irqsave(&res_lock, flags);
ch = id_to_chan(id);
struct rk29_pl330_chan *ch;
unsigned long flags;
int ret = 0;
-
+
spin_lock_irqsave(&res_lock, flags);
ch = chan_acquire(id);
}
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;
ret = -EINVAL;
goto cfg_exit;
}
-
+#if 0
pi = ch->dmac->pi;
dbwidth = pi->pcfg.data_bus_width / 8;
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);
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");
}
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,