
On Thursday, December 24, 2015 at 03:23:05 AM, Thomas Chou wrote:
Hi Marek,
On 2015年12月24日 09:28, Marek Vasut wrote:
On Thursday, December 24, 2015 at 01:51:22 AM, Thomas Chou wrote:
Skip erase if the sector is blank. The sector erase is slow, and may take 0.7 sec typically or up to 3 sec worst-case.
Signed-off-by: Thomas Chou thomas@wytron.com.tw
drivers/mtd/altera_qspi.c | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/drivers/mtd/altera_qspi.c b/drivers/mtd/altera_qspi.c index b0d4f2c..8a630a6 100644 --- a/drivers/mtd/altera_qspi.c +++ b/drivers/mtd/altera_qspi.c @@ -131,24 +131,35 @@ static int altera_qspi_erase(struct mtd_info *mtd, struct erase_info *instr) size_t end = addr + len;
u32 sect; u32 stat;
u32 *flash, *last;
instr->state = MTD_ERASING; addr &= ~(mtd->erasesize - 1); /* get lower aligned address */ while (addr < end) {
sect = addr / mtd->erasesize;
sect <<= 8;
sect |= QUADSPI_MEM_OP_SECTOR_ERASE;
debug("erase %08x\n", sect);
writel(sect, ®s->mem_op);
stat = readl(®s->isr);
if (stat & QUADSPI_ISR_ILLEGAL_ERASE) {
/* erase failed, sector might be protected */
debug("erase %08x fail %x\n", sect, stat);
writel(stat, ®s->isr); /* clear isr */
instr->fail_addr = addr;
instr->state = MTD_ERASE_FAILED;
mtd_erase_callback(instr);
return -EIO;
flash = pdata->base + addr;
last = pdata->base + addr + mtd->erasesize;
/* skip erase if sector is blank */
while (flash < last) {
if (readl(flash) != 0xffffffff)
break;
flash++;
Shouldn't $last be divided by 4 ? $flash is u32 * afterall .
No. Both flash and last are assigned with byte addressing from pdata->base, which is void *.
The data type of both $flash and $last is u32 * though?
Best regards, Marek Vasut