diff options
| author | Hong Xu <hong.xu@atmel.com> | 2011-03-31 06:33:15 -0400 |
|---|---|---|
| committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-04-01 10:25:24 -0400 |
| commit | 80b4f81a49809774f1b123c456fb179e472dbd0e (patch) | |
| tree | 397325b8cdcd269109d65063853cdd77b989ff10 | |
| parent | 9d51567e47a0d84f6b6e7751a4ea4f710cdcbbdf (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.c | 18 |
1 files changed, 2 insertions, 16 deletions
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index e9fdbe46b24..950646aa4c4 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 | ||
