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);
|
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
|
* nand_command_lp - [DEFAULT] Send command to NAND large page device
|
||||||
* @mtd: MTD device structure
|
* @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_ERASE1:
|
||||||
case NAND_CMD_ERASE2:
|
case NAND_CMD_ERASE2:
|
||||||
case NAND_CMD_SEQIN:
|
case NAND_CMD_SEQIN:
|
||||||
case NAND_CMD_RNDIN:
|
|
||||||
case NAND_CMD_STATUS:
|
case NAND_CMD_STATUS:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case NAND_CMD_RNDIN:
|
||||||
|
nand_ccs_delay(chip);
|
||||||
|
return;
|
||||||
|
|
||||||
case NAND_CMD_RESET:
|
case NAND_CMD_RESET:
|
||||||
if (chip->dev_ready)
|
if (chip->dev_ready)
|
||||||
break;
|
break;
|
||||||
|
@ -795,6 +817,8 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
|
||||||
NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
|
NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
|
||||||
chip->cmd_ctrl(mtd, NAND_CMD_NONE,
|
chip->cmd_ctrl(mtd, NAND_CMD_NONE,
|
||||||
NAND_NCE | NAND_CTRL_CHANGE);
|
NAND_NCE | NAND_CTRL_CHANGE);
|
||||||
|
|
||||||
|
nand_ccs_delay(chip);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case NAND_CMD_READ0:
|
case NAND_CMD_READ0:
|
||||||
|
|
|
@ -210,6 +210,16 @@ enum nand_ecc_algo {
|
||||||
*/
|
*/
|
||||||
#define NAND_USE_BOUNCE_BUFFER 0x00100000
|
#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 */
|
/* Options set by nand scan */
|
||||||
/* Nand scan has allocated controller struct */
|
/* Nand scan has allocated controller struct */
|
||||||
#define NAND_CONTROLLER_ALLOC 0x80000000
|
#define NAND_CONTROLLER_ALLOC 0x80000000
|
||||||
|
|
Загрузка…
Ссылка в новой задаче