diff options
author | Huang Shijie <shijie8@gmail.com> | 2013-12-18 10:40:59 -0500 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2014-04-16 09:57:23 -0400 |
commit | 12f7305f10213c0a03b46836927a1a2aee8d4105 (patch) | |
tree | 73349784cd9e776ec91017ec1c3623be0d70c79b /drivers/mtd/nand | |
parent | 86a31c7b7088693946b4f59ecdfa2914a38c1018 (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.c | 13 |
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 | ||