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

Commit 64b37b2a authored by Matthieu CASTET's avatar Matthieu CASTET Committed by Artem Bityutskiy
Browse files

mtd: nand: add NAND_BUSWIDTH_AUTO to autodetect bus width



The driver call nand_scan_ident in 8 bit mode, then
readid or onfi detection are done (and detect bus width).
The driver should update its bus width before calling nand_scan_tail.

This work because readid and onfi are read work 8 byte mode.

Note that nand_scan_ident send command (NAND_CMD_RESET, NAND_CMD_READID, NAND_CMD_PARAM), address and read data
The ONFI specificication is not very clear for x16 device if high byte of address should be driven to 0,
but according to [1] it should be ok to not drive it during autodetection.

[1]
3.3.2. Target Initialization

[...]
The Read ID and Read Parameter Page commands only use the lower 8-bits of the data bus.
The host shall not issue commands that use a word data width on x16 devices until the host
determines the device supports a 16-bit data bus width in the parameter page.

Signed-off-by: default avatarMatthieu CASTET <matthieu.castet@parrot.com>
Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
parent 2fd71a29
Loading
Loading
Loading
Loading
+9 −5
Original line number Original line Diff line number Diff line
@@ -3250,11 +3250,15 @@ ident_done:
			break;
			break;
	}
	}


	if (chip->options & NAND_BUSWIDTH_AUTO) {
		WARN_ON(chip->options & NAND_BUSWIDTH_16);
		chip->options |= busw;
		nand_set_defaults(chip, busw);
	} else if (busw != (chip->options & NAND_BUSWIDTH_16)) {
		/*
		/*
		 * Check, if buswidth is correct. Hardware drivers should set
		 * Check, if buswidth is correct. Hardware drivers should set
		 * chip correct!
		 * chip correct!
		 */
		 */
	if (busw != (chip->options & NAND_BUSWIDTH_16)) {
		pr_info("NAND device: Manufacturer ID:"
		pr_info("NAND device: Manufacturer ID:"
			" 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
			" 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
			*dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
			*dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
+7 −0
Original line number Original line Diff line number Diff line
@@ -219,6 +219,13 @@ typedef enum {
#define NAND_OWN_BUFFERS	0x00020000
#define NAND_OWN_BUFFERS	0x00020000
/* Chip may not exist, so silence any errors in scan */
/* Chip may not exist, so silence any errors in scan */
#define NAND_SCAN_SILENT_NODEV	0x00040000
#define NAND_SCAN_SILENT_NODEV	0x00040000
/*
 * Autodetect nand buswidth with readid/onfi.
 * This suppose the driver will configure the hardware in 8 bits mode
 * when calling nand_scan_ident, and update its configuration
 * before calling nand_scan_tail.
 */
#define NAND_BUSWIDTH_AUTO      0x00080000


/* Options set by nand scan */
/* Options set by nand scan */
/* Nand scan has allocated controller struct */
/* Nand scan has allocated controller struct */