Patrick Georgi | ac95903 | 2020-05-05 22:49:26 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
Martin Roth | bceaf7f | 2012-09-07 15:02:35 -0600 | [diff] [blame] | 2 | |
Elyes HAOUAS | 361a935 | 2019-12-18 21:26:33 +0100 | [diff] [blame] | 3 | #include <commonlib/helpers.h> |
Martin Roth | bceaf7f | 2012-09-07 15:02:35 -0600 | [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 | |
Martin Roth | bceaf7f | 2012-09-07 15:02:35 -0600 | [diff] [blame] | 7 | #include "spi_flash_internal.h" |
| 8 | |
| 9 | /* GD25Pxx-specific commands */ |
| 10 | #define CMD_GD25_WREN 0x06 /* Write Enable */ |
| 11 | #define CMD_GD25_WRDI 0x04 /* Write Disable */ |
| 12 | #define CMD_GD25_RDSR 0x05 /* Read Status Register */ |
| 13 | #define CMD_GD25_WRSR 0x01 /* Write Status Register */ |
| 14 | #define CMD_GD25_READ 0x03 /* Read Data Bytes */ |
| 15 | #define CMD_GD25_FAST_READ 0x0b /* Read Data Bytes at Higher Speed */ |
| 16 | #define CMD_GD25_PP 0x02 /* Page Program */ |
| 17 | #define CMD_GD25_SE 0x20 /* Sector (4K) Erase */ |
| 18 | #define CMD_GD25_BE 0xd8 /* Block (64K) Erase */ |
| 19 | #define CMD_GD25_CE 0xc7 /* Chip Erase */ |
| 20 | #define CMD_GD25_DP 0xb9 /* Deep Power-down */ |
| 21 | #define CMD_GD25_RES 0xab /* Release from DP, and Read Signature */ |
| 22 | |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 23 | static const struct spi_flash_part_id flash_table[] = { |
Martin Roth | bceaf7f | 2012-09-07 15:02:35 -0600 | [diff] [blame] | 24 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 25 | /* GD25T80 */ |
| 26 | .id[0] = 0x3114, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 27 | .nr_sectors_shift = 8, |
Mike Banon | 2db6e68 | 2019-01-12 19:01:10 +0300 | [diff] [blame] | 28 | }, |
| 29 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 30 | /* GD25Q80 */ |
| 31 | .id[0] = 0x4014, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 32 | .nr_sectors_shift = 8, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 33 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 34 | .fast_read_dual_io_support = 1, |
Julius Werner | 381c35c | 2019-06-06 22:09:42 -0700 | [diff] [blame] | 35 | }, /* also GD25Q80B */ |
| 36 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 37 | /* GD25Q16 */ |
| 38 | .id[0] = 0x4015, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 39 | .nr_sectors_shift = 9, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 40 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 41 | .fast_read_dual_io_support = 1, |
Julius Werner | 381c35c | 2019-06-06 22:09:42 -0700 | [diff] [blame] | 42 | }, /* also GD25Q16B */ |
| 43 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 44 | /* GD25Q32B */ |
| 45 | .id[0] = 0x4016, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 46 | .nr_sectors_shift = 10, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 47 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 48 | .fast_read_dual_io_support = 1, |
Julius Werner | 381c35c | 2019-06-06 22:09:42 -0700 | [diff] [blame] | 49 | }, /* also GD25Q32B */ |
| 50 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 51 | /* GD25Q64 */ |
| 52 | .id[0] = 0x4017, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 53 | .nr_sectors_shift = 11, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 54 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 55 | .fast_read_dual_io_support = 1, |
Julius Werner | 381c35c | 2019-06-06 22:09:42 -0700 | [diff] [blame] | 56 | }, /* also GD25Q64B, GD25B64C */ |
| 57 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 58 | /* GD25Q128 */ |
| 59 | .id[0] = 0x4018, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 60 | .nr_sectors_shift = 12, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 61 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 62 | .fast_read_dual_io_support = 1, |
Julius Werner | 381c35c | 2019-06-06 22:09:42 -0700 | [diff] [blame] | 63 | }, /* also GD25Q128B */ |
| 64 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 65 | /* GD25VQ80C */ |
| 66 | .id[0] = 0x4214, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 67 | .nr_sectors_shift = 8, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 68 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 69 | .fast_read_dual_io_support = 1, |
Martin Roth | bceaf7f | 2012-09-07 15:02:35 -0600 | [diff] [blame] | 70 | }, |
| 71 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 72 | /* GD25VQ16C */ |
| 73 | .id[0] = 0x4215, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 74 | .nr_sectors_shift = 9, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 75 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 76 | .fast_read_dual_io_support = 1, |
Martin Roth | bceaf7f | 2012-09-07 15:02:35 -0600 | [diff] [blame] | 77 | }, |
| 78 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 79 | /* GD25LQ80 */ |
| 80 | .id[0] = 0x6014, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 81 | .nr_sectors_shift = 8, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 82 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 83 | .fast_read_dual_io_support = 1, |
Martin Roth | bceaf7f | 2012-09-07 15:02:35 -0600 | [diff] [blame] | 84 | }, |
| 85 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 86 | /* GD25LQ16 */ |
| 87 | .id[0] = 0x6015, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 88 | .nr_sectors_shift = 9, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 89 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 90 | .fast_read_dual_io_support = 1, |
Mike Banon | 2db6e68 | 2019-01-12 19:01:10 +0300 | [diff] [blame] | 91 | }, |
| 92 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 93 | /* GD25LQ32 */ |
| 94 | .id[0] = 0x6016, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 95 | .nr_sectors_shift = 10, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 96 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 97 | .fast_read_dual_io_support = 1, |
Mike Banon | 2db6e68 | 2019-01-12 19:01:10 +0300 | [diff] [blame] | 98 | }, |
| 99 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 100 | /* GD25LQ64C */ |
| 101 | .id[0] = 0x6017, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 102 | .nr_sectors_shift = 11, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 103 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 104 | .fast_read_dual_io_support = 1, |
Julius Werner | 381c35c | 2019-06-06 22:09:42 -0700 | [diff] [blame] | 105 | }, /* also GD25LB64C */ |
Mike Banon | 2db6e68 | 2019-01-12 19:01:10 +0300 | [diff] [blame] | 106 | { |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 107 | /* GD25LQ128 */ |
| 108 | .id[0] = 0x6018, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 109 | .nr_sectors_shift = 12, |
Aaron Durbin | a6c73c8 | 2020-01-11 23:18:51 -0700 | [diff] [blame] | 110 | .fast_read_dual_output_support = 1, |
Julius Werner | df50622 | 2021-07-13 15:57:29 -0700 | [diff] [blame] | 111 | .fast_read_dual_io_support = 1, |
Martin Roth | bceaf7f | 2012-09-07 15:02:35 -0600 | [diff] [blame] | 112 | }, |
Tyler Wang | d635376 | 2023-11-16 14:26:14 +0800 | [diff] [blame^] | 113 | { |
| 114 | /* GD25LQ255E */ |
| 115 | .id[0] = 0x6019, |
| 116 | .nr_sectors_shift = 13, |
| 117 | .fast_read_dual_output_support = 1, |
| 118 | .fast_read_dual_io_support = 1, |
| 119 | }, |
Martin Roth | bceaf7f | 2012-09-07 15:02:35 -0600 | [diff] [blame] | 120 | }; |
| 121 | |
Aaron Durbin | 5abeb06 | 2020-01-12 15:12:18 -0700 | [diff] [blame] | 122 | const struct spi_flash_vendor_info spi_flash_gigadevice_vi = { |
| 123 | .id = VENDOR_ID_GIGADEVICE, |
| 124 | .page_size_shift = 8, |
| 125 | .sector_size_kib_shift = 2, |
Aaron Durbin | fc7b953 | 2020-01-23 11:45:30 -0700 | [diff] [blame] | 126 | .match_id_mask[0] = 0xffff, |
Aaron Durbin | 5abeb06 | 2020-01-12 15:12:18 -0700 | [diff] [blame] | 127 | .ids = flash_table, |
| 128 | .nr_part_ids = ARRAY_SIZE(flash_table), |
| 129 | .desc = &spi_flash_pp_0x20_sector_desc, |
Furquan Shaikh | e2fc5e2 | 2017-05-17 17:26:01 -0700 | [diff] [blame] | 130 | }; |