Patrick Georgi | ac95903 | 2020-05-05 22:49:26 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 2 | |
Elyes HAOUAS | 361a935 | 2019-12-18 21:26:33 +0100 | [diff] [blame] | 3 | #include <commonlib/helpers.h> |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 4 | #include <spi_flash.h> |
Furquan Shaikh | c28984d | 2016-11-20 21:04:00 -0800 | [diff] [blame] | 5 | #include <spi-generic.h> |
Edward O'Callaghan | c4561e2 | 2014-06-26 15:02:40 +1000 | [diff] [blame] | 6 | |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 7 | #include "spi_flash_internal.h" |
| 8 | |
| 9 | /* MX25xx-specific commands */ |
| 10 | #define CMD_MX25XX_WREN 0x06 /* Write Enable */ |
| 11 | #define CMD_MX25XX_WRDI 0x04 /* Write Disable */ |
| 12 | #define CMD_MX25XX_RDSR 0x05 /* Read Status Register */ |
| 13 | #define CMD_MX25XX_WRSR 0x01 /* Write Status Register */ |
| 14 | #define CMD_MX25XX_READ 0x03 /* Read Data Bytes */ |
| 15 | #define CMD_MX25XX_FAST_READ 0x0b /* Read Data Bytes at Higher Speed */ |
| 16 | #define CMD_MX25XX_PP 0x02 /* Page Program */ |
| 17 | #define CMD_MX25XX_SE 0x20 /* Sector Erase */ |
| 18 | #define CMD_MX25XX_BE 0xD8 /* Block Erase */ |
| 19 | #define CMD_MX25XX_CE 0xc7 /* Chip Erase */ |
| 20 | #define CMD_MX25XX_DP 0xb9 /* Deep Power-down */ |
| 21 | #define CMD_MX25XX_RES 0xab /* Release from DP, and Read Signature */ |
| 22 | |
| 23 | #define MACRONIX_SR_WIP (1 << 0) /* Write-in-Progress */ |
| 24 | |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 25 | static const struct spi_flash_part_id flash_table[] = { |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 26 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 27 | /* MX25L8005 */ |
| 28 | .id[0] = 0x2014, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 29 | .nr_sectors_shift = 8, |
Arthur Heymans | e73a85c | 2018-06-13 00:20:31 +0200 | [diff] [blame] | 30 | }, |
| 31 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 32 | /* MX25L1605D */ |
| 33 | .id[0] = 0x2015, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 34 | .nr_sectors_shift = 9, |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 35 | }, |
| 36 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 37 | /* MX25L3205D */ |
| 38 | .id[0] = 0x2016, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 39 | .nr_sectors_shift = 10, |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 40 | }, |
| 41 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 42 | /* MX25L6405D */ |
| 43 | .id[0] = 0x2017, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 44 | .nr_sectors_shift = 11, |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 45 | }, |
| 46 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 47 | /* MX25L12805D */ |
| 48 | .id[0] = 0x2018, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 49 | .nr_sectors_shift = 12, |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 50 | }, |
| 51 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 52 | /* MX25L25635F */ |
| 53 | .id[0] = 0x2019, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 54 | .nr_sectors_shift = 13, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 55 | }, |
| 56 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 57 | /* MX66L51235F */ |
| 58 | .id[0] = 0x201a, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 59 | .nr_sectors_shift = 14, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 60 | }, |
| 61 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 62 | /* MX25L1635D */ |
| 63 | .id[0] = 0x2415, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 64 | .nr_sectors_shift = 9, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 65 | }, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 66 | /* |
| 67 | * NOTE: C225xx JEDEC IDs are basically useless because Macronix keeps |
| 68 | * reusing the same IDs for vastly different chips. 35E versions always |
| 69 | * seem to support Dual I/O but not Dual Output, while 35F versions seem |
| 70 | * to support both, so we only set Dual I/O here to improve our chances |
| 71 | * of compatibility. Since Macronix makes it impossible to search all |
| 72 | * different parts that it recklessly assigned the same IDs to, it's |
| 73 | * hard to know if there may be parts that don't even support Dual I/O |
| 74 | * with these IDs, though (or what we should do if there are). |
| 75 | */ |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 76 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 77 | /* MX25L1635E */ |
| 78 | .id[0] = 0x2515, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 79 | .nr_sectors_shift = 9, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 80 | .fast_read_dual_io_support = 1, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 81 | }, |
| 82 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 83 | /* MX25U8032E */ |
| 84 | .id[0] = 0x2534, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 85 | .nr_sectors_shift = 8, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 86 | .fast_read_dual_io_support = 1, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 87 | }, |
| 88 | { |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 89 | /* MX25U1635E/MX25U1635F */ |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 90 | .id[0] = 0x2535, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 91 | .nr_sectors_shift = 9, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 92 | .fast_read_dual_io_support = 1, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 93 | }, |
| 94 | { |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 95 | /* MX25U3235E/MX25U3235F */ |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 96 | .id[0] = 0x2536, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 97 | .nr_sectors_shift = 10, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 98 | .fast_read_dual_io_support = 1, |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 99 | }, |
Idwer Vollering | 06413ff | 2014-10-26 01:20:20 +0200 | [diff] [blame] | 100 | { |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 101 | /* MX25U6435E/MX25U6435F */ |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 102 | .id[0] = 0x2537, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 103 | .nr_sectors_shift = 11, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 104 | .fast_read_dual_io_support = 1, |
Idwer Vollering | 06413ff | 2014-10-26 01:20:20 +0200 | [diff] [blame] | 105 | }, |
| 106 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 107 | /* MX25U12835F */ |
| 108 | .id[0] = 0x2538, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 109 | .nr_sectors_shift = 12, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 110 | .fast_read_dual_io_support = 1, |
Kyösti Mälkki | 3f382c7 | 2014-11-11 15:01:31 +0200 | [diff] [blame] | 111 | }, |
| 112 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 113 | /* MX25U25635F */ |
| 114 | .id[0] = 0x2539, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 115 | .nr_sectors_shift = 13, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 116 | .fast_read_dual_io_support = 1, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 117 | }, |
| 118 | { |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 119 | /* MX25U51235F */ |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 120 | .id[0] = 0x253a, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 121 | .nr_sectors_shift = 14, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 122 | .fast_read_dual_io_support = 1, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 123 | }, |
| 124 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 125 | /* MX25L12855E */ |
| 126 | .id[0] = 0x2618, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 127 | .nr_sectors_shift = 12, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 128 | .fast_read_dual_io_support = 1, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 129 | }, |
| 130 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 131 | /* MX25L3235D/MX25L3225D/MX25L3236D/MX25L3237D */ |
| 132 | .id[0] = 0x5e16, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 133 | .nr_sectors_shift = 10, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 134 | .fast_read_dual_io_support = 1, |
Mike Banon | 4902a80 | 2019-01-12 13:55:09 +0300 | [diff] [blame] | 135 | }, |
| 136 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 137 | /* MX25L6495F */ |
| 138 | .id[0] = 0x9517, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 139 | .nr_sectors_shift = 11, |
Idwer Vollering | 06413ff | 2014-10-26 01:20:20 +0200 | [diff] [blame] | 140 | }, |
Ritul Guru | f3e4cec | 2022-11-08 16:59:03 +0530 | [diff] [blame] | 141 | { |
| 142 | /* MX77U25650F */ |
| 143 | .id[0] = 0x7539, |
| 144 | .nr_sectors_shift = 13, |
| 145 | }, |
Stefan Reinauer | 1c56d9b | 2012-05-10 11:27:32 -0700 | [diff] [blame] | 146 | }; |
| 147 | |
Aaron Durbin | 5abeb06 | 2020-01-12 15:12:18 -0700 | [diff] [blame] | 148 | const struct spi_flash_vendor_info spi_flash_macronix_vi = { |
| 149 | .id = VENDOR_ID_MACRONIX, |
| 150 | .page_size_shift = 8, |
| 151 | .sector_size_kib_shift = 2, |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 152 | .match_id_mask[0] = 0xffff, |
Aaron Durbin | 5abeb06 | 2020-01-12 15:12:18 -0700 | [diff] [blame] | 153 | .ids = flash_table, |
| 154 | .nr_part_ids = ARRAY_SIZE(flash_table), |
| 155 | .desc = &spi_flash_pp_0x20_sector_desc, |
Furquan Shaikh | e2fc5e2 | 2017-05-17 17:26:01 -0700 | [diff] [blame] | 156 | }; |