aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand
diff options
context:
space:
mode:
authorHuang Shijie <shijie8@gmail.com>2013-12-18 10:40:59 -0500
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 09:57:23 -0400
commit12f7305f10213c0a03b46836927a1a2aee8d4105 (patch)
tree73349784cd9e776ec91017ec1c3623be0d70c79b /drivers/mtd/nand
parent86a31c7b7088693946b4f59ecdfa2914a38c1018 (diff)
mtd: gpmi: allocate a proper buffer for non ECC read/write
The @data_buffer_dma buffer is used for non ECC read/write. Currently, the length of the buffer is PAGE_SIZE, but the NAND chip may has 8K page or 16K page. So we have to extend it for the large page NAND chips. The gpmi_alloc_dma_buffer will be called twice. The first time is to allocate a temporary buffer for scanning the NAND chip; The second time is to allocate a buffer to store the real page content. This patch allocates a buffer of PAGE_SIZE size for scanning the NAND chip when gpmi_alloc_dma_buffer is called the first time, and allocates a buffer of the real NAND page size for the second time gpmi_alloc_dma_buffer is called. Signed-off-by: Huang Shijie <shijie8@gmail.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com> Signed-off-by: Huang Shijie <b32955@freescale.com>
Diffstat (limited to 'drivers/mtd/nand')
-rw-r--r--drivers/mtd/nand/gpmi-nand/gpmi-nand.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
index e2f58207c779..d1d13d86b7e0 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
@@ -783,14 +783,23 @@ static int gpmi_alloc_dma_buffer(struct gpmi_nand_data *this)
783{ 783{
784 struct bch_geometry *geo = &this->bch_geometry; 784 struct bch_geometry *geo = &this->bch_geometry;
785 struct device *dev = this->dev; 785 struct device *dev = this->dev;
786 struct mtd_info *mtd = &this->mtd;
786 787
787 /* [1] Allocate a command buffer. PAGE_SIZE is enough. */ 788 /* [1] Allocate a command buffer. PAGE_SIZE is enough. */
788 this->cmd_buffer = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL); 789 this->cmd_buffer = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL);
789 if (this->cmd_buffer == NULL) 790 if (this->cmd_buffer == NULL)
790 goto error_alloc; 791 goto error_alloc;
791 792
792 /* [2] Allocate a read/write data buffer. PAGE_SIZE is enough. */ 793 /*
793 this->data_buffer_dma = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL); 794 * [2] Allocate a read/write data buffer.
795 * The gpmi_alloc_dma_buffer can be called twice.
796 * We allocate a PAGE_SIZE length buffer if gpmi_alloc_dma_buffer
797 * is called before the nand_scan_ident; and we allocate a buffer
798 * of the real NAND page size when the gpmi_alloc_dma_buffer is
799 * called after the nand_scan_ident.
800 */
801 this->data_buffer_dma = kzalloc(mtd->writesize ?: PAGE_SIZE,
802 GFP_DMA | GFP_KERNEL);
794 if (this->data_buffer_dma == NULL) 803 if (this->data_buffer_dma == NULL)
795 goto error_alloc; 804 goto error_alloc;
796 805