summaryrefslogtreecommitdiff
path: root/src/drivers/spi/gigadevice.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/spi/gigadevice.c')
-rw-r--r--src/drivers/spi/gigadevice.c132
1 files changed, 46 insertions, 86 deletions
diff --git a/src/drivers/spi/gigadevice.c b/src/drivers/spi/gigadevice.c
index b78b83048e..010fb45e4a 100644
--- a/src/drivers/spi/gigadevice.c
+++ b/src/drivers/spi/gigadevice.c
@@ -34,133 +34,96 @@
#define CMD_GD25_DP 0xb9 /* Deep Power-down */
#define CMD_GD25_RES 0xab /* Release from DP, and Read Signature */
-struct gigadevice_spi_flash_params {
- uint16_t id;
- uint8_t dual_spi : 1;
- uint8_t _reserved_for_flags : 3;
- uint8_t l2_page_size_shift : 4;
- uint8_t pages_per_sector_shift : 4;
- uint8_t sectors_per_block_shift : 4;
- uint8_t nr_blocks_shift;
- const char name[10];
-};
-
-static const struct gigadevice_spi_flash_params gigadevice_spi_flash_table[] = {
+static const struct spi_flash_part_id flash_table[] = {
{
.id = 0x3114,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 4,
.name = "GD25T80",
+ .nr_sectors_shift = 8,
+ .sector_size_kib_shift = 2,
},
{
.id = 0x4014,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 4,
- .dual_spi = 1,
.name = "GD25Q80",
+ .nr_sectors_shift = 8,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
}, /* also GD25Q80B */
{
.id = 0x4015,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 5,
- .dual_spi = 1,
.name = "GD25Q16",
+ .nr_sectors_shift = 9,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
}, /* also GD25Q16B */
{
.id = 0x4016,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 6,
- .dual_spi = 1,
.name = "GD25Q32B",
+ .nr_sectors_shift = 10,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
}, /* also GD25Q32B */
{
.id = 0x4017,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 7,
- .dual_spi = 1,
.name = "GD25Q64",
+ .nr_sectors_shift = 11,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
}, /* also GD25Q64B, GD25B64C */
{
.id = 0x4018,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 8,
- .dual_spi = 1,
.name = "GD25Q128",
+ .nr_sectors_shift = 12,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
}, /* also GD25Q128B */
{
.id = 0x4214,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 4,
- .dual_spi = 1,
.name = "GD25VQ80C",
+ .nr_sectors_shift = 8,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
},
{
.id = 0x4215,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 5,
- .dual_spi = 1,
.name = "GD25VQ16C",
+ .nr_sectors_shift = 9,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
},
{
.id = 0x6014,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 4,
- .dual_spi = 1,
.name = "GD25LQ80",
+ .nr_sectors_shift = 8,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
},
{
.id = 0x6015,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 5,
- .dual_spi = 1,
.name = "GD25LQ16",
+ .nr_sectors_shift = 9,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
},
{
.id = 0x6016,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 6,
- .dual_spi = 1,
.name = "GD25LQ32",
+ .nr_sectors_shift = 10,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
},
{
.id = 0x6017,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 7,
- .dual_spi = 1,
.name = "GD25LQ64C",
+ .nr_sectors_shift = 11,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
}, /* also GD25LB64C */
{
.id = 0x6018,
- .l2_page_size_shift = 8,
- .pages_per_sector_shift = 4,
- .sectors_per_block_shift = 4,
- .nr_blocks_shift = 8,
- .dual_spi = 1,
.name = "GD25LQ128",
+ .nr_sectors_shift = 12,
+ .sector_size_kib_shift = 2,
+ .fast_read_dual_output_support = 1,
},
};
@@ -174,16 +137,16 @@ static const struct spi_flash_ops spi_flash_ops = {
int spi_flash_probe_gigadevice(const struct spi_slave *spi, u8 *idcode,
struct spi_flash *flash)
{
- const struct gigadevice_spi_flash_params *params;
+ const struct spi_flash_part_id *params;
unsigned int i;
- for (i = 0; i < ARRAY_SIZE(gigadevice_spi_flash_table); i++) {
- params = &gigadevice_spi_flash_table[i];
+ for (i = 0; i < ARRAY_SIZE(flash_table); i++) {
+ params = &flash_table[i];
if (params->id == ((idcode[1] << 8) | idcode[2]))
break;
}
- if (i == ARRAY_SIZE(gigadevice_spi_flash_table)) {
+ if (i == ARRAY_SIZE(flash_table)) {
printk(BIOS_WARNING,
"SF gigadevice.c: Unsupported ID %#02x%02x\n",
idcode[1], idcode[2]);
@@ -194,12 +157,9 @@ int spi_flash_probe_gigadevice(const struct spi_slave *spi, u8 *idcode,
flash->name = params->name;
/* Assuming power-of-two page size initially. */
- flash->page_size = 1 << params->l2_page_size_shift;
- flash->sector_size = flash->page_size *
- (1 << params->pages_per_sector_shift);
- flash->size = flash->sector_size *
- (1 << params->sectors_per_block_shift) *
- (1 << params->nr_blocks_shift);
+ flash->page_size = 256;
+ flash->sector_size = (1U << params->sector_size_kib_shift) * KiB;
+ flash->size = flash->sector_size * (1U << params->nr_sectors_shift);
flash->erase_cmd = CMD_GD25_SE;
flash->status_cmd = CMD_GD25_RDSR;
flash->pp_cmd = CMD_GD25_PP;