#define AR934X_NFC_DEV_READY_TIMEOUT 25 /* msecs */
#define AR934X_NFC_DMA_READY_TIMEOUT 25 /* msecs */
#define AR934X_NFC_DONE_TIMEOUT 1000
+#define AR934X_NFC_DMA_RETRIES 20
#define AR934X_NFC_USE_IRQ true
#define AR934X_NFC_IRQ_MASK AR934X_NFC_INT_DEV_RDY(0)
(write) ? "write" : "read", page_addr);
ar934x_nfc_restart(nfc);
- if (retries++ < 5)
+ if (retries++ < AR934X_NFC_DMA_RETRIES)
goto retry;
dev_err(nfc->parent, "%s operation failed on page %d\n",
static void
ar934x_nfc_send_read(struct ar934x_nfc *nfc, unsigned command, int column,
- int page_addr, int len, bool oob)
+ int page_addr, int len)
{
u32 cmd_reg;
- nfc_dbg(nfc, "read, column=%d page=%d len=%d oob:%d\n",
- column, page_addr, len, oob);
+ nfc_dbg(nfc, "read, column=%d page=%d len=%d\n",
+ column, page_addr, len);
cmd_reg = (command & AR934X_NFC_CMD_CMD0_M) << AR934X_NFC_CMD_CMD0_S;
case NAND_CMD_READ0:
case NAND_CMD_READ1:
- if (nfc->small_page)
- ar934x_nfc_send_read(nfc, command, column, page_addr,
- mtd->writesize + mtd->oobsize,
- false);
- else
+ if (nfc->small_page) {
ar934x_nfc_send_read(nfc, command, column, page_addr,
- mtd->writesize, false);
- nfc->rndout_page_addr = page_addr;
- nfc->rndout_read_cmd = command;
+ mtd->writesize + mtd->oobsize);
+ } else {
+ ar934x_nfc_send_read(nfc, command, 0, page_addr,
+ mtd->writesize + mtd->oobsize);
+ nfc->buf_index = column;
+ nfc->rndout_page_addr = page_addr;
+ nfc->rndout_read_cmd = command;
+ }
break;
case NAND_CMD_READOOB:
- if (nfc->small_page) {
+ if (nfc->small_page)
ar934x_nfc_send_read(nfc, NAND_CMD_READOOB,
column, page_addr,
- mtd->oobsize,
- true);
- } else {
+ mtd->oobsize);
+ else
ar934x_nfc_send_read(nfc, NAND_CMD_READ0,
- column, page_addr,
- mtd->writesize + mtd->oobsize,
- true);
- nfc->buf_index = mtd->writesize;
- }
+ mtd->writesize, page_addr,
+ mtd->oobsize);
break;
case NAND_CMD_RNDOUT:
+ if (WARN_ON(nfc->small_page))
+ break;
+
/* emulate subpage read */
- ar934x_nfc_send_read(nfc, nfc->rndout_read_cmd, column,
+ ar934x_nfc_send_read(nfc, nfc->rndout_read_cmd, 0,
nfc->rndout_page_addr,
- mtd->writesize, false);
+ mtd->writesize + mtd->oobsize);
+ nfc->buf_index = column;
break;
case NAND_CMD_ERASE1:
else
mtd->name = dev_name(&pdev->dev);
- nand->options = NAND_NO_AUTOINCR;
nand->chip_delay = 25;
nand->ecc.mode = NAND_ECC_SOFT;