spi-nor.h 8.7 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*
 * Copyright (C) 2014 Freescale Semiconductor, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

10 11 12
#ifndef __LINUX_MTD_SPI_NOR_H
#define __LINUX_MTD_SPI_NOR_H

13
#include <linux/bitops.h>
14
#include <linux/mtd/cfi.h>
15
#include <linux/mtd/mtd.h>
16 17 18 19 20 21 22 23

/*
 * Manufacturer IDs
 *
 * The first byte returned from the flash after sending opcode SPINOR_OP_RDID.
 * Sometimes these are the same as CFI IDs, but sometimes they aren't.
 */
#define SNOR_MFR_ATMEL		CFI_MFR_ATMEL
24
#define SNOR_MFR_GIGADEVICE	0xc8
25 26 27 28 29
#define SNOR_MFR_INTEL		CFI_MFR_INTEL
#define SNOR_MFR_MICRON		CFI_MFR_ST /* ST Micro <--> Micron */
#define SNOR_MFR_MACRONIX	CFI_MFR_MACRONIX
#define SNOR_MFR_SPANSION	CFI_MFR_AMD
#define SNOR_MFR_SST		CFI_MFR_SST
30
#define SNOR_MFR_WINBOND	0xef /* Also used by some Spansion */
31

32 33 34 35 36 37 38 39
/*
 * Note on opcode nomenclature: some opcodes have a format like
 * SPINOR_OP_FUNCTION{4,}_x_y_z. The numbers x, y, and z stand for the number
 * of I/O lines used for the opcode, address, and data (respectively). The
 * FUNCTION has an optional suffix of '4', to represent an opcode which
 * requires a 4-byte (32-bit) address.
 */

40
/* Flash opcodes. */
41 42 43
#define SPINOR_OP_WREN		0x06	/* Write enable */
#define SPINOR_OP_RDSR		0x05	/* Read status register */
#define SPINOR_OP_WRSR		0x01	/* Write status register 1 byte */
44 45
#define SPINOR_OP_READ		0x03	/* Read data bytes (low frequency) */
#define SPINOR_OP_READ_FAST	0x0b	/* Read data bytes (high frequency) */
46 47 48 49
#define SPINOR_OP_READ_1_1_2	0x3b	/* Read data bytes (Dual Output SPI) */
#define SPINOR_OP_READ_1_2_2	0xbb	/* Read data bytes (Dual I/O SPI) */
#define SPINOR_OP_READ_1_1_4	0x6b	/* Read data bytes (Quad Output SPI) */
#define SPINOR_OP_READ_1_4_4	0xeb	/* Read data bytes (Quad I/O SPI) */
50
#define SPINOR_OP_PP		0x02	/* Page program (up to 256 bytes) */
51 52
#define SPINOR_OP_PP_1_1_4	0x32	/* Quad page program */
#define SPINOR_OP_PP_1_4_4	0x38	/* Quad page program */
53 54 55 56 57 58 59
#define SPINOR_OP_BE_4K		0x20	/* Erase 4KiB block */
#define SPINOR_OP_BE_4K_PMC	0xd7	/* Erase 4KiB block on PMC chips */
#define SPINOR_OP_BE_32K	0x52	/* Erase 32KiB block */
#define SPINOR_OP_CHIP_ERASE	0xc7	/* Erase whole flash chip */
#define SPINOR_OP_SE		0xd8	/* Sector erase (usually 64KiB) */
#define SPINOR_OP_RDID		0x9f	/* Read JEDEC ID */
#define SPINOR_OP_RDCR		0x35	/* Read configuration register */
60
#define SPINOR_OP_RDFSR		0x70	/* Read flag status register */
61 62

/* 4-byte address opcodes - used on Spansion and some Macronix flashes. */
63 64 65 66 67 68
#define SPINOR_OP_READ_4B	0x13	/* Read data bytes (low frequency) */
#define SPINOR_OP_READ_FAST_4B	0x0c	/* Read data bytes (high frequency) */
#define SPINOR_OP_READ_1_1_2_4B	0x3c	/* Read data bytes (Dual Output SPI) */
#define SPINOR_OP_READ_1_2_2_4B	0xbc	/* Read data bytes (Dual I/O SPI) */
#define SPINOR_OP_READ_1_1_4_4B	0x6c	/* Read data bytes (Quad Output SPI) */
#define SPINOR_OP_READ_1_4_4_4B	0xec	/* Read data bytes (Quad I/O SPI) */
69
#define SPINOR_OP_PP_4B		0x12	/* Page program (up to 256 bytes) */
70 71 72 73
#define SPINOR_OP_PP_1_1_4_4B	0x34	/* Quad page program */
#define SPINOR_OP_PP_1_4_4_4B	0x3e	/* Quad page program */
#define SPINOR_OP_BE_4K_4B	0x21	/* Erase 4KiB block */
#define SPINOR_OP_BE_32K_4B	0x5c	/* Erase 32KiB block */
74
#define SPINOR_OP_SE_4B		0xdc	/* Sector erase (usually 64KiB) */
75 76

/* Used for SST flashes only. */
77 78 79
#define SPINOR_OP_BP		0x02	/* Byte program */
#define SPINOR_OP_WRDI		0x04	/* Write disable */
#define SPINOR_OP_AAI_WP	0xad	/* Auto address increment word program */
80

81 82 83 84 85 86 87 88 89
/* Used for S3AN flashes only */
#define SPINOR_OP_XSE		0x50	/* Sector erase */
#define SPINOR_OP_XPP		0x82	/* Page program */
#define SPINOR_OP_XRDSR		0xd7	/* Read status register */

#define XSR_PAGESIZE		BIT(0)	/* Page size in Po2 or Linear */
#define XSR_RDY			BIT(7)	/* Ready */


90
/* Used for Macronix and Winbond flashes. */
91 92
#define SPINOR_OP_EN4B		0xb7	/* Enter 4-byte mode */
#define SPINOR_OP_EX4B		0xe9	/* Exit 4-byte mode */
93 94

/* Used for Spansion flashes only. */
95
#define SPINOR_OP_BRWR		0x17	/* Bank register write */
96

97 98 99 100
/* Used for Micron flashes only. */
#define SPINOR_OP_RD_EVCR      0x65    /* Read EVCR register */
#define SPINOR_OP_WD_EVCR      0x61    /* Write EVCR register */

101
/* Status Register bits. */
102 103
#define SR_WIP			BIT(0)	/* Write in progress */
#define SR_WEL			BIT(1)	/* Write enable latch */
104
/* meaning of other SR_* bits may differ between vendors */
105 106 107
#define SR_BP0			BIT(2)	/* Block protect 0 */
#define SR_BP1			BIT(3)	/* Block protect 1 */
#define SR_BP2			BIT(4)	/* Block protect 2 */
108
#define SR_TB			BIT(5)	/* Top/Bottom protect */
109
#define SR_SRWD			BIT(7)	/* SR write protect */
110

111
#define SR_QUAD_EN_MX		BIT(6)	/* Macronix Quad I/O */
112

113
/* Enhanced Volatile Configuration Register bits */
114
#define EVCR_QUAD_EN_MICRON	BIT(7)	/* Micron Quad I/O */
115

116
/* Flag Status Register bits */
117
#define FSR_READY		BIT(7)
118

119
/* Configuration Register bits. */
120
#define CR_QUAD_EN_SPAN		BIT(1)	/* Spansion Quad I/O */
121

122 123 124 125 126 127 128
enum read_mode {
	SPI_NOR_NORMAL = 0,
	SPI_NOR_FAST,
	SPI_NOR_DUAL,
	SPI_NOR_QUAD,
};

129
#define SPI_NOR_MAX_CMD_SIZE	8
130 131 132 133 134 135 136 137
enum spi_nor_ops {
	SPI_NOR_OPS_READ = 0,
	SPI_NOR_OPS_WRITE,
	SPI_NOR_OPS_ERASE,
	SPI_NOR_OPS_LOCK,
	SPI_NOR_OPS_UNLOCK,
};

138 139
enum spi_nor_option_flags {
	SNOR_F_USE_FSR		= BIT(0),
140
	SNOR_F_HAS_SR_TB	= BIT(1),
141 142 143
	SNOR_F_NO_OP_CHIP_ERASE	= BIT(2),
	SNOR_F_S3AN_ADDR_DEFAULT = BIT(3),
	SNOR_F_READY_XSR_RDY	= BIT(4),
144 145
};

146 147 148 149 150 151 152 153 154 155 156 157 158
/**
 * struct spi_nor - Structure for defining a the SPI NOR layer
 * @mtd:		point to a mtd_info structure
 * @lock:		the lock for the read/write/erase/lock/unlock operations
 * @dev:		point to a spi device, or a spi nor controller device.
 * @page_size:		the page size of the SPI NOR
 * @addr_width:		number of address bytes
 * @erase_opcode:	the opcode for erasing a sector
 * @read_opcode:	the read opcode
 * @read_dummy:		the dummy needed by the read operation
 * @program_opcode:	the program opcode
 * @flash_read:		the mode of the read
 * @sst_write_second:	used by the SST write operation
159
 * @flags:		flag options for the current SPI-NOR (SNOR_F_*)
160 161 162 163 164 165 166 167 168 169
 * @cmd_buf:		used by the write_reg
 * @prepare:		[OPTIONAL] do some preparations for the
 *			read/write/erase/lock/unlock operations
 * @unprepare:		[OPTIONAL] do some post work after the
 *			read/write/erase/lock/unlock operations
 * @read_reg:		[DRIVER-SPECIFIC] read out the register
 * @write_reg:		[DRIVER-SPECIFIC] write data to the register
 * @read:		[DRIVER-SPECIFIC] read data from the SPI NOR
 * @write:		[DRIVER-SPECIFIC] write data to the SPI NOR
 * @erase:		[DRIVER-SPECIFIC] erase a sector of the SPI NOR
170 171
 *			at the offset @offs; if not provided by the driver,
 *			spi-nor will send the erase opcode via write_reg()
172 173
 * @flash_lock:		[FLASH-SPECIFIC] lock a region of the SPI NOR
 * @flash_unlock:	[FLASH-SPECIFIC] unlock a region of the SPI NOR
174 175
 * @flash_is_locked:	[FLASH-SPECIFIC] check if a region of the SPI NOR is
 *			completely locked
176 177 178
 * @priv:		the private data
 */
struct spi_nor {
179
	struct mtd_info		mtd;
180 181 182 183 184 185 186 187 188 189
	struct mutex		lock;
	struct device		*dev;
	u32			page_size;
	u8			addr_width;
	u8			erase_opcode;
	u8			read_opcode;
	u8			read_dummy;
	u8			program_opcode;
	enum read_mode		flash_read;
	bool			sst_write_second;
190
	u32			flags;
191 192 193 194 195
	u8			cmd_buf[SPI_NOR_MAX_CMD_SIZE];

	int (*prepare)(struct spi_nor *nor, enum spi_nor_ops ops);
	void (*unprepare)(struct spi_nor *nor, enum spi_nor_ops ops);
	int (*read_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
196
	int (*write_reg)(struct spi_nor *nor, u8 opcode, u8 *buf, int len);
197

198
	ssize_t (*read)(struct spi_nor *nor, loff_t from,
199
			size_t len, u_char *read_buf);
200
	ssize_t (*write)(struct spi_nor *nor, loff_t to,
201
			size_t len, const u_char *write_buf);
202 203
	int (*erase)(struct spi_nor *nor, loff_t offs);

204 205
	int (*flash_lock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
	int (*flash_unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
206
	int (*flash_is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len);
207

208 209
	void *priv;
};
210

211 212 213
static inline void spi_nor_set_flash_node(struct spi_nor *nor,
					  struct device_node *np)
{
B
Brian Norris 已提交
214
	mtd_set_of_node(&nor->mtd, np);
215 216 217 218
}

static inline struct device_node *spi_nor_get_flash_node(struct spi_nor *nor)
{
B
Brian Norris 已提交
219
	return mtd_get_of_node(&nor->mtd);
220 221
}

222 223 224
/**
 * spi_nor_scan() - scan the SPI NOR
 * @nor:	the spi_nor structure
225
 * @name:	the chip type name
226 227 228 229 230 231
 * @mode:	the read mode supported by the driver
 *
 * The drivers can use this fuction to scan the SPI NOR.
 * In the scanning, it will try to get all the necessary information to
 * fill the mtd_info{} and the spi_nor{}.
 *
232
 * The chip type name can be provided through the @name parameter.
233 234 235
 *
 * Return: 0 for success, others for failure.
 */
236
int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode);
237

238
#endif