diff options
author | Ben Dooks <ben-linux@fluff.org> | 2009-05-30 13:30:18 -0400 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2009-06-08 07:10:36 -0400 |
commit | dea2aa6fd7d46c43c840ad77905f3c161d5bc59d (patch) | |
tree | 4bc09df9da1625f02de07cfb3d303b2f3c7e1969 /drivers/mtd/nand | |
parent | 9db41f9edcb87ae050fcb171c44be7f212728d54 (diff) |
[MTD] [NAND] S3C2410: Deal with unaligned lengths in S3C2440 buffer read/write
Add code to deal with fractional lengths, as reported by
Werner Almesberger. Re-work of his original patch.
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Diffstat (limited to 'drivers/mtd/nand')
-rw-r--r-- | drivers/mtd/nand/s3c2410.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c index d315b513db5c..8a7f960a0df5 100644 --- a/drivers/mtd/nand/s3c2410.c +++ b/drivers/mtd/nand/s3c2410.c | |||
@@ -584,7 +584,16 @@ static void s3c2410_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) | |||
584 | static void s3c2440_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) | 584 | static void s3c2440_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) |
585 | { | 585 | { |
586 | struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); | 586 | struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); |
587 | readsl(info->regs + S3C2440_NFDATA, buf, len / 4); | 587 | |
588 | readsl(info->regs + S3C2440_NFDATA, buf, len >> 2); | ||
589 | |||
590 | /* cleanup if we've got less than a word to do */ | ||
591 | if (len & 3) { | ||
592 | buf += len & ~3; | ||
593 | |||
594 | for (; len & 3; len--) | ||
595 | *buf++ = readb(info->regs + S3C2440_NFDATA); | ||
596 | } | ||
588 | } | 597 | } |
589 | 598 | ||
590 | static void s3c2410_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) | 599 | static void s3c2410_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) |
@@ -596,7 +605,16 @@ static void s3c2410_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int | |||
596 | static void s3c2440_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) | 605 | static void s3c2440_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) |
597 | { | 606 | { |
598 | struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); | 607 | struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd); |
599 | writesl(info->regs + S3C2440_NFDATA, buf, len / 4); | 608 | |
609 | writesl(info->regs + S3C2440_NFDATA, buf, len >> 2); | ||
610 | |||
611 | /* cleanup any fractional write */ | ||
612 | if (len & 3) { | ||
613 | buf += len & ~3; | ||
614 | |||
615 | for (; len & 3; len--, buf++) | ||
616 | writeb(*buf, info->regs + S3C2440_NFDATA); | ||
617 | } | ||
600 | } | 618 | } |
601 | 619 | ||
602 | /* cpufreq driver support */ | 620 | /* cpufreq driver support */ |