|
@@ -383,14 +383,30 @@ static int msmsdcc_config_dma(struct msmsdcc_host *host, struct mmc_data *data)
|
|
|
host->curr.user_pages = 0;
|
|
|
|
|
|
box = &nc->cmd[0];
|
|
|
- for (i = 0; i < host->dma.num_ents; i++) {
|
|
|
- box->cmd = CMD_MODE_BOX;
|
|
|
|
|
|
- /* Initialize sg dma address */
|
|
|
- sg->dma_address = page_to_dma(mmc_dev(host->mmc), sg_page(sg))
|
|
|
- + sg->offset;
|
|
|
+ /* location of command block must be 64 bit aligned */
|
|
|
+ BUG_ON(host->dma.cmd_busaddr & 0x07);
|
|
|
|
|
|
- if (i == (host->dma.num_ents - 1))
|
|
|
+ nc->cmdptr = (host->dma.cmd_busaddr >> 3) | CMD_PTR_LP;
|
|
|
+ host->dma.hdr.cmdptr = DMOV_CMD_PTR_LIST |
|
|
|
+ DMOV_CMD_ADDR(host->dma.cmdptr_busaddr);
|
|
|
+ host->dma.hdr.complete_func = msmsdcc_dma_complete_func;
|
|
|
+
|
|
|
+ n = dma_map_sg(mmc_dev(host->mmc), host->dma.sg,
|
|
|
+ host->dma.num_ents, host->dma.dir);
|
|
|
+ if (n == 0) {
|
|
|
+ printk(KERN_ERR "%s: Unable to map in all sg elements\n",
|
|
|
+ mmc_hostname(host->mmc));
|
|
|
+ host->dma.sg = NULL;
|
|
|
+ host->dma.num_ents = 0;
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ for_each_sg(host->dma.sg, sg, n, i) {
|
|
|
+
|
|
|
+ box->cmd = CMD_MODE_BOX;
|
|
|
+
|
|
|
+ if (i == n - 1)
|
|
|
box->cmd |= CMD_LC;
|
|
|
rows = (sg_dma_len(sg) % MCI_FIFOSIZE) ?
|
|
|
(sg_dma_len(sg) / MCI_FIFOSIZE) + 1 :
|
|
@@ -418,27 +434,6 @@ static int msmsdcc_config_dma(struct msmsdcc_host *host, struct mmc_data *data)
|
|
|
box->cmd |= CMD_DST_CRCI(crci);
|
|
|
}
|
|
|
box++;
|
|
|
- sg++;
|
|
|
- }
|
|
|
-
|
|
|
- /* location of command block must be 64 bit aligned */
|
|
|
- BUG_ON(host->dma.cmd_busaddr & 0x07);
|
|
|
-
|
|
|
- nc->cmdptr = (host->dma.cmd_busaddr >> 3) | CMD_PTR_LP;
|
|
|
- host->dma.hdr.cmdptr = DMOV_CMD_PTR_LIST |
|
|
|
- DMOV_CMD_ADDR(host->dma.cmdptr_busaddr);
|
|
|
- host->dma.hdr.complete_func = msmsdcc_dma_complete_func;
|
|
|
-
|
|
|
- n = dma_map_sg(mmc_dev(host->mmc), host->dma.sg,
|
|
|
- host->dma.num_ents, host->dma.dir);
|
|
|
-/* dsb inside dma_map_sg will write nc out to mem as well */
|
|
|
-
|
|
|
- if (n != host->dma.num_ents) {
|
|
|
- printk(KERN_ERR "%s: Unable to map in all sg elements\n",
|
|
|
- mmc_hostname(host->mmc));
|
|
|
- host->dma.sg = NULL;
|
|
|
- host->dma.num_ents = 0;
|
|
|
- return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -1331,9 +1326,6 @@ msmsdcc_probe(struct platform_device *pdev)
|
|
|
if (host->timer.function)
|
|
|
pr_info("%s: Polling status mode enabled\n", mmc_hostname(mmc));
|
|
|
|
|
|
-#if BUSCLK_PWRSAVE
|
|
|
- msmsdcc_disable_clocks(host, 1);
|
|
|
-#endif
|
|
|
return 0;
|
|
|
cmd_irq_free:
|
|
|
free_irq(cmd_irqres->start, host);
|