mtd: nand: Wait tCCS after a column change
Drivers implementing ->cmd_ctrl() and relying on the default ->cmdfunc() implementation usually don't wait tCCS when a column change (RNDIN or RNDOUT) is requested. Add an option flag to ask the core to do so (note that we keep this as an opt-in to avoid breaking existing implementations), and make use of the ->data_interface information is available (otherwise, wait 500ns). Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Tested-by: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
This commit is contained in:
Родитель
204e7ecd47
Коммит
6ea40a3ba9
|
@ -709,6 +709,25 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,
|
|||
nand_wait_ready(mtd);
|
||||
}
|
||||
|
||||
static void nand_ccs_delay(struct nand_chip *chip)
|
||||
{
|
||||
/*
|
||||
* The controller already takes care of waiting for tCCS when the RNDIN
|
||||
* or RNDOUT command is sent, return directly.
|
||||
*/
|
||||
if (!(chip->options & NAND_WAIT_TCCS))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Wait tCCS_min if it is correctly defined, otherwise wait 500ns
|
||||
* (which should be safe for all NANDs).
|
||||
*/
|
||||
if (chip->data_interface && chip->data_interface->timings.sdr.tCCS_min)
|
||||
ndelay(chip->data_interface->timings.sdr.tCCS_min / 1000);
|
||||
else
|
||||
ndelay(500);
|
||||
}
|
||||
|
||||
/**
|
||||
* nand_command_lp - [DEFAULT] Send command to NAND large page device
|
||||
* @mtd: MTD device structure
|
||||
|
@ -773,10 +792,13 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
|
|||
case NAND_CMD_ERASE1:
|
||||
case NAND_CMD_ERASE2:
|
||||
case NAND_CMD_SEQIN:
|
||||
case NAND_CMD_RNDIN:
|
||||
case NAND_CMD_STATUS:
|
||||
return;
|
||||
|
||||
case NAND_CMD_RNDIN:
|
||||
nand_ccs_delay(chip);
|
||||
return;
|
||||
|
||||
case NAND_CMD_RESET:
|
||||
if (chip->dev_ready)
|
||||
break;
|
||||
|
@ -795,6 +817,8 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
|
|||
NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
|
||||
chip->cmd_ctrl(mtd, NAND_CMD_NONE,
|
||||
NAND_NCE | NAND_CTRL_CHANGE);
|
||||
|
||||
nand_ccs_delay(chip);
|
||||
return;
|
||||
|
||||
case NAND_CMD_READ0:
|
||||
|
|
|
@ -210,6 +210,16 @@ enum nand_ecc_algo {
|
|||
*/
|
||||
#define NAND_USE_BOUNCE_BUFFER 0x00100000
|
||||
|
||||
/*
|
||||
* In case your controller is implementing ->cmd_ctrl() and is relying on the
|
||||
* default ->cmdfunc() implementation, you may want to let the core handle the
|
||||
* tCCS delay which is required when a column change (RNDIN or RNDOUT) is
|
||||
* requested.
|
||||
* If your controller already takes care of this delay, you don't need to set
|
||||
* this flag.
|
||||
*/
|
||||
#define NAND_WAIT_TCCS 0x00200000
|
||||
|
||||
/* Options set by nand scan */
|
||||
/* Nand scan has allocated controller struct */
|
||||
#define NAND_CONTROLLER_ALLOC 0x80000000
|
||||
|
|
Загрузка…
Ссылка в новой задаче