162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2005, Intec Automation Inc. 462306a36Sopenharmony_ci * Copyright (C) 2014, Freescale Semiconductor, Inc. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/mtd/spi-nor.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "core.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistatic int 1262306a36Sopenharmony_cigd25q256_post_bfpt(struct spi_nor *nor, 1362306a36Sopenharmony_ci const struct sfdp_parameter_header *bfpt_header, 1462306a36Sopenharmony_ci const struct sfdp_bfpt *bfpt) 1562306a36Sopenharmony_ci{ 1662306a36Sopenharmony_ci /* 1762306a36Sopenharmony_ci * GD25Q256C supports the first version of JESD216 which does not define 1862306a36Sopenharmony_ci * the Quad Enable methods. Overwrite the default Quad Enable method. 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * GD25Q256 GENERATION | SFDP MAJOR VERSION | SFDP MINOR VERSION 2162306a36Sopenharmony_ci * GD25Q256C | SFDP_JESD216_MAJOR | SFDP_JESD216_MINOR 2262306a36Sopenharmony_ci * GD25Q256D | SFDP_JESD216_MAJOR | SFDP_JESD216B_MINOR 2362306a36Sopenharmony_ci * GD25Q256E | SFDP_JESD216_MAJOR | SFDP_JESD216B_MINOR 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci if (bfpt_header->major == SFDP_JESD216_MAJOR && 2662306a36Sopenharmony_ci bfpt_header->minor == SFDP_JESD216_MINOR) 2762306a36Sopenharmony_ci nor->params->quad_enable = spi_nor_sr1_bit6_quad_enable; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci return 0; 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic const struct spi_nor_fixups gd25q256_fixups = { 3362306a36Sopenharmony_ci .post_bfpt = gd25q256_post_bfpt, 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic const struct flash_info gigadevice_nor_parts[] = { 3762306a36Sopenharmony_ci { "gd25q16", INFO(0xc84015, 0, 64 * 1024, 32) 3862306a36Sopenharmony_ci FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) 3962306a36Sopenharmony_ci NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | 4062306a36Sopenharmony_ci SPI_NOR_QUAD_READ) }, 4162306a36Sopenharmony_ci { "gd25q32", INFO(0xc84016, 0, 64 * 1024, 64) 4262306a36Sopenharmony_ci FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) 4362306a36Sopenharmony_ci NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | 4462306a36Sopenharmony_ci SPI_NOR_QUAD_READ) }, 4562306a36Sopenharmony_ci { "gd25lq32", INFO(0xc86016, 0, 64 * 1024, 64) 4662306a36Sopenharmony_ci FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) 4762306a36Sopenharmony_ci NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | 4862306a36Sopenharmony_ci SPI_NOR_QUAD_READ) }, 4962306a36Sopenharmony_ci { "gd25q64", INFO(0xc84017, 0, 64 * 1024, 128) 5062306a36Sopenharmony_ci FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) 5162306a36Sopenharmony_ci NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | 5262306a36Sopenharmony_ci SPI_NOR_QUAD_READ) }, 5362306a36Sopenharmony_ci { "gd25lq64c", INFO(0xc86017, 0, 64 * 1024, 128) 5462306a36Sopenharmony_ci FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) 5562306a36Sopenharmony_ci NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | 5662306a36Sopenharmony_ci SPI_NOR_QUAD_READ) }, 5762306a36Sopenharmony_ci { "gd25lq128d", INFO(0xc86018, 0, 64 * 1024, 256) 5862306a36Sopenharmony_ci FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) 5962306a36Sopenharmony_ci NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | 6062306a36Sopenharmony_ci SPI_NOR_QUAD_READ) }, 6162306a36Sopenharmony_ci { "gd25q128", INFO(0xc84018, 0, 64 * 1024, 256) 6262306a36Sopenharmony_ci FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) 6362306a36Sopenharmony_ci NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | 6462306a36Sopenharmony_ci SPI_NOR_QUAD_READ) }, 6562306a36Sopenharmony_ci { "gd25q256", INFO(0xc84019, 0, 64 * 1024, 512) 6662306a36Sopenharmony_ci PARSE_SFDP 6762306a36Sopenharmony_ci FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB | SPI_NOR_TB_SR_BIT6) 6862306a36Sopenharmony_ci FIXUP_FLAGS(SPI_NOR_4B_OPCODES) 6962306a36Sopenharmony_ci .fixups = &gd25q256_fixups }, 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciconst struct spi_nor_manufacturer spi_nor_gigadevice = { 7362306a36Sopenharmony_ci .name = "gigadevice", 7462306a36Sopenharmony_ci .parts = gigadevice_nor_parts, 7562306a36Sopenharmony_ci .nparts = ARRAY_SIZE(gigadevice_nor_parts), 7662306a36Sopenharmony_ci}; 77