1 From e70ae7f7ed00ecdbfa45fac3f342f1130df5029b Mon Sep 17 00:00:00 2001
2 From: Yunhui Cui <yunhui.cui@nxp.com>
3 Date: Fri, 20 May 2016 16:37:34 +0800
4 Subject: [PATCH 36/93] driver: spi: add exceed 16MB flash support
6 Signed-off-by: Yunhui Cui <yunhui.cui@nxp.com>
8 drivers/mtd/spi/spi_flash.c | 41 +++++++++++------------------------------
9 1 file changed, 11 insertions(+), 30 deletions(-)
11 diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
12 index 9d61ac0..e9d1c64 100644
13 --- a/drivers/mtd/spi/spi_flash.c
14 +++ b/drivers/mtd/spi/spi_flash.c
17 DECLARE_GLOBAL_DATA_PTR;
19 -static void spi_flash_addr(u32 addr, u8 *cmd, u32 offset_ext)
20 +static void spi_flash_addr(u32 addr, u8 *cmd)
22 - if (offset_ext >= SPI_FLASH_16MB_BOUN) {
23 + if (addr >= SPI_FLASH_16MB_BOUN) {
24 /* cmd[0] is actual command */
27 @@ -312,9 +312,7 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)
28 u32 erase_size, erase_addr;
33 - offset_ext = offset;
34 erase_size = flash->erase_size;
35 if (offset % erase_size || len % erase_size) {
36 debug("SF: Erase offset/length not multiple of erase size\n");
37 @@ -329,10 +327,7 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)
41 - if (offset > SPI_FLASH_16MB_BOUN)
42 - cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
44 - cmdsz = SPI_FLASH_CMD_LEN + flash->dummy_byte;
45 + cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
46 cmd = calloc(1, cmdsz);
48 debug("SF: Failed to allocate cmd\n");
49 @@ -353,7 +348,7 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)
53 - spi_flash_addr(erase_addr, cmd, offset_ext);
54 + spi_flash_addr(erase_addr, cmd);
56 debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
57 cmd[2], cmd[3], erase_addr);
58 @@ -380,9 +375,7 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
59 size_t chunk_len, actual;
64 - offset_ext = offset;
65 page_size = flash->page_size;
67 if (flash->flash_is_locked) {
68 @@ -393,10 +386,7 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
72 - if (offset > SPI_FLASH_16MB_BOUN)
73 - cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
75 - cmdsz = SPI_FLASH_CMD_LEN + flash->dummy_byte;
76 + cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
77 cmd = calloc(1, cmdsz);
79 debug("SF: Failed to allocate cmd\n");
80 @@ -423,7 +413,7 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
81 chunk_len = min(chunk_len,
82 (size_t)flash->spi->max_write_size);
84 - spi_flash_addr(write_addr, cmd, offset_ext);
85 + spi_flash_addr(write_addr, cmd);
87 debug("SF: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n",
88 buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len);
89 @@ -477,9 +467,6 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
90 u32 remain_len, read_len, read_addr;
95 - offset_ext = offset;
97 /* Handle memory-mapped SPI */
98 if (flash->memory_map) {
99 @@ -494,10 +481,8 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
100 spi_release_bus(flash->spi);
103 - if (offset > SPI_FLASH_16MB_BOUN)
104 - cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
106 - cmdsz = SPI_FLASH_CMD_LEN + flash->dummy_byte;
108 + cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
109 cmd = calloc(1, cmdsz);
111 debug("SF: Failed to allocate cmd\n");
112 @@ -508,7 +493,6 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
117 #ifdef CONFIG_SF_DUAL_FLASH
118 if (flash->dual_flash > SF_SINGLE_FLASH)
119 spi_flash_dual(flash, &read_addr);
120 @@ -519,18 +503,15 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
122 bank_sel = flash->bank_curr;
124 - if (offset_ext >= SPI_FLASH_16MB_BOUN) {
125 - remain_len = flash->size - offset;
127 - remain_len = ((SPI_FLASH_16MB_BOUN << flash->shift) *
128 + remain_len = ((flash->size << flash->shift) *
129 (bank_sel + 1)) - offset;
132 if (len < remain_len)
135 read_len = remain_len;
137 - spi_flash_addr(read_addr, cmd, offset_ext);
138 + spi_flash_addr(read_addr, cmd);
140 ret = spi_flash_read_common(flash, cmd, cmdsz, data, read_len);