mtd: denali: kill the NAND_MAX_PAGESIZE/NAND_MAX_OOBSIZE

This patch kills the NAND_MAX_PAGESIZE/NAND_MAX_OOBSIZE by the following
way:
 1.) change the @buf field of nand_buf{} from an array to a pointer.
     also remove the DENALI_BUF_SIZE macro.

 2.) Before we call the nand_scan_ident, we allocate a temporary buffer
     whose size is PAGE_SIZE.

 3.) After we finish the nand_scan_ident, we have already getten the
     page size and oob size. We will allocate the right buffer size
     again.

Signed-off-by: Huang Shijie <shijie8@gmail.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
This commit is contained in:
Huang Shijie 2013-12-21 00:02:28 +08:00 committed by Brian Norris
parent a5900554a8
commit e07caa3687
2 changed files with 31 additions and 24 deletions

View File

@ -125,7 +125,6 @@ static void reset_buf(struct denali_nand_info *denali)
static void write_byte_to_buf(struct denali_nand_info *denali, uint8_t byte) static void write_byte_to_buf(struct denali_nand_info *denali, uint8_t byte)
{ {
BUG_ON(denali->buf.tail >= sizeof(denali->buf.buf));
denali->buf.buf[denali->buf.tail++] = byte; denali->buf.buf[denali->buf.tail++] = byte;
} }
@ -1429,20 +1428,12 @@ int denali_init(struct denali_nand_info *denali)
} }
} }
/* Is 32-bit DMA supported? */ /* allocate a temporary buffer for nand_scan_ident() */
ret = dma_set_mask(denali->dev, DMA_BIT_MASK(32)); denali->buf.buf = devm_kzalloc(denali->dev, PAGE_SIZE,
if (ret) { GFP_DMA | GFP_KERNEL);
pr_err("Spectra: no usable DMA configuration\n"); if (!denali->buf.buf)
return ret; return -ENOMEM;
}
denali->buf.dma_buf = dma_map_single(denali->dev, denali->buf.buf,
DENALI_BUF_SIZE,
DMA_BIDIRECTIONAL);
if (dma_mapping_error(denali->dev, denali->buf.dma_buf)) {
dev_err(denali->dev, "Spectra: failed to map DMA buffer\n");
return -EIO;
}
denali->mtd.dev.parent = denali->dev; denali->mtd.dev.parent = denali->dev;
denali_hw_init(denali); denali_hw_init(denali);
denali_drv_init(denali); denali_drv_init(denali);
@ -1475,12 +1466,29 @@ int denali_init(struct denali_nand_info *denali)
goto failed_req_irq; goto failed_req_irq;
} }
/* MTD supported page sizes vary by kernel. We validate our /* allocate the right size buffer now */
* kernel supports the device here. devm_kfree(denali->dev, denali->buf.buf);
*/ denali->buf.buf = devm_kzalloc(denali->dev,
if (denali->mtd.writesize > NAND_MAX_PAGESIZE + NAND_MAX_OOBSIZE) { denali->mtd.writesize + denali->mtd.oobsize,
ret = -ENODEV; GFP_KERNEL);
pr_err("Spectra: device size not supported by this version of MTD."); if (!denali->buf.buf) {
ret = -ENOMEM;
goto failed_req_irq;
}
/* Is 32-bit DMA supported? */
ret = dma_set_mask(denali->dev, DMA_BIT_MASK(32));
if (ret) {
pr_err("Spectra: no usable DMA configuration\n");
goto failed_req_irq;
}
denali->buf.dma_buf = dma_map_single(denali->dev, denali->buf.buf,
denali->mtd.writesize + denali->mtd.oobsize,
DMA_BIDIRECTIONAL);
if (dma_mapping_error(denali->dev, denali->buf.dma_buf)) {
dev_err(denali->dev, "Spectra: failed to map DMA buffer\n");
ret = -EIO;
goto failed_req_irq; goto failed_req_irq;
} }
@ -1602,7 +1610,8 @@ EXPORT_SYMBOL(denali_init);
void denali_remove(struct denali_nand_info *denali) void denali_remove(struct denali_nand_info *denali)
{ {
denali_irq_cleanup(denali->irq, denali); denali_irq_cleanup(denali->irq, denali);
dma_unmap_single(denali->dev, denali->buf.dma_buf, DENALI_BUF_SIZE, dma_unmap_single(denali->dev, denali->buf.dma_buf,
denali->mtd.writesize + denali->mtd.oobsize,
DMA_BIDIRECTIONAL); DMA_BIDIRECTIONAL);
} }
EXPORT_SYMBOL(denali_remove); EXPORT_SYMBOL(denali_remove);

View File

@ -455,12 +455,10 @@
#define ECC_SECTOR_SIZE 512 #define ECC_SECTOR_SIZE 512
#define DENALI_BUF_SIZE (NAND_MAX_PAGESIZE + NAND_MAX_OOBSIZE)
struct nand_buf { struct nand_buf {
int head; int head;
int tail; int tail;
uint8_t buf[DENALI_BUF_SIZE]; uint8_t *buf;
dma_addr_t dma_buf; dma_addr_t dma_buf;
}; };