gigadevice.c 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2005, Intec Automation Inc.
  4. * Copyright (C) 2014, Freescale Semiconductor, Inc.
  5. */
  6. #include <linux/mtd/spi-nor.h>
  7. #include "core.h"
  8. static int
  9. gd25q256_post_bfpt(struct spi_nor *nor,
  10. const struct sfdp_parameter_header *bfpt_header,
  11. const struct sfdp_bfpt *bfpt)
  12. {
  13. /*
  14. * GD25Q256C supports the first version of JESD216 which does not define
  15. * the Quad Enable methods. Overwrite the default Quad Enable method.
  16. *
  17. * GD25Q256 GENERATION | SFDP MAJOR VERSION | SFDP MINOR VERSION
  18. * GD25Q256C | SFDP_JESD216_MAJOR | SFDP_JESD216_MINOR
  19. * GD25Q256D | SFDP_JESD216_MAJOR | SFDP_JESD216B_MINOR
  20. * GD25Q256E | SFDP_JESD216_MAJOR | SFDP_JESD216B_MINOR
  21. */
  22. if (bfpt_header->major == SFDP_JESD216_MAJOR &&
  23. bfpt_header->minor == SFDP_JESD216_MINOR)
  24. nor->params->quad_enable = spi_nor_sr1_bit6_quad_enable;
  25. return 0;
  26. }
  27. static const struct spi_nor_fixups gd25q256_fixups = {
  28. .post_bfpt = gd25q256_post_bfpt,
  29. };
  30. static const struct flash_info gigadevice_nor_parts[] = {
  31. { "gd25q16", INFO(0xc84015, 0, 64 * 1024, 32)
  32. FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
  33. NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
  34. SPI_NOR_QUAD_READ) },
  35. { "gd25q32", INFO(0xc84016, 0, 64 * 1024, 64)
  36. FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
  37. NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
  38. SPI_NOR_QUAD_READ) },
  39. { "gd25lq32", INFO(0xc86016, 0, 64 * 1024, 64)
  40. FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
  41. NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
  42. SPI_NOR_QUAD_READ) },
  43. { "gd25q64", INFO(0xc84017, 0, 64 * 1024, 128)
  44. FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
  45. NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
  46. SPI_NOR_QUAD_READ) },
  47. { "gd25lq64c", INFO(0xc86017, 0, 64 * 1024, 128)
  48. FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
  49. NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
  50. SPI_NOR_QUAD_READ) },
  51. { "gd25lq128d", INFO(0xc86018, 0, 64 * 1024, 256)
  52. FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
  53. NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
  54. SPI_NOR_QUAD_READ) },
  55. { "gd25q128", INFO(0xc84018, 0, 64 * 1024, 256)
  56. FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
  57. NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
  58. SPI_NOR_QUAD_READ) },
  59. { "gd25q256", INFO(0xc84019, 0, 64 * 1024, 512)
  60. PARSE_SFDP
  61. FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB | SPI_NOR_TB_SR_BIT6)
  62. FIXUP_FLAGS(SPI_NOR_4B_OPCODES)
  63. .fixups = &gd25q256_fixups },
  64. };
  65. const struct spi_nor_manufacturer spi_nor_gigadevice = {
  66. .name = "gigadevice",
  67. .parts = gigadevice_nor_parts,
  68. .nparts = ARRAY_SIZE(gigadevice_nor_parts),
  69. };