mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-29 15:14:18 +08:00
mtd: spi-nor: wait until lock/unlock operations are ready
On Micron and Numonyx devices, the status register write command (WRSR), raises a work-in-progress bit (WIP) on the status register. The datasheets for these devices specify that while the status register write is in progress, the status register WIP bit can still be read to check the end of the operation. This commit adds a wait_till_ready call on lock/unlock operations, which is required for Micron and Numonyx but should be harmless for others. This is needed to prevent applications from issuing erase or program operations before the unlock operation is completed. Reported-by: Stas Sergeev <stsp@list.ru> Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
This commit is contained in:
parent
6e75632ac3
commit
32321e950d
@ -481,6 +481,7 @@ static int stm_lock(struct spi_nor *nor, loff_t ofs, uint64_t len)
|
|||||||
int status_old, status_new;
|
int status_old, status_new;
|
||||||
u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
|
u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
|
||||||
u8 shift = ffs(mask) - 1, pow, val;
|
u8 shift = ffs(mask) - 1, pow, val;
|
||||||
|
int ret;
|
||||||
|
|
||||||
status_old = read_sr(nor);
|
status_old = read_sr(nor);
|
||||||
if (status_old < 0)
|
if (status_old < 0)
|
||||||
@ -519,7 +520,10 @@ static int stm_lock(struct spi_nor *nor, loff_t ofs, uint64_t len)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
write_enable(nor);
|
write_enable(nor);
|
||||||
return write_sr(nor, status_new);
|
ret = write_sr(nor, status_new);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
return spi_nor_wait_till_ready(nor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -533,6 +537,7 @@ static int stm_unlock(struct spi_nor *nor, loff_t ofs, uint64_t len)
|
|||||||
int status_old, status_new;
|
int status_old, status_new;
|
||||||
u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
|
u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
|
||||||
u8 shift = ffs(mask) - 1, pow, val;
|
u8 shift = ffs(mask) - 1, pow, val;
|
||||||
|
int ret;
|
||||||
|
|
||||||
status_old = read_sr(nor);
|
status_old = read_sr(nor);
|
||||||
if (status_old < 0)
|
if (status_old < 0)
|
||||||
@ -569,7 +574,10 @@ static int stm_unlock(struct spi_nor *nor, loff_t ofs, uint64_t len)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
write_enable(nor);
|
write_enable(nor);
|
||||||
return write_sr(nor, status_new);
|
ret = write_sr(nor, status_new);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
return spi_nor_wait_till_ready(nor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user