aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/onenand/onenand_base.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/onenand/onenand_base.c')
-rw-r--r--drivers/mtd/onenand/onenand_base.c29
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)
1711erase_exit: 1711erase_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 */
1905static int onenand_lock(struct mtd_info *mtd, loff_t ofs, size_t len) 1906static 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 */
1918static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len) 1924static 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}