diff options
Diffstat (limited to 'drivers/mtd/onenand/onenand_base.c')
-rw-r--r-- | drivers/mtd/onenand/onenand_base.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c index b2c40f67db..dd28355690 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c | |||
@@ -327,7 +327,7 @@ static int onenand_wait(struct mtd_info *mtd, int state) | |||
327 | printk(KERN_ERR "onenand_wait: controller error = 0x%04x\n", ctrl); | 327 | printk(KERN_ERR "onenand_wait: controller error = 0x%04x\n", ctrl); |
328 | if (ctrl & ONENAND_CTRL_LOCK) | 328 | if (ctrl & ONENAND_CTRL_LOCK) |
329 | printk(KERN_ERR "onenand_wait: it's locked error.\n"); | 329 | printk(KERN_ERR "onenand_wait: it's locked error.\n"); |
330 | return ctrl; | 330 | return -EIO; |
331 | } | 331 | } |
332 | 332 | ||
333 | if (interrupt & ONENAND_INT_READ) { | 333 | if (interrupt & ONENAND_INT_READ) { |
@@ -336,7 +336,7 @@ static int onenand_wait(struct mtd_info *mtd, int state) | |||
336 | if (ecc & ONENAND_ECC_2BIT_ALL) { | 336 | if (ecc & ONENAND_ECC_2BIT_ALL) { |
337 | printk(KERN_ERR "onenand_wait: ECC error = 0x%04x\n", ecc); | 337 | printk(KERN_ERR "onenand_wait: ECC error = 0x%04x\n", ecc); |
338 | mtd->ecc_stats.failed++; | 338 | mtd->ecc_stats.failed++; |
339 | return ecc; | 339 | return -EBADMSG; |
340 | } else if (ecc & ONENAND_ECC_1BIT_ALL) { | 340 | } else if (ecc & ONENAND_ECC_1BIT_ALL) { |
341 | printk(KERN_INFO "onenand_wait: correctable ECC error = 0x%04x\n", ecc); | 341 | printk(KERN_INFO "onenand_wait: correctable ECC error = 0x%04x\n", ecc); |
342 | mtd->ecc_stats.corrected++; | 342 | mtd->ecc_stats.corrected++; |
@@ -1711,13 +1711,14 @@ static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr) | |||
1711 | erase_exit: | 1711 | erase_exit: |
1712 | 1712 | ||
1713 | ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO; | 1713 | ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO; |
1714 | /* Do call back function */ | ||
1715 | if (!ret) | ||
1716 | mtd_erase_callback(instr); | ||
1717 | 1714 | ||
1718 | /* Deselect and wake up anyone waiting on the device */ | 1715 | /* Deselect and wake up anyone waiting on the device */ |
1719 | onenand_release_device(mtd); | 1716 | onenand_release_device(mtd); |
1720 | 1717 | ||
1718 | /* Do call back function */ | ||
1719 | if (!ret) | ||
1720 | mtd_erase_callback(instr); | ||
1721 | |||
1721 | return ret; | 1722 | return ret; |
1722 | } | 1723 | } |
1723 | 1724 | ||
@@ -1904,7 +1905,12 @@ static int onenand_do_lock_cmd(struct mtd_info *mtd, loff_t ofs, size_t len, int | |||
1904 | */ | 1905 | */ |
1905 | static int onenand_lock(struct mtd_info *mtd, loff_t ofs, size_t len) | 1906 | static int onenand_lock(struct mtd_info *mtd, loff_t ofs, size_t len) |
1906 | { | 1907 | { |
1907 | return onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK); | 1908 | int ret; |
1909 | |||
1910 | onenand_get_device(mtd, FL_LOCKING); | ||
1911 | ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK); | ||
1912 | onenand_release_device(mtd); | ||
1913 | return ret; | ||
1908 | } | 1914 | } |
1909 | 1915 | ||
1910 | /** | 1916 | /** |
@@ -1917,7 +1923,12 @@ static int onenand_lock(struct mtd_info *mtd, loff_t ofs, size_t len) | |||
1917 | */ | 1923 | */ |
1918 | static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len) | 1924 | static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len) |
1919 | { | 1925 | { |
1920 | return onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK); | 1926 | int ret; |
1927 | |||
1928 | onenand_get_device(mtd, FL_LOCKING); | ||
1929 | ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK); | ||
1930 | onenand_release_device(mtd); | ||
1931 | return ret; | ||
1921 | } | 1932 | } |
1922 | 1933 | ||
1923 | /** | 1934 | /** |
@@ -1979,7 +1990,7 @@ static int onenand_unlock_all(struct mtd_info *mtd) | |||
1979 | loff_t ofs = this->chipsize >> 1; | 1990 | loff_t ofs = this->chipsize >> 1; |
1980 | size_t len = mtd->erasesize; | 1991 | size_t len = mtd->erasesize; |
1981 | 1992 | ||
1982 | onenand_unlock(mtd, ofs, len); | 1993 | onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK); |
1983 | } | 1994 | } |
1984 | 1995 | ||
1985 | onenand_check_lock_status(this); | 1996 | onenand_check_lock_status(this); |
@@ -1987,7 +1998,7 @@ static int onenand_unlock_all(struct mtd_info *mtd) | |||
1987 | return 0; | 1998 | return 0; |
1988 | } | 1999 | } |
1989 | 2000 | ||
1990 | onenand_unlock(mtd, 0x0, this->chipsize); | 2001 | onenand_do_lock_cmd(mtd, 0x0, this->chipsize, ONENAND_CMD_UNLOCK); |
1991 | 2002 | ||
1992 | return 0; | 2003 | return 0; |
1993 | } | 2004 | } |