aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand/atmel_nand.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/nand/atmel_nand.c')
-rw-r--r--drivers/mtd/nand/atmel_nand.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index 6fae04b3fc6d..950646aa4c4b 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -209,22 +209,8 @@ static int atmel_nand_dma_op(struct mtd_info *mtd, void *buf, int len,
209 int err = -EIO; 209 int err = -EIO;
210 enum dma_data_direction dir = is_read ? DMA_FROM_DEVICE : DMA_TO_DEVICE; 210 enum dma_data_direction dir = is_read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
211 211
212 if (buf >= high_memory) { 212 if (buf >= high_memory)
213 struct page *pg; 213 goto err_buf;
214
215 if (((size_t)buf & PAGE_MASK) !=
216 ((size_t)(buf + len - 1) & PAGE_MASK)) {
217 dev_warn(host->dev, "Buffer not fit in one page\n");
218 goto err_buf;
219 }
220
221 pg = vmalloc_to_page(buf);
222 if (pg == 0) {
223 dev_err(host->dev, "Failed to vmalloc_to_page\n");
224 goto err_buf;
225 }
226 p = page_address(pg) + ((size_t)buf & ~PAGE_MASK);
227 }
228 214
229 dma_dev = host->dma_chan->device; 215 dma_dev = host->dma_chan->device;
230 216
@@ -280,7 +266,8 @@ static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len)
280 struct nand_chip *chip = mtd->priv; 266 struct nand_chip *chip = mtd->priv;
281 struct atmel_nand_host *host = chip->priv; 267 struct atmel_nand_host *host = chip->priv;
282 268
283 if (use_dma && len >= mtd->oobsize) 269 if (use_dma && len > mtd->oobsize)
270 /* only use DMA for bigger than oob size: better performances */
284 if (atmel_nand_dma_op(mtd, buf, len, 1) == 0) 271 if (atmel_nand_dma_op(mtd, buf, len, 1) == 0)
285 return; 272 return;
286 273
@@ -295,7 +282,8 @@ static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
295 struct nand_chip *chip = mtd->priv; 282 struct nand_chip *chip = mtd->priv;
296 struct atmel_nand_host *host = chip->priv; 283 struct atmel_nand_host *host = chip->priv;
297 284
298 if (use_dma && len >= mtd->oobsize) 285 if (use_dma && len > mtd->oobsize)
286 /* only use DMA for bigger than oob size: better performances */
299 if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0) 287 if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0)
300 return; 288 return;
301 289
@@ -599,7 +587,10 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
599 nand_chip->options |= NAND_USE_FLASH_BBT; 587 nand_chip->options |= NAND_USE_FLASH_BBT;
600 } 588 }
601 589
602 if (cpu_has_dma() && use_dma) { 590 if (!cpu_has_dma())
591 use_dma = 0;
592
593 if (use_dma) {
603 dma_cap_mask_t mask; 594 dma_cap_mask_t mask;
604 595
605 dma_cap_zero(mask); 596 dma_cap_zero(mask);
@@ -611,7 +602,8 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
611 } 602 }
612 } 603 }
613 if (use_dma) 604 if (use_dma)
614 dev_info(host->dev, "Using DMA for NAND access.\n"); 605 dev_info(host->dev, "Using %s for DMA transfers.\n",
606 dma_chan_name(host->dma_chan));
615 else 607 else
616 dev_info(host->dev, "No DMA support for NAND access.\n"); 608 dev_info(host->dev, "No DMA support for NAND access.\n");
617 609