diff options
author | Matt Reimer <mreimer@vpop.net> | 2007-10-18 20:43:07 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2007-10-20 09:54:26 -0400 |
commit | b773bb2e702f6ac96223018d621ea9ed0d4f23ff (patch) | |
tree | 7e37ddbbc05889042ff7ee3df12cc784bc56b9fd | |
parent | 19e75ea72b21136805218a2f55177e99100d62e5 (diff) |
[MTD] [NAND] add s3c2440-specific read_buf/write_buf
Add read_buf/write_buf for s3c2440, which can read/write 32 bits at a
time rather than just 8. In my testing on an s3c2440a running at 400 MHz
with a 100 MHz HCLK, read performance improves by 36% (from 5.19 MB/s
to 7.07 MB/s).
Signed-off-by: Matt Reimer <mreimer@vpop.net>
Acked-by: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
-rw-r--r-- | drivers/mtd/nand/s3c2410.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c index 21b921dd6aab..66f76e9618dd 100644 --- a/drivers/mtd/nand/s3c2410.c +++ b/drivers/mtd/nand/s3c2410.c | |||
@@ -488,12 +488,24 @@ static void s3c2410_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) | |||
488 | readsb(this->IO_ADDR_R, buf, len); | 488 | readsb(this->IO_ADDR_R, buf, len); |
489 | } | 489 | } |
490 | 490 | ||
491 | static void s3c2440_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) | ||
492 | { | ||
493 | struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); | ||
494 | readsl(info->regs + S3C2440_NFDATA, buf, len / 4); | ||
495 | } | ||
496 | |||
491 | static void s3c2410_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) | 497 | static void s3c2410_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) |
492 | { | 498 | { |
493 | struct nand_chip *this = mtd->priv; | 499 | struct nand_chip *this = mtd->priv; |
494 | writesb(this->IO_ADDR_W, buf, len); | 500 | writesb(this->IO_ADDR_W, buf, len); |
495 | } | 501 | } |
496 | 502 | ||
503 | static void s3c2440_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) | ||
504 | { | ||
505 | struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); | ||
506 | writesl(info->regs + S3C2440_NFDATA, buf, len / 4); | ||
507 | } | ||
508 | |||
497 | /* device management functions */ | 509 | /* device management functions */ |
498 | 510 | ||
499 | static int s3c2410_nand_remove(struct platform_device *pdev) | 511 | static int s3c2410_nand_remove(struct platform_device *pdev) |
@@ -604,6 +616,8 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, | |||
604 | info->sel_bit = S3C2440_NFCONT_nFCE; | 616 | info->sel_bit = S3C2440_NFCONT_nFCE; |
605 | chip->cmd_ctrl = s3c2440_nand_hwcontrol; | 617 | chip->cmd_ctrl = s3c2440_nand_hwcontrol; |
606 | chip->dev_ready = s3c2440_nand_devready; | 618 | chip->dev_ready = s3c2440_nand_devready; |
619 | chip->read_buf = s3c2440_nand_read_buf; | ||
620 | chip->write_buf = s3c2440_nand_write_buf; | ||
607 | break; | 621 | break; |
608 | 622 | ||
609 | case TYPE_S3C2412: | 623 | case TYPE_S3C2412: |