Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6ea40a3b authored by Boris Brezillon's avatar Boris Brezillon
Browse files

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: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
Tested-by: default avatarMarc Gonzalez <marc_gonzalez@sigmadesigns.com>
parent 204e7ecd
Loading
Loading
Loading
Loading
+25 −1
Original line number Original line Diff line number Diff line
@@ -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:
+10 −0
Original line number Original line Diff line number Diff line
@@ -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