diff options
Diffstat (limited to 'drivers/mtd/onenand')
-rw-r--r-- | drivers/mtd/onenand/onenand_base.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c index 6b3a875647c9..4d6e6c54cc2c 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c | |||
@@ -1845,7 +1845,7 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to, | |||
1845 | const u_char *buf = ops->datbuf; | 1845 | const u_char *buf = ops->datbuf; |
1846 | const u_char *oob = ops->oobbuf; | 1846 | const u_char *oob = ops->oobbuf; |
1847 | u_char *oobbuf; | 1847 | u_char *oobbuf; |
1848 | int ret = 0; | 1848 | int ret = 0, cmd; |
1849 | 1849 | ||
1850 | DEBUG(MTD_DEBUG_LEVEL3, "%s: to = 0x%08x, len = %i\n", | 1850 | DEBUG(MTD_DEBUG_LEVEL3, "%s: to = 0x%08x, len = %i\n", |
1851 | __func__, (unsigned int) to, (int) len); | 1851 | __func__, (unsigned int) to, (int) len); |
@@ -1954,7 +1954,19 @@ static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to, | |||
1954 | ONENAND_SET_NEXT_BUFFERRAM(this); | 1954 | ONENAND_SET_NEXT_BUFFERRAM(this); |
1955 | } | 1955 | } |
1956 | 1956 | ||
1957 | this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize); | 1957 | this->ongoing = 0; |
1958 | cmd = ONENAND_CMD_PROG; | ||
1959 | |||
1960 | /* Exclude 1st OTP and OTP blocks for cache program feature */ | ||
1961 | if (ONENAND_IS_CACHE_PROGRAM(this) && | ||
1962 | likely(onenand_block(this, to) != 0) && | ||
1963 | ONENAND_IS_4KB_PAGE(this) && | ||
1964 | ((written + thislen) < len)) { | ||
1965 | cmd = ONENAND_CMD_2X_CACHE_PROG; | ||
1966 | this->ongoing = 1; | ||
1967 | } | ||
1968 | |||
1969 | this->command(mtd, cmd, to, mtd->writesize); | ||
1958 | 1970 | ||
1959 | /* | 1971 | /* |
1960 | * 2 PLANE, MLC, and Flex-OneNAND wait here | 1972 | * 2 PLANE, MLC, and Flex-OneNAND wait here |
@@ -3377,8 +3389,10 @@ static void onenand_check_features(struct mtd_info *mtd) | |||
3377 | case ONENAND_DEVICE_DENSITY_4Gb: | 3389 | case ONENAND_DEVICE_DENSITY_4Gb: |
3378 | if (ONENAND_IS_DDP(this)) | 3390 | if (ONENAND_IS_DDP(this)) |
3379 | this->options |= ONENAND_HAS_2PLANE; | 3391 | this->options |= ONENAND_HAS_2PLANE; |
3380 | else if (numbufs == 1) | 3392 | else if (numbufs == 1) { |
3381 | this->options |= ONENAND_HAS_4KB_PAGE; | 3393 | this->options |= ONENAND_HAS_4KB_PAGE; |
3394 | this->options |= ONENAND_HAS_CACHE_PROGRAM; | ||
3395 | } | ||
3382 | 3396 | ||
3383 | case ONENAND_DEVICE_DENSITY_2Gb: | 3397 | case ONENAND_DEVICE_DENSITY_2Gb: |
3384 | /* 2Gb DDP does not have 2 plane */ | 3398 | /* 2Gb DDP does not have 2 plane */ |
@@ -3415,6 +3429,8 @@ static void onenand_check_features(struct mtd_info *mtd) | |||
3415 | printk(KERN_DEBUG "Chip has 2 plane\n"); | 3429 | printk(KERN_DEBUG "Chip has 2 plane\n"); |
3416 | if (this->options & ONENAND_HAS_4KB_PAGE) | 3430 | if (this->options & ONENAND_HAS_4KB_PAGE) |
3417 | printk(KERN_DEBUG "Chip has 4KiB pagesize\n"); | 3431 | printk(KERN_DEBUG "Chip has 4KiB pagesize\n"); |
3432 | if (this->options & ONENAND_HAS_CACHE_PROGRAM) | ||
3433 | printk(KERN_DEBUG "Chip has cache program feature\n"); | ||
3418 | } | 3434 | } |
3419 | 3435 | ||
3420 | /** | 3436 | /** |