162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com)
462306a36Sopenharmony_ci *		  2002-2006 Thomas Gleixner (tglx@linutronix.de)
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci *  Credits:
762306a36Sopenharmony_ci *	David Woodhouse for adding multichip support
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci *	Aleph One Ltd. and Toby Churchill Ltd. for supporting the
1062306a36Sopenharmony_ci *	rework for 2K page size chips
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * This file contains all legacy helpers/code that should be removed
1362306a36Sopenharmony_ci * at some point.
1462306a36Sopenharmony_ci */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <linux/delay.h>
1762306a36Sopenharmony_ci#include <linux/io.h>
1862306a36Sopenharmony_ci#include <linux/nmi.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "internals.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/**
2362306a36Sopenharmony_ci * nand_read_byte - [DEFAULT] read one byte from the chip
2462306a36Sopenharmony_ci * @chip: NAND chip object
2562306a36Sopenharmony_ci *
2662306a36Sopenharmony_ci * Default read function for 8bit buswidth
2762306a36Sopenharmony_ci */
2862306a36Sopenharmony_cistatic uint8_t nand_read_byte(struct nand_chip *chip)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	return readb(chip->legacy.IO_ADDR_R);
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/**
3462306a36Sopenharmony_ci * nand_read_byte16 - [DEFAULT] read one byte endianness aware from the chip
3562306a36Sopenharmony_ci * @chip: NAND chip object
3662306a36Sopenharmony_ci *
3762306a36Sopenharmony_ci * Default read function for 16bit buswidth with endianness conversion.
3862306a36Sopenharmony_ci *
3962306a36Sopenharmony_ci */
4062306a36Sopenharmony_cistatic uint8_t nand_read_byte16(struct nand_chip *chip)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	return (uint8_t) cpu_to_le16(readw(chip->legacy.IO_ADDR_R));
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/**
4662306a36Sopenharmony_ci * nand_select_chip - [DEFAULT] control CE line
4762306a36Sopenharmony_ci * @chip: NAND chip object
4862306a36Sopenharmony_ci * @chipnr: chipnumber to select, -1 for deselect
4962306a36Sopenharmony_ci *
5062306a36Sopenharmony_ci * Default select function for 1 chip devices.
5162306a36Sopenharmony_ci */
5262306a36Sopenharmony_cistatic void nand_select_chip(struct nand_chip *chip, int chipnr)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	switch (chipnr) {
5562306a36Sopenharmony_ci	case -1:
5662306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
5762306a36Sopenharmony_ci				      0 | NAND_CTRL_CHANGE);
5862306a36Sopenharmony_ci		break;
5962306a36Sopenharmony_ci	case 0:
6062306a36Sopenharmony_ci		break;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	default:
6362306a36Sopenharmony_ci		BUG();
6462306a36Sopenharmony_ci	}
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/**
6862306a36Sopenharmony_ci * nand_write_byte - [DEFAULT] write single byte to chip
6962306a36Sopenharmony_ci * @chip: NAND chip object
7062306a36Sopenharmony_ci * @byte: value to write
7162306a36Sopenharmony_ci *
7262306a36Sopenharmony_ci * Default function to write a byte to I/O[7:0]
7362306a36Sopenharmony_ci */
7462306a36Sopenharmony_cistatic void nand_write_byte(struct nand_chip *chip, uint8_t byte)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	chip->legacy.write_buf(chip, &byte, 1);
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci/**
8062306a36Sopenharmony_ci * nand_write_byte16 - [DEFAULT] write single byte to a chip with width 16
8162306a36Sopenharmony_ci * @chip: NAND chip object
8262306a36Sopenharmony_ci * @byte: value to write
8362306a36Sopenharmony_ci *
8462306a36Sopenharmony_ci * Default function to write a byte to I/O[7:0] on a 16-bit wide chip.
8562306a36Sopenharmony_ci */
8662306a36Sopenharmony_cistatic void nand_write_byte16(struct nand_chip *chip, uint8_t byte)
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	uint16_t word = byte;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	/*
9162306a36Sopenharmony_ci	 * It's not entirely clear what should happen to I/O[15:8] when writing
9262306a36Sopenharmony_ci	 * a byte. The ONFi spec (Revision 3.1; 2012-09-19, Section 2.16) reads:
9362306a36Sopenharmony_ci	 *
9462306a36Sopenharmony_ci	 *    When the host supports a 16-bit bus width, only data is
9562306a36Sopenharmony_ci	 *    transferred at the 16-bit width. All address and command line
9662306a36Sopenharmony_ci	 *    transfers shall use only the lower 8-bits of the data bus. During
9762306a36Sopenharmony_ci	 *    command transfers, the host may place any value on the upper
9862306a36Sopenharmony_ci	 *    8-bits of the data bus. During address transfers, the host shall
9962306a36Sopenharmony_ci	 *    set the upper 8-bits of the data bus to 00h.
10062306a36Sopenharmony_ci	 *
10162306a36Sopenharmony_ci	 * One user of the write_byte callback is nand_set_features. The
10262306a36Sopenharmony_ci	 * four parameters are specified to be written to I/O[7:0], but this is
10362306a36Sopenharmony_ci	 * neither an address nor a command transfer. Let's assume a 0 on the
10462306a36Sopenharmony_ci	 * upper I/O lines is OK.
10562306a36Sopenharmony_ci	 */
10662306a36Sopenharmony_ci	chip->legacy.write_buf(chip, (uint8_t *)&word, 2);
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/**
11062306a36Sopenharmony_ci * nand_write_buf - [DEFAULT] write buffer to chip
11162306a36Sopenharmony_ci * @chip: NAND chip object
11262306a36Sopenharmony_ci * @buf: data buffer
11362306a36Sopenharmony_ci * @len: number of bytes to write
11462306a36Sopenharmony_ci *
11562306a36Sopenharmony_ci * Default write function for 8bit buswidth.
11662306a36Sopenharmony_ci */
11762306a36Sopenharmony_cistatic void nand_write_buf(struct nand_chip *chip, const uint8_t *buf, int len)
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	iowrite8_rep(chip->legacy.IO_ADDR_W, buf, len);
12062306a36Sopenharmony_ci}
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci/**
12362306a36Sopenharmony_ci * nand_read_buf - [DEFAULT] read chip data into buffer
12462306a36Sopenharmony_ci * @chip: NAND chip object
12562306a36Sopenharmony_ci * @buf: buffer to store date
12662306a36Sopenharmony_ci * @len: number of bytes to read
12762306a36Sopenharmony_ci *
12862306a36Sopenharmony_ci * Default read function for 8bit buswidth.
12962306a36Sopenharmony_ci */
13062306a36Sopenharmony_cistatic void nand_read_buf(struct nand_chip *chip, uint8_t *buf, int len)
13162306a36Sopenharmony_ci{
13262306a36Sopenharmony_ci	ioread8_rep(chip->legacy.IO_ADDR_R, buf, len);
13362306a36Sopenharmony_ci}
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci/**
13662306a36Sopenharmony_ci * nand_write_buf16 - [DEFAULT] write buffer to chip
13762306a36Sopenharmony_ci * @chip: NAND chip object
13862306a36Sopenharmony_ci * @buf: data buffer
13962306a36Sopenharmony_ci * @len: number of bytes to write
14062306a36Sopenharmony_ci *
14162306a36Sopenharmony_ci * Default write function for 16bit buswidth.
14262306a36Sopenharmony_ci */
14362306a36Sopenharmony_cistatic void nand_write_buf16(struct nand_chip *chip, const uint8_t *buf,
14462306a36Sopenharmony_ci			     int len)
14562306a36Sopenharmony_ci{
14662306a36Sopenharmony_ci	u16 *p = (u16 *) buf;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	iowrite16_rep(chip->legacy.IO_ADDR_W, p, len >> 1);
14962306a36Sopenharmony_ci}
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci/**
15262306a36Sopenharmony_ci * nand_read_buf16 - [DEFAULT] read chip data into buffer
15362306a36Sopenharmony_ci * @chip: NAND chip object
15462306a36Sopenharmony_ci * @buf: buffer to store date
15562306a36Sopenharmony_ci * @len: number of bytes to read
15662306a36Sopenharmony_ci *
15762306a36Sopenharmony_ci * Default read function for 16bit buswidth.
15862306a36Sopenharmony_ci */
15962306a36Sopenharmony_cistatic void nand_read_buf16(struct nand_chip *chip, uint8_t *buf, int len)
16062306a36Sopenharmony_ci{
16162306a36Sopenharmony_ci	u16 *p = (u16 *) buf;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	ioread16_rep(chip->legacy.IO_ADDR_R, p, len >> 1);
16462306a36Sopenharmony_ci}
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci/**
16762306a36Sopenharmony_ci * panic_nand_wait_ready - [GENERIC] Wait for the ready pin after commands.
16862306a36Sopenharmony_ci * @chip: NAND chip object
16962306a36Sopenharmony_ci * @timeo: Timeout
17062306a36Sopenharmony_ci *
17162306a36Sopenharmony_ci * Helper function for nand_wait_ready used when needing to wait in interrupt
17262306a36Sopenharmony_ci * context.
17362306a36Sopenharmony_ci */
17462306a36Sopenharmony_cistatic void panic_nand_wait_ready(struct nand_chip *chip, unsigned long timeo)
17562306a36Sopenharmony_ci{
17662306a36Sopenharmony_ci	int i;
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	/* Wait for the device to get ready */
17962306a36Sopenharmony_ci	for (i = 0; i < timeo; i++) {
18062306a36Sopenharmony_ci		if (chip->legacy.dev_ready(chip))
18162306a36Sopenharmony_ci			break;
18262306a36Sopenharmony_ci		touch_softlockup_watchdog();
18362306a36Sopenharmony_ci		mdelay(1);
18462306a36Sopenharmony_ci	}
18562306a36Sopenharmony_ci}
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/**
18862306a36Sopenharmony_ci * nand_wait_ready - [GENERIC] Wait for the ready pin after commands.
18962306a36Sopenharmony_ci * @chip: NAND chip object
19062306a36Sopenharmony_ci *
19162306a36Sopenharmony_ci * Wait for the ready pin after a command, and warn if a timeout occurs.
19262306a36Sopenharmony_ci */
19362306a36Sopenharmony_civoid nand_wait_ready(struct nand_chip *chip)
19462306a36Sopenharmony_ci{
19562306a36Sopenharmony_ci	struct mtd_info *mtd = nand_to_mtd(chip);
19662306a36Sopenharmony_ci	unsigned long timeo = 400;
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci	if (mtd->oops_panic_write)
19962306a36Sopenharmony_ci		return panic_nand_wait_ready(chip, timeo);
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	/* Wait until command is processed or timeout occurs */
20262306a36Sopenharmony_ci	timeo = jiffies + msecs_to_jiffies(timeo);
20362306a36Sopenharmony_ci	do {
20462306a36Sopenharmony_ci		if (chip->legacy.dev_ready(chip))
20562306a36Sopenharmony_ci			return;
20662306a36Sopenharmony_ci		cond_resched();
20762306a36Sopenharmony_ci	} while (time_before(jiffies, timeo));
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci	if (!chip->legacy.dev_ready(chip))
21062306a36Sopenharmony_ci		pr_warn_ratelimited("timeout while waiting for chip to become ready\n");
21162306a36Sopenharmony_ci}
21262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(nand_wait_ready);
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci/**
21562306a36Sopenharmony_ci * nand_wait_status_ready - [GENERIC] Wait for the ready status after commands.
21662306a36Sopenharmony_ci * @chip: NAND chip object
21762306a36Sopenharmony_ci * @timeo: Timeout in ms
21862306a36Sopenharmony_ci *
21962306a36Sopenharmony_ci * Wait for status ready (i.e. command done) or timeout.
22062306a36Sopenharmony_ci */
22162306a36Sopenharmony_cistatic void nand_wait_status_ready(struct nand_chip *chip, unsigned long timeo)
22262306a36Sopenharmony_ci{
22362306a36Sopenharmony_ci	int ret;
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	timeo = jiffies + msecs_to_jiffies(timeo);
22662306a36Sopenharmony_ci	do {
22762306a36Sopenharmony_ci		u8 status;
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci		ret = nand_read_data_op(chip, &status, sizeof(status), true,
23062306a36Sopenharmony_ci					false);
23162306a36Sopenharmony_ci		if (ret)
23262306a36Sopenharmony_ci			return;
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci		if (status & NAND_STATUS_READY)
23562306a36Sopenharmony_ci			break;
23662306a36Sopenharmony_ci		touch_softlockup_watchdog();
23762306a36Sopenharmony_ci	} while (time_before(jiffies, timeo));
23862306a36Sopenharmony_ci};
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci/**
24162306a36Sopenharmony_ci * nand_command - [DEFAULT] Send command to NAND device
24262306a36Sopenharmony_ci * @chip: NAND chip object
24362306a36Sopenharmony_ci * @command: the command to be sent
24462306a36Sopenharmony_ci * @column: the column address for this command, -1 if none
24562306a36Sopenharmony_ci * @page_addr: the page address for this command, -1 if none
24662306a36Sopenharmony_ci *
24762306a36Sopenharmony_ci * Send command to NAND device. This function is used for small page devices
24862306a36Sopenharmony_ci * (512 Bytes per page).
24962306a36Sopenharmony_ci */
25062306a36Sopenharmony_cistatic void nand_command(struct nand_chip *chip, unsigned int command,
25162306a36Sopenharmony_ci			 int column, int page_addr)
25262306a36Sopenharmony_ci{
25362306a36Sopenharmony_ci	struct mtd_info *mtd = nand_to_mtd(chip);
25462306a36Sopenharmony_ci	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	/* Write out the command to the device */
25762306a36Sopenharmony_ci	if (command == NAND_CMD_SEQIN) {
25862306a36Sopenharmony_ci		int readcmd;
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci		if (column >= mtd->writesize) {
26162306a36Sopenharmony_ci			/* OOB area */
26262306a36Sopenharmony_ci			column -= mtd->writesize;
26362306a36Sopenharmony_ci			readcmd = NAND_CMD_READOOB;
26462306a36Sopenharmony_ci		} else if (column < 256) {
26562306a36Sopenharmony_ci			/* First 256 bytes --> READ0 */
26662306a36Sopenharmony_ci			readcmd = NAND_CMD_READ0;
26762306a36Sopenharmony_ci		} else {
26862306a36Sopenharmony_ci			column -= 256;
26962306a36Sopenharmony_ci			readcmd = NAND_CMD_READ1;
27062306a36Sopenharmony_ci		}
27162306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, readcmd, ctrl);
27262306a36Sopenharmony_ci		ctrl &= ~NAND_CTRL_CHANGE;
27362306a36Sopenharmony_ci	}
27462306a36Sopenharmony_ci	if (command != NAND_CMD_NONE)
27562306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, command, ctrl);
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci	/* Address cycle, when necessary */
27862306a36Sopenharmony_ci	ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;
27962306a36Sopenharmony_ci	/* Serially input address */
28062306a36Sopenharmony_ci	if (column != -1) {
28162306a36Sopenharmony_ci		/* Adjust columns for 16 bit buswidth */
28262306a36Sopenharmony_ci		if (chip->options & NAND_BUSWIDTH_16 &&
28362306a36Sopenharmony_ci				!nand_opcode_8bits(command))
28462306a36Sopenharmony_ci			column >>= 1;
28562306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, column, ctrl);
28662306a36Sopenharmony_ci		ctrl &= ~NAND_CTRL_CHANGE;
28762306a36Sopenharmony_ci	}
28862306a36Sopenharmony_ci	if (page_addr != -1) {
28962306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, page_addr, ctrl);
29062306a36Sopenharmony_ci		ctrl &= ~NAND_CTRL_CHANGE;
29162306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, page_addr >> 8, ctrl);
29262306a36Sopenharmony_ci		if (chip->options & NAND_ROW_ADDR_3)
29362306a36Sopenharmony_ci			chip->legacy.cmd_ctrl(chip, page_addr >> 16, ctrl);
29462306a36Sopenharmony_ci	}
29562306a36Sopenharmony_ci	chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
29662306a36Sopenharmony_ci			      NAND_NCE | NAND_CTRL_CHANGE);
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	/*
29962306a36Sopenharmony_ci	 * Program and erase have their own busy handlers status and sequential
30062306a36Sopenharmony_ci	 * in needs no delay
30162306a36Sopenharmony_ci	 */
30262306a36Sopenharmony_ci	switch (command) {
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	case NAND_CMD_NONE:
30562306a36Sopenharmony_ci	case NAND_CMD_PAGEPROG:
30662306a36Sopenharmony_ci	case NAND_CMD_ERASE1:
30762306a36Sopenharmony_ci	case NAND_CMD_ERASE2:
30862306a36Sopenharmony_ci	case NAND_CMD_SEQIN:
30962306a36Sopenharmony_ci	case NAND_CMD_STATUS:
31062306a36Sopenharmony_ci	case NAND_CMD_READID:
31162306a36Sopenharmony_ci	case NAND_CMD_SET_FEATURES:
31262306a36Sopenharmony_ci		return;
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci	case NAND_CMD_RESET:
31562306a36Sopenharmony_ci		if (chip->legacy.dev_ready)
31662306a36Sopenharmony_ci			break;
31762306a36Sopenharmony_ci		udelay(chip->legacy.chip_delay);
31862306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, NAND_CMD_STATUS,
31962306a36Sopenharmony_ci				      NAND_CTRL_CLE | NAND_CTRL_CHANGE);
32062306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
32162306a36Sopenharmony_ci				      NAND_NCE | NAND_CTRL_CHANGE);
32262306a36Sopenharmony_ci		/* EZ-NAND can take upto 250ms as per ONFi v4.0 */
32362306a36Sopenharmony_ci		nand_wait_status_ready(chip, 250);
32462306a36Sopenharmony_ci		return;
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci		/* This applies to read commands */
32762306a36Sopenharmony_ci	case NAND_CMD_READ0:
32862306a36Sopenharmony_ci		/*
32962306a36Sopenharmony_ci		 * READ0 is sometimes used to exit GET STATUS mode. When this
33062306a36Sopenharmony_ci		 * is the case no address cycles are requested, and we can use
33162306a36Sopenharmony_ci		 * this information to detect that we should not wait for the
33262306a36Sopenharmony_ci		 * device to be ready.
33362306a36Sopenharmony_ci		 */
33462306a36Sopenharmony_ci		if (column == -1 && page_addr == -1)
33562306a36Sopenharmony_ci			return;
33662306a36Sopenharmony_ci		fallthrough;
33762306a36Sopenharmony_ci	default:
33862306a36Sopenharmony_ci		/*
33962306a36Sopenharmony_ci		 * If we don't have access to the busy pin, we apply the given
34062306a36Sopenharmony_ci		 * command delay
34162306a36Sopenharmony_ci		 */
34262306a36Sopenharmony_ci		if (!chip->legacy.dev_ready) {
34362306a36Sopenharmony_ci			udelay(chip->legacy.chip_delay);
34462306a36Sopenharmony_ci			return;
34562306a36Sopenharmony_ci		}
34662306a36Sopenharmony_ci	}
34762306a36Sopenharmony_ci	/*
34862306a36Sopenharmony_ci	 * Apply this short delay always to ensure that we do wait tWB in
34962306a36Sopenharmony_ci	 * any case on any machine.
35062306a36Sopenharmony_ci	 */
35162306a36Sopenharmony_ci	ndelay(100);
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci	nand_wait_ready(chip);
35462306a36Sopenharmony_ci}
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_cistatic void nand_ccs_delay(struct nand_chip *chip)
35762306a36Sopenharmony_ci{
35862306a36Sopenharmony_ci	const struct nand_sdr_timings *sdr =
35962306a36Sopenharmony_ci		nand_get_sdr_timings(nand_get_interface_config(chip));
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci	/*
36262306a36Sopenharmony_ci	 * The controller already takes care of waiting for tCCS when the RNDIN
36362306a36Sopenharmony_ci	 * or RNDOUT command is sent, return directly.
36462306a36Sopenharmony_ci	 */
36562306a36Sopenharmony_ci	if (!(chip->options & NAND_WAIT_TCCS))
36662306a36Sopenharmony_ci		return;
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci	/*
36962306a36Sopenharmony_ci	 * Wait tCCS_min if it is correctly defined, otherwise wait 500ns
37062306a36Sopenharmony_ci	 * (which should be safe for all NANDs).
37162306a36Sopenharmony_ci	 */
37262306a36Sopenharmony_ci	if (!IS_ERR(sdr) && nand_controller_can_setup_interface(chip))
37362306a36Sopenharmony_ci		ndelay(sdr->tCCS_min / 1000);
37462306a36Sopenharmony_ci	else
37562306a36Sopenharmony_ci		ndelay(500);
37662306a36Sopenharmony_ci}
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci/**
37962306a36Sopenharmony_ci * nand_command_lp - [DEFAULT] Send command to NAND large page device
38062306a36Sopenharmony_ci * @chip: NAND chip object
38162306a36Sopenharmony_ci * @command: the command to be sent
38262306a36Sopenharmony_ci * @column: the column address for this command, -1 if none
38362306a36Sopenharmony_ci * @page_addr: the page address for this command, -1 if none
38462306a36Sopenharmony_ci *
38562306a36Sopenharmony_ci * Send command to NAND device. This is the version for the new large page
38662306a36Sopenharmony_ci * devices. We don't have the separate regions as we have in the small page
38762306a36Sopenharmony_ci * devices. We must emulate NAND_CMD_READOOB to keep the code compatible.
38862306a36Sopenharmony_ci */
38962306a36Sopenharmony_cistatic void nand_command_lp(struct nand_chip *chip, unsigned int command,
39062306a36Sopenharmony_ci			    int column, int page_addr)
39162306a36Sopenharmony_ci{
39262306a36Sopenharmony_ci	struct mtd_info *mtd = nand_to_mtd(chip);
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	/* Emulate NAND_CMD_READOOB */
39562306a36Sopenharmony_ci	if (command == NAND_CMD_READOOB) {
39662306a36Sopenharmony_ci		column += mtd->writesize;
39762306a36Sopenharmony_ci		command = NAND_CMD_READ0;
39862306a36Sopenharmony_ci	}
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci	/* Command latch cycle */
40162306a36Sopenharmony_ci	if (command != NAND_CMD_NONE)
40262306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, command,
40362306a36Sopenharmony_ci				      NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci	if (column != -1 || page_addr != -1) {
40662306a36Sopenharmony_ci		int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci		/* Serially input address */
40962306a36Sopenharmony_ci		if (column != -1) {
41062306a36Sopenharmony_ci			/* Adjust columns for 16 bit buswidth */
41162306a36Sopenharmony_ci			if (chip->options & NAND_BUSWIDTH_16 &&
41262306a36Sopenharmony_ci					!nand_opcode_8bits(command))
41362306a36Sopenharmony_ci				column >>= 1;
41462306a36Sopenharmony_ci			chip->legacy.cmd_ctrl(chip, column, ctrl);
41562306a36Sopenharmony_ci			ctrl &= ~NAND_CTRL_CHANGE;
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci			/* Only output a single addr cycle for 8bits opcodes. */
41862306a36Sopenharmony_ci			if (!nand_opcode_8bits(command))
41962306a36Sopenharmony_ci				chip->legacy.cmd_ctrl(chip, column >> 8, ctrl);
42062306a36Sopenharmony_ci		}
42162306a36Sopenharmony_ci		if (page_addr != -1) {
42262306a36Sopenharmony_ci			chip->legacy.cmd_ctrl(chip, page_addr, ctrl);
42362306a36Sopenharmony_ci			chip->legacy.cmd_ctrl(chip, page_addr >> 8,
42462306a36Sopenharmony_ci					     NAND_NCE | NAND_ALE);
42562306a36Sopenharmony_ci			if (chip->options & NAND_ROW_ADDR_3)
42662306a36Sopenharmony_ci				chip->legacy.cmd_ctrl(chip, page_addr >> 16,
42762306a36Sopenharmony_ci						      NAND_NCE | NAND_ALE);
42862306a36Sopenharmony_ci		}
42962306a36Sopenharmony_ci	}
43062306a36Sopenharmony_ci	chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
43162306a36Sopenharmony_ci			      NAND_NCE | NAND_CTRL_CHANGE);
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ci	/*
43462306a36Sopenharmony_ci	 * Program and erase have their own busy handlers status, sequential
43562306a36Sopenharmony_ci	 * in and status need no delay.
43662306a36Sopenharmony_ci	 */
43762306a36Sopenharmony_ci	switch (command) {
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci	case NAND_CMD_NONE:
44062306a36Sopenharmony_ci	case NAND_CMD_CACHEDPROG:
44162306a36Sopenharmony_ci	case NAND_CMD_PAGEPROG:
44262306a36Sopenharmony_ci	case NAND_CMD_ERASE1:
44362306a36Sopenharmony_ci	case NAND_CMD_ERASE2:
44462306a36Sopenharmony_ci	case NAND_CMD_SEQIN:
44562306a36Sopenharmony_ci	case NAND_CMD_STATUS:
44662306a36Sopenharmony_ci	case NAND_CMD_READID:
44762306a36Sopenharmony_ci	case NAND_CMD_SET_FEATURES:
44862306a36Sopenharmony_ci		return;
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci	case NAND_CMD_RNDIN:
45162306a36Sopenharmony_ci		nand_ccs_delay(chip);
45262306a36Sopenharmony_ci		return;
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci	case NAND_CMD_RESET:
45562306a36Sopenharmony_ci		if (chip->legacy.dev_ready)
45662306a36Sopenharmony_ci			break;
45762306a36Sopenharmony_ci		udelay(chip->legacy.chip_delay);
45862306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, NAND_CMD_STATUS,
45962306a36Sopenharmony_ci				      NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
46062306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
46162306a36Sopenharmony_ci				      NAND_NCE | NAND_CTRL_CHANGE);
46262306a36Sopenharmony_ci		/* EZ-NAND can take upto 250ms as per ONFi v4.0 */
46362306a36Sopenharmony_ci		nand_wait_status_ready(chip, 250);
46462306a36Sopenharmony_ci		return;
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci	case NAND_CMD_RNDOUT:
46762306a36Sopenharmony_ci		/* No ready / busy check necessary */
46862306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, NAND_CMD_RNDOUTSTART,
46962306a36Sopenharmony_ci				      NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
47062306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
47162306a36Sopenharmony_ci				      NAND_NCE | NAND_CTRL_CHANGE);
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci		nand_ccs_delay(chip);
47462306a36Sopenharmony_ci		return;
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci	case NAND_CMD_READ0:
47762306a36Sopenharmony_ci		/*
47862306a36Sopenharmony_ci		 * READ0 is sometimes used to exit GET STATUS mode. When this
47962306a36Sopenharmony_ci		 * is the case no address cycles are requested, and we can use
48062306a36Sopenharmony_ci		 * this information to detect that READSTART should not be
48162306a36Sopenharmony_ci		 * issued.
48262306a36Sopenharmony_ci		 */
48362306a36Sopenharmony_ci		if (column == -1 && page_addr == -1)
48462306a36Sopenharmony_ci			return;
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, NAND_CMD_READSTART,
48762306a36Sopenharmony_ci				      NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
48862306a36Sopenharmony_ci		chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
48962306a36Sopenharmony_ci				      NAND_NCE | NAND_CTRL_CHANGE);
49062306a36Sopenharmony_ci		fallthrough;	/* This applies to read commands */
49162306a36Sopenharmony_ci	default:
49262306a36Sopenharmony_ci		/*
49362306a36Sopenharmony_ci		 * If we don't have access to the busy pin, we apply the given
49462306a36Sopenharmony_ci		 * command delay.
49562306a36Sopenharmony_ci		 */
49662306a36Sopenharmony_ci		if (!chip->legacy.dev_ready) {
49762306a36Sopenharmony_ci			udelay(chip->legacy.chip_delay);
49862306a36Sopenharmony_ci			return;
49962306a36Sopenharmony_ci		}
50062306a36Sopenharmony_ci	}
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci	/*
50362306a36Sopenharmony_ci	 * Apply this short delay always to ensure that we do wait tWB in
50462306a36Sopenharmony_ci	 * any case on any machine.
50562306a36Sopenharmony_ci	 */
50662306a36Sopenharmony_ci	ndelay(100);
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci	nand_wait_ready(chip);
50962306a36Sopenharmony_ci}
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci/**
51262306a36Sopenharmony_ci * nand_get_set_features_notsupp - set/get features stub returning -ENOTSUPP
51362306a36Sopenharmony_ci * @chip: nand chip info structure
51462306a36Sopenharmony_ci * @addr: feature address.
51562306a36Sopenharmony_ci * @subfeature_param: the subfeature parameters, a four bytes array.
51662306a36Sopenharmony_ci *
51762306a36Sopenharmony_ci * Should be used by NAND controller drivers that do not support the SET/GET
51862306a36Sopenharmony_ci * FEATURES operations.
51962306a36Sopenharmony_ci */
52062306a36Sopenharmony_ciint nand_get_set_features_notsupp(struct nand_chip *chip, int addr,
52162306a36Sopenharmony_ci				  u8 *subfeature_param)
52262306a36Sopenharmony_ci{
52362306a36Sopenharmony_ci	return -ENOTSUPP;
52462306a36Sopenharmony_ci}
52562306a36Sopenharmony_ciEXPORT_SYMBOL(nand_get_set_features_notsupp);
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_ci/**
52862306a36Sopenharmony_ci * nand_wait - [DEFAULT] wait until the command is done
52962306a36Sopenharmony_ci * @chip: NAND chip structure
53062306a36Sopenharmony_ci *
53162306a36Sopenharmony_ci * Wait for command done. This applies to erase and program only.
53262306a36Sopenharmony_ci */
53362306a36Sopenharmony_cistatic int nand_wait(struct nand_chip *chip)
53462306a36Sopenharmony_ci{
53562306a36Sopenharmony_ci	struct mtd_info *mtd = nand_to_mtd(chip);
53662306a36Sopenharmony_ci	unsigned long timeo = 400;
53762306a36Sopenharmony_ci	u8 status;
53862306a36Sopenharmony_ci	int ret;
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ci	/*
54162306a36Sopenharmony_ci	 * Apply this short delay always to ensure that we do wait tWB in any
54262306a36Sopenharmony_ci	 * case on any machine.
54362306a36Sopenharmony_ci	 */
54462306a36Sopenharmony_ci	ndelay(100);
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci	ret = nand_status_op(chip, NULL);
54762306a36Sopenharmony_ci	if (ret)
54862306a36Sopenharmony_ci		return ret;
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci	if (mtd->oops_panic_write) {
55162306a36Sopenharmony_ci		panic_nand_wait(chip, timeo);
55262306a36Sopenharmony_ci	} else {
55362306a36Sopenharmony_ci		timeo = jiffies + msecs_to_jiffies(timeo);
55462306a36Sopenharmony_ci		do {
55562306a36Sopenharmony_ci			if (chip->legacy.dev_ready) {
55662306a36Sopenharmony_ci				if (chip->legacy.dev_ready(chip))
55762306a36Sopenharmony_ci					break;
55862306a36Sopenharmony_ci			} else {
55962306a36Sopenharmony_ci				ret = nand_read_data_op(chip, &status,
56062306a36Sopenharmony_ci							sizeof(status), true,
56162306a36Sopenharmony_ci							false);
56262306a36Sopenharmony_ci				if (ret)
56362306a36Sopenharmony_ci					return ret;
56462306a36Sopenharmony_ci
56562306a36Sopenharmony_ci				if (status & NAND_STATUS_READY)
56662306a36Sopenharmony_ci					break;
56762306a36Sopenharmony_ci			}
56862306a36Sopenharmony_ci			cond_resched();
56962306a36Sopenharmony_ci		} while (time_before(jiffies, timeo));
57062306a36Sopenharmony_ci	}
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ci	ret = nand_read_data_op(chip, &status, sizeof(status), true, false);
57362306a36Sopenharmony_ci	if (ret)
57462306a36Sopenharmony_ci		return ret;
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci	/* This can happen if in case of timeout or buggy dev_ready */
57762306a36Sopenharmony_ci	WARN_ON(!(status & NAND_STATUS_READY));
57862306a36Sopenharmony_ci	return status;
57962306a36Sopenharmony_ci}
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_civoid nand_legacy_set_defaults(struct nand_chip *chip)
58262306a36Sopenharmony_ci{
58362306a36Sopenharmony_ci	unsigned int busw = chip->options & NAND_BUSWIDTH_16;
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci	if (nand_has_exec_op(chip))
58662306a36Sopenharmony_ci		return;
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_ci	/* check for proper chip_delay setup, set 20us if not */
58962306a36Sopenharmony_ci	if (!chip->legacy.chip_delay)
59062306a36Sopenharmony_ci		chip->legacy.chip_delay = 20;
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci	/* check, if a user supplied command function given */
59362306a36Sopenharmony_ci	if (!chip->legacy.cmdfunc)
59462306a36Sopenharmony_ci		chip->legacy.cmdfunc = nand_command;
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci	/* check, if a user supplied wait function given */
59762306a36Sopenharmony_ci	if (chip->legacy.waitfunc == NULL)
59862306a36Sopenharmony_ci		chip->legacy.waitfunc = nand_wait;
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci	if (!chip->legacy.select_chip)
60162306a36Sopenharmony_ci		chip->legacy.select_chip = nand_select_chip;
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci	/* If called twice, pointers that depend on busw may need to be reset */
60462306a36Sopenharmony_ci	if (!chip->legacy.read_byte || chip->legacy.read_byte == nand_read_byte)
60562306a36Sopenharmony_ci		chip->legacy.read_byte = busw ? nand_read_byte16 : nand_read_byte;
60662306a36Sopenharmony_ci	if (!chip->legacy.write_buf || chip->legacy.write_buf == nand_write_buf)
60762306a36Sopenharmony_ci		chip->legacy.write_buf = busw ? nand_write_buf16 : nand_write_buf;
60862306a36Sopenharmony_ci	if (!chip->legacy.write_byte || chip->legacy.write_byte == nand_write_byte)
60962306a36Sopenharmony_ci		chip->legacy.write_byte = busw ? nand_write_byte16 : nand_write_byte;
61062306a36Sopenharmony_ci	if (!chip->legacy.read_buf || chip->legacy.read_buf == nand_read_buf)
61162306a36Sopenharmony_ci		chip->legacy.read_buf = busw ? nand_read_buf16 : nand_read_buf;
61262306a36Sopenharmony_ci}
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_civoid nand_legacy_adjust_cmdfunc(struct nand_chip *chip)
61562306a36Sopenharmony_ci{
61662306a36Sopenharmony_ci	struct mtd_info *mtd = nand_to_mtd(chip);
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_ci	/* Do not replace user supplied command function! */
61962306a36Sopenharmony_ci	if (mtd->writesize > 512 && chip->legacy.cmdfunc == nand_command)
62062306a36Sopenharmony_ci		chip->legacy.cmdfunc = nand_command_lp;
62162306a36Sopenharmony_ci}
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_ciint nand_legacy_check_hooks(struct nand_chip *chip)
62462306a36Sopenharmony_ci{
62562306a36Sopenharmony_ci	/*
62662306a36Sopenharmony_ci	 * ->legacy.cmdfunc() is legacy and will only be used if ->exec_op() is
62762306a36Sopenharmony_ci	 * not populated.
62862306a36Sopenharmony_ci	 */
62962306a36Sopenharmony_ci	if (nand_has_exec_op(chip))
63062306a36Sopenharmony_ci		return 0;
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci	/*
63362306a36Sopenharmony_ci	 * Default functions assigned for ->legacy.cmdfunc() and
63462306a36Sopenharmony_ci	 * ->legacy.select_chip() both expect ->legacy.cmd_ctrl() to be
63562306a36Sopenharmony_ci	 *  populated.
63662306a36Sopenharmony_ci	 */
63762306a36Sopenharmony_ci	if ((!chip->legacy.cmdfunc || !chip->legacy.select_chip) &&
63862306a36Sopenharmony_ci	    !chip->legacy.cmd_ctrl) {
63962306a36Sopenharmony_ci		pr_err("->legacy.cmd_ctrl() should be provided\n");
64062306a36Sopenharmony_ci		return -EINVAL;
64162306a36Sopenharmony_ci	}
64262306a36Sopenharmony_ci
64362306a36Sopenharmony_ci	return 0;
64462306a36Sopenharmony_ci}
645