aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHong Xu <hong.xu@atmel.com>2011-03-31 06:33:15 -0400
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-04-01 10:25:24 -0400
commit80b4f81a49809774f1b123c456fb179e472dbd0e (patch)
tree397325b8cdcd269109d65063853cdd77b989ff10
parent9d51567e47a0d84f6b6e7751a4ea4f710cdcbbdf (diff)
mtd: atmel_nand: use CPU I/O when buffer is in vmalloc(ed) region
The previous way of dealing with vmalloc(ed) region by walking though the pages can not work well actually. We just fall back to CPU I/O when the buffer address is higher than `high_memory'. Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Hong Xu <hong.xu@atmel.com> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r--drivers/mtd/nand/atmel_nand.c18
1 files changed, 2 insertions, 16 deletions
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index e9fdbe46b247..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