[PATCH] Fix Oops with Atmel SPI
Anders Larsen
al at alarsen.net
Tue Apr 13 07:31:55 EDT 2010
Tweak MTD's cache allocation to make it work with the atmel DMA'ed SPI.
Substitute kmalloc for vmalloc so the cache buffer is mappable as per
the Atmel SPI driver's requirements, otherwise an Oops would occur.
The original patch by Ian McDonnell <ian at brightstareng.com> was found here:
http://lists.infradead.org/pipermail/linux-mtd/2007-December/020184.html
Signed-off-by: Anders Larsen <al at alarsen.net>
Cc: Ian McDonnell <ian at brightstareng.com>
Cc: David Woodhouse <dwmw2 at infradead.org>
Cc: Matthias Kaehlcke <matthias at kaehlcke.net>
Cc: Artem Bityutskiy <Artem.Bityutskiy at nokia.com>
Cc: Nicolas Pitre <nico at fluxnic.net>
---
drivers/mtd/mtdblock.c | 8 ++++++++
1 file changed, 8 insertions(+)
Index: b/drivers/mtd/mtdblock.c
===================================================================
--- a/drivers/mtd/mtdblock.c
+++ b/drivers/mtd/mtdblock.c
@@ -253,7 +253,11 @@ static int mtdblock_writesect(struct mtd
{
struct mtdblk_dev *mtdblk = mtdblks[dev->devnum];
if (unlikely(!mtdblk->cache_data && mtdblk->cache_size)) {
+#ifdef CONFIG_SPI_ATMEL
+ mtdblk->cache_data = kmalloc(mtdblk->mtd->erasesize, GFP_KERNEL);
+#else
mtdblk->cache_data = vmalloc(mtdblk->mtd->erasesize);
+#endif
if (!mtdblk->cache_data)
return -EINTR;
/* -EINTR is not really correct, but it is the best match
@@ -322,7 +326,11 @@ static int mtdblock_release(struct mtd_b
mtdblks[dev] = NULL;
if (mtdblk->mtd->sync)
mtdblk->mtd->sync(mtdblk->mtd);
+#ifdef CONFIG_SPI_ATMEL
+ kfree(mtdblk->cache_data);
+#else
vfree(mtdblk->cache_data);
+#endif
kfree(mtdblk);
}
More information about the linux-mtd
mailing list