
new chips supported:- MX25L1605D, MX25L3205D, MX25L6405D, MX25L12855E out of which MX25L6405D and MX25L12855E tested on Kirkwood platforms
Modified the Macronix flash support to use 2 bytes of device id instead of 1 This was required to support MX25L12855E
Done some indentation fixes
Signed-off-by: Piyush Shah spiyush@marvell.com Signed-off-by: Prafulla Wadaskar prafulla@marvell.com --- Change log:- v2: leading spaces removed for clean patch apply build error fixed tested for new added chip MX25L6405D
v3: updated contributors info ids combined to u16 ids list of defines removed, used values in the struct
v4: indentation fixes, line lengths brought below 78 chars alligned access fixed for idcode
drivers/mtd/spi/macronix.c | 83 +++++++++++++++++++++++++++++-------------- 1 files changed, 56 insertions(+), 27 deletions(-)
diff --git a/drivers/mtd/spi/macronix.c b/drivers/mtd/spi/macronix.c index 9464c84..64922b5 100644 --- a/drivers/mtd/spi/macronix.c +++ b/drivers/mtd/spi/macronix.c @@ -20,7 +20,7 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License @@ -47,20 +47,12 @@ #define CMD_MX25XX_BE 0xD8 /* Block Erase */ #define CMD_MX25XX_CE 0xc7 /* Chip Erase */ #define CMD_MX25XX_DP 0xb9 /* Deep Power-down */ -#define CMD_MX25XX_RES 0xab /* Release from DP, and Read Signature */ - -#define MXIC_ID_MX2516 0x15 -#define MXIC_ID_MX2520 0x12 -#define MXIC_ID_MX2532 0x16 -#define MXIC_ID_MX2540 0x13 -#define MXIC_ID_MX2564 0x17 -#define MXIC_ID_MX2580 0x14 -#define MXIC_ID_MX25128 0x18 +#define CMD_MX25XX_RES 0xab /* Release from DP, and Read Sign */
#define MACRONIX_SR_WIP (1 << 0) /* Write-in-Progress */
struct macronix_spi_flash_params { - u8 idcode1; + u16 idcode; u16 page_size; u16 pages_per_sector; u16 sectors_per_block; @@ -73,24 +65,57 @@ struct macronix_spi_flash { const struct macronix_spi_flash_params *params; };
-static inline struct macronix_spi_flash *to_macronix_spi_flash(struct spi_flash - *flash) +static inline struct macronix_spi_flash *to_macronix_spi_flash( + struct spi_flash *flash) { return container_of(flash, struct macronix_spi_flash, flash); }
static const struct macronix_spi_flash_params macronix_spi_flash_table[] = { { - .idcode1 = MXIC_ID_MX25128, + .idcode = 0x2015, + .page_size = 256, + .pages_per_sector = 16, + .sectors_per_block = 16, + .nr_blocks = 32, + .name = "MX25L1605D", + }, + { + .idcode = 0x2016, + .page_size = 256, + .pages_per_sector = 16, + .sectors_per_block = 16, + .nr_blocks = 64, + .name = "MX25L3205D", + }, + { + .idcode = 0x2017, + .page_size = 256, + .pages_per_sector = 16, + .sectors_per_block = 16, + .nr_blocks = 128, + .name = "MX25L6405D", + }, + { + .idcode = 0x2018, .page_size = 256, .pages_per_sector = 16, .sectors_per_block = 16, .nr_blocks = 256, .name = "MX25L12805D", }, + { + .idcode = 0x2618, + .page_size = 256, + .pages_per_sector = 16, + .sectors_per_block = 16, + .nr_blocks = 256, + .name = "MX25L12855E", + }, };
-static int macronix_wait_ready(struct spi_flash *flash, unsigned long timeout) +static int macronix_wait_ready(struct spi_flash *flash, + unsigned long timeout) { struct spi_slave *spi = flash->spi; unsigned long timebase; @@ -125,7 +150,7 @@ static int macronix_wait_ready(struct spi_flash *flash, unsigned long timeout) }
static int macronix_read_fast(struct spi_flash *flash, - u32 offset, size_t len, void *buf) + u32 offset, size_t len, void *buf) { struct macronix_spi_flash *mcx = to_macronix_spi_flash(flash); unsigned long page_addr; @@ -145,7 +170,7 @@ static int macronix_read_fast(struct spi_flash *flash, }
static int macronix_write(struct spi_flash *flash, - u32 offset, size_t len, const void *buf) + u32 offset, size_t len, const void *buf) { struct macronix_spi_flash *mcx = to_macronix_spi_flash(flash); unsigned long page_addr; @@ -176,8 +201,10 @@ static int macronix_write(struct spi_flash *flash, cmd[3] = byte_addr;
debug - ("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %d\n", - buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len); + ("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x }" + " chunk_len = %d\n", + buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], + chunk_len);
ret = spi_flash_cmd(flash->spi, CMD_MX25XX_WREN, NULL, 0); if (ret < 0) { @@ -186,7 +213,7 @@ static int macronix_write(struct spi_flash *flash, }
ret = spi_flash_cmd_write(flash->spi, cmd, 4, - buf + actual, chunk_len); + buf + actual, chunk_len); if (ret < 0) { debug("SF: Macronix Page Program failed\n"); break; @@ -203,7 +230,7 @@ static int macronix_write(struct spi_flash *flash, }
debug("SF: Macronix: Successfully programmed %u bytes @ 0x%x\n", - len, offset); + len, offset);
spi_release_bus(flash->spi); return ret; @@ -227,7 +254,7 @@ int macronix_erase(struct spi_flash *flash, u32 offset, size_t len) * mcx->params->sectors_per_block;
if (offset % sector_size || len % sector_size) { - debug("SF: Erase offset/length not multiple of sector size\n"); + debug("SF: Erase offset/len not multiple of sector size\n"); return -1; }
@@ -258,7 +285,8 @@ int macronix_erase(struct spi_flash *flash, u32 offset, size_t len) break; }
- ret = macronix_wait_ready(flash, SPI_FLASH_PAGE_ERASE_TIMEOUT); + ret = macronix_wait_ready(flash, + SPI_FLASH_PAGE_ERASE_TIMEOUT); if (ret < 0) { debug("SF: Macronix page erase timed out\n"); break; @@ -277,15 +305,16 @@ struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode) const struct macronix_spi_flash_params *params; struct macronix_spi_flash *mcx; unsigned int i; + u16 id = idcode[0] | idcode[1] << 8;
for (i = 0; i < ARRAY_SIZE(macronix_spi_flash_table); i++) { params = ¯onix_spi_flash_table[i]; - if (params->idcode1 == idcode[2]) + if (params->idcode == id) break; }
if (i == ARRAY_SIZE(macronix_spi_flash_table)) { - debug("SF: Unsupported Macronix ID %02x\n", idcode[1]); + debug("SF: Unsupported Macronix ID %04x\n", id); return NULL; }
@@ -303,10 +332,10 @@ struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode) mcx->flash.erase = macronix_erase; mcx->flash.read = macronix_read_fast; mcx->flash.size = params->page_size * params->pages_per_sector - * params->sectors_per_block * params->nr_blocks; + * params->sectors_per_block * params->nr_blocks;
printf("SF: Detected %s with page size %u, total %u bytes\n", - params->name, params->page_size, mcx->flash.size); + params->name, params->page_size, mcx->flash.size);
return &mcx->flash; }