/*
- * Xilinx PSS NAND Flash Controller Driver
+ * Xilinx PS NAND Flash Controller Driver
* This driver is based on plat_nand.c and mxc_nand.c drivers
*
* Copyright (C) 2009 Xilinx, Inc.
#include <linux/mtd/nand_ecc.h>
/* The NAND flash driver defines */
-#define XNANDPSS_CMD_PHASE 1 /* End command valid in command phase */
-#define XNANDPSS_DATA_PHASE 2 /* End command valid in data phase */
-#define XNANDPSS_ECC_SIZE 512 /* Size of data for ECC operation */
+#define XNANDPS_CMD_PHASE 1 /* End command valid in command phase */
+#define XNANDPS_DATA_PHASE 2 /* End command valid in data phase */
+#define XNANDPS_ECC_SIZE 512 /* Size of data for ECC operation */
/* Flash memory controller operating parameters */
-#define XNANDPSS_CLR_CONFIG ((0x1 << 1) | /* Disable interrupt */ \
+#define XNANDPS_CLR_CONFIG ((0x1 << 1) | /* Disable interrupt */ \
(0x1 << 4) | /* Clear interrupt */ \
(0x1 << 6)) /* Disable ECC interrupt */
/* Assuming 50MHz clock (20ns cycle time) and 3V operation */
-#define XNANDPSS_SET_CYCLES ((0x2 << 20) | /* t_rr from nand_cycles */ \
+#define XNANDPS_SET_CYCLES ((0x2 << 20) | /* t_rr from nand_cycles */ \
(0x2 << 17) | /* t_ar from nand_cycles */ \
(0x1 << 14) | /* t_clr from nand_cycles */ \
(0x3 << 11) | /* t_wp from nand_cycles */ \
(0x5 << 4) | /* t_wc from nand_cycles */ \
(0x5 << 0)) /* t_rc from nand_cycles */
-#define XNANDPSS_SET_OPMODE 0x0
+#define XNANDPS_SET_OPMODE 0x0
-#define XNANDPSS_DIRECT_CMD ((0x4 << 23) | /* Chip 0 from interface 1 */ \
+#define XNANDPS_DIRECT_CMD ((0x4 << 23) | /* Chip 0 from interface 1 */ \
(0x2 << 21)) /* UpdateRegs operation */
-#define XNANDPSS_ECC_CONFIG ((0x1 << 2) | /* ECC available on APB */ \
+#define XNANDPS_ECC_CONFIG ((0x1 << 2) | /* ECC available on APB */ \
(0x1 << 4) | /* ECC read at end of page */ \
(0x0 << 5)) /* No Jumping */
-#define XNANDPSS_ECC_CMD1 ((0x80) | /* Write command */ \
+#define XNANDPS_ECC_CMD1 ((0x80) | /* Write command */ \
(0x00 << 8) | /* Read command */ \
(0x30 << 16) | /* Read End command */ \
(0x1 << 24)) /* Read End command calid */
-#define XNANDPSS_ECC_CMD2 ((0x85) | /* Write col change cmd */ \
+#define XNANDPS_ECC_CMD2 ((0x85) | /* Write col change cmd */ \
(0x05 << 8) | /* Read col change cmd */ \
(0xE0 << 16) | /* Read col change end cmd */ \
(0x1 << 24)) /* Read col change
#define COMMAND_PHASE (0 << 19)
#define DATA_PHASE (1 << 19)
-#define XNANDPSS_ECC_LAST (1 << ECC_LAST_SHIFT) /* Set ECC_Last */
-#define XNANDPSS_CLEAR_CS (1 << CLEAR_CS_SHIFT) /* Clear chip select */
+#define XNANDPS_ECC_LAST (1 << ECC_LAST_SHIFT) /* Set ECC_Last */
+#define XNANDPS_CLEAR_CS (1 << CLEAR_CS_SHIFT) /* Clear chip select */
/* ECC block registers bit position and bit mask */
-#define XNANDPSS_ECC_BUSY (1 << 6) /* ECC block is busy */
-#define XNANDPSS_ECC_MASK 0x00FFFFFF /* ECC value mask */
+#define XNANDPS_ECC_BUSY (1 << 6) /* ECC block is busy */
+#define XNANDPS_ECC_MASK 0x00FFFFFF /* ECC value mask */
/* Memory controller configuration register offset */
struct xnandps_smc_mem_regs {
/* The NAND flash operations command format */
static const struct xnandps_command_format xnandps_commands[] = {
- {NAND_CMD_READ0, NAND_CMD_READSTART, 5, XNANDPSS_CMD_PHASE},
- {NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART, 2, XNANDPSS_CMD_PHASE},
+ {NAND_CMD_READ0, NAND_CMD_READSTART, 5, XNANDPS_CMD_PHASE},
+ {NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART, 2, XNANDPS_CMD_PHASE},
{NAND_CMD_READID, NAND_CMD_NONE, 1, NAND_CMD_NONE},
{NAND_CMD_STATUS, NAND_CMD_NONE, 0, NAND_CMD_NONE},
- {NAND_CMD_SEQIN, NAND_CMD_PAGEPROG, 5, XNANDPSS_DATA_PHASE},
+ {NAND_CMD_SEQIN, NAND_CMD_PAGEPROG, 5, XNANDPS_DATA_PHASE},
{NAND_CMD_RNDIN, NAND_CMD_NONE, 2, NAND_CMD_NONE},
- {NAND_CMD_ERASE1, NAND_CMD_ERASE2, 3, XNANDPSS_CMD_PHASE},
+ {NAND_CMD_ERASE1, NAND_CMD_ERASE2, 3, XNANDPS_CMD_PHASE},
{NAND_CMD_RESET, NAND_CMD_NONE, 0, NAND_CMD_NONE},
{NAND_CMD_PARAM, NAND_CMD_NONE, 1, NAND_CMD_NONE},
{NAND_CMD_GET_FEATURES, NAND_CMD_NONE, 1, NAND_CMD_NONE},
* command, which doesn't fit in to the driver design. The cache program
* command is not supported by NAND subsystem also, look at 1612 line
* number (in nand_write_page function) of nand_base.c file.
- * {NAND_CMD_SEQIN, NAND_CMD_CACHEDPROG, 5, XNANDPSS_YES}
+ * {NAND_CMD_SEQIN, NAND_CMD_CACHEDPROG, 5, XNANDPS_YES}
*/
};
/* Wait max 10ms */
timeout = 10;
status = readl(&xnandps_smc_ecc_base->esr);
- while (status & XNANDPSS_ECC_BUSY) {
+ while (status & XNANDPS_ECC_BUSY) {
status = readl(&xnandps_smc_ecc_base->esr);
if (timeout == 0)
return -1;
u32 status;
/* disable interrupts */
- writel(XNANDPSS_CLR_CONFIG, &xnandps_smc_mem_base->cfr);
+ writel(XNANDPS_CLR_CONFIG, &xnandps_smc_mem_base->cfr);
/* Initialize the NAND interface by setting cycles and operation mode */
- writel(XNANDPSS_SET_CYCLES, &xnandps_smc_mem_base->scr);
+ writel(XNANDPS_SET_CYCLES, &xnandps_smc_mem_base->scr);
if (option & NAND_BUSWIDTH_16)
- writel((XNANDPSS_SET_OPMODE | 0x1), &xnandps_smc_mem_base->sor);
+ writel((XNANDPS_SET_OPMODE | 0x1), &xnandps_smc_mem_base->sor);
else
- writel(XNANDPSS_SET_OPMODE, &xnandps_smc_mem_base->sor);
+ writel(XNANDPS_SET_OPMODE, &xnandps_smc_mem_base->sor);
- writel(XNANDPSS_DIRECT_CMD, &xnandps_smc_mem_base->dcr);
+ writel(XNANDPS_DIRECT_CMD, &xnandps_smc_mem_base->dcr);
/* Wait till the ECC operation is complete */
status = xnandps_waitfor_ecc_completion();
}
/* Set the command1 and command2 register */
- writel(XNANDPSS_ECC_CMD1, &xnandps_smc_ecc_base->emcmd1r);
- writel(XNANDPSS_ECC_CMD2, &xnandps_smc_ecc_base->emcmd2r);
+ writel(XNANDPS_ECC_CMD1, &xnandps_smc_ecc_base->emcmd1r);
+ writel(XNANDPS_ECC_CMD2, &xnandps_smc_ecc_base->emcmd2r);
return 0;
}
p += (mtd->oobsize - data_width);
data_phase_addr = (unsigned long)chip->IO_ADDR_R;
- data_phase_addr |= XNANDPSS_CLEAR_CS;
+ data_phase_addr |= XNANDPS_CLEAR_CS;
chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
chip->read_buf(mtd, p, data_width);
buf += (mtd->oobsize - data_width);
data_phase_addr = (unsigned long) chip->IO_ADDR_W;
- data_phase_addr |= XNANDPSS_CLEAR_CS;
+ data_phase_addr |= XNANDPS_CLEAR_CS;
data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
chip->IO_ADDR_W = (void __iomem *) data_phase_addr;
chip->write_buf(mtd, buf, data_width);
p += (mtd->oobsize - data_width);
data_phase_addr = (unsigned long) chip->IO_ADDR_R;
- data_phase_addr |= XNANDPSS_CLEAR_CS;
+ data_phase_addr |= XNANDPS_CLEAR_CS;
chip->IO_ADDR_R = (void __iomem *) data_phase_addr;
chip->read_buf(mtd, p, data_width);
p += (mtd->oobsize - data_width);
data_phase_addr = (unsigned long) chip->IO_ADDR_W;
- data_phase_addr |= XNANDPSS_CLEAR_CS;
+ data_phase_addr |= XNANDPS_CLEAR_CS;
data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
chip->IO_ADDR_W = (void __iomem *) data_phase_addr;
/* Set ECC Last bit to 1 */
data_phase_addr = (unsigned long) chip->IO_ADDR_W;
- data_phase_addr |= XNANDPSS_ECC_LAST;
+ data_phase_addr |= XNANDPS_ECC_LAST;
chip->IO_ADDR_W = (void __iomem *) data_phase_addr;
chip->write_buf(mtd, p, data_width);
/* Clear ECC last bit */
data_phase_addr = (unsigned long)chip->IO_ADDR_W;
- data_phase_addr &= ~XNANDPSS_ECC_LAST;
+ data_phase_addr &= ~XNANDPS_ECC_LAST;
chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
/* Write the spare area with ECC bytes */
chip->write_buf(mtd, oob_ptr, (mtd->oobsize - data_width));
data_phase_addr = (unsigned long)chip->IO_ADDR_W;
- data_phase_addr |= XNANDPSS_CLEAR_CS;
+ data_phase_addr |= XNANDPS_CLEAR_CS;
data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
oob_ptr += (mtd->oobsize - data_width);
/* Set ECC Last bit to 1 */
data_phase_addr = (unsigned long)chip->IO_ADDR_R;
- data_phase_addr |= XNANDPSS_ECC_LAST;
+ data_phase_addr |= XNANDPS_ECC_LAST;
chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
chip->read_buf(mtd, p, data_width);
/* Clear ECC last bit */
data_phase_addr = (unsigned long)chip->IO_ADDR_R;
- data_phase_addr &= ~XNANDPSS_ECC_LAST;
+ data_phase_addr &= ~XNANDPS_ECC_LAST;
chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
/* Read the stored ECC value */
/* de-assert chip select */
data_phase_addr = (unsigned long)chip->IO_ADDR_R;
- data_phase_addr |= XNANDPSS_CLEAR_CS;
+ data_phase_addr |= XNANDPS_CLEAR_CS;
chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
oob_ptr += (mtd->oobsize - data_width);
}
/* Emulate NAND_CMD_READOOB for large page device */
- if ((mtd->writesize > XNANDPSS_ECC_SIZE) &&
+ if ((mtd->writesize > XNANDPS_ECC_SIZE) &&
(command == NAND_CMD_READOOB)) {
column += mtd->writesize;
command = NAND_CMD_READ0;
writel((1 << 4), &xnandps_smc_mem_base->cfr);
/* Get the command phase address */
- if (curr_cmd->end_cmd_valid == XNANDPSS_CMD_PHASE)
+ if (curr_cmd->end_cmd_valid == XNANDPS_CMD_PHASE)
end_cmd_valid = 1;
if (curr_cmd->end_cmd == NAND_CMD_NONE)
if (chip->options & NAND_BUSWIDTH_16)
column >>= 1;
cmd_data = column;
- if (mtd->writesize > XNANDPSS_ECC_SIZE) {
+ if (mtd->writesize > XNANDPS_ECC_SIZE) {
cmd_data |= page_addr << 16;
/* Another address cycle for devices > 128MiB */
if (chip->chipsize > (128 << 20)) {
} else {
/* Hardware ECC generates 3 bytes ECC code for each 512 bytes */
nand_chip->ecc.mode = NAND_ECC_HW;
- nand_chip->ecc.size = XNANDPSS_ECC_SIZE;
+ nand_chip->ecc.size = XNANDPS_ECC_SIZE;
nand_chip->ecc.bytes = 3;
nand_chip->ecc.calculate = xnandps_calculate_hwecc;
nand_chip->ecc.correct = xnandps_correct_data;
case 512:
ecc_page_size = 0x1;
/* Set the ECC memory config register */
- writel((XNANDPSS_ECC_CONFIG | ecc_page_size),
+ writel((XNANDPS_ECC_CONFIG | ecc_page_size),
&xnandps_smc_ecc_base->emcr);
break;
case 1024:
ecc_page_size = 0x2;
/* Set the ECC memory config register */
- writel((XNANDPSS_ECC_CONFIG | ecc_page_size),
+ writel((XNANDPS_ECC_CONFIG | ecc_page_size),
&xnandps_smc_ecc_base->emcr);
break;
case 2048:
ecc_page_size = 0x3;
/* Set the ECC memory config register */
- writel((XNANDPSS_ECC_CONFIG | ecc_page_size),
+ writel((XNANDPS_ECC_CONFIG | ecc_page_size),
&xnandps_smc_ecc_base->emcr);
break;
default: