macronix.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2018 Macronix
  4. *
  5. * Author: Boris Brezillon <[email protected]>
  6. */
  7. #include <linux/device.h>
  8. #include <linux/kernel.h>
  9. #include <linux/mtd/spinand.h>
  10. #define SPINAND_MFR_MACRONIX 0xC2
  11. #define MACRONIX_ECCSR_MASK 0x0F
  12. static SPINAND_OP_VARIANTS(read_cache_variants,
  13. SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
  14. SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
  15. SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
  16. SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
  17. static SPINAND_OP_VARIANTS(write_cache_variants,
  18. SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
  19. SPINAND_PROG_LOAD(false, 0, NULL, 0));
  20. static SPINAND_OP_VARIANTS(update_cache_variants,
  21. SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
  22. SPINAND_PROG_LOAD(false, 0, NULL, 0));
  23. static int mx35lfxge4ab_ooblayout_ecc(struct mtd_info *mtd, int section,
  24. struct mtd_oob_region *region)
  25. {
  26. return -ERANGE;
  27. }
  28. static int mx35lfxge4ab_ooblayout_free(struct mtd_info *mtd, int section,
  29. struct mtd_oob_region *region)
  30. {
  31. if (section)
  32. return -ERANGE;
  33. region->offset = 2;
  34. region->length = mtd->oobsize - 2;
  35. return 0;
  36. }
  37. static const struct mtd_ooblayout_ops mx35lfxge4ab_ooblayout = {
  38. .ecc = mx35lfxge4ab_ooblayout_ecc,
  39. .free = mx35lfxge4ab_ooblayout_free,
  40. };
  41. static int mx35lf1ge4ab_get_eccsr(struct spinand_device *spinand, u8 *eccsr)
  42. {
  43. struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(0x7c, 1),
  44. SPI_MEM_OP_NO_ADDR,
  45. SPI_MEM_OP_DUMMY(1, 1),
  46. SPI_MEM_OP_DATA_IN(1, eccsr, 1));
  47. int ret = spi_mem_exec_op(spinand->spimem, &op);
  48. if (ret)
  49. return ret;
  50. *eccsr &= MACRONIX_ECCSR_MASK;
  51. return 0;
  52. }
  53. static int mx35lf1ge4ab_ecc_get_status(struct spinand_device *spinand,
  54. u8 status)
  55. {
  56. struct nand_device *nand = spinand_to_nand(spinand);
  57. u8 eccsr;
  58. switch (status & STATUS_ECC_MASK) {
  59. case STATUS_ECC_NO_BITFLIPS:
  60. return 0;
  61. case STATUS_ECC_UNCOR_ERROR:
  62. return -EBADMSG;
  63. case STATUS_ECC_HAS_BITFLIPS:
  64. /*
  65. * Let's try to retrieve the real maximum number of bitflips
  66. * in order to avoid forcing the wear-leveling layer to move
  67. * data around if it's not necessary.
  68. */
  69. if (mx35lf1ge4ab_get_eccsr(spinand, &eccsr))
  70. return nanddev_get_ecc_conf(nand)->strength;
  71. if (WARN_ON(eccsr > nanddev_get_ecc_conf(nand)->strength ||
  72. !eccsr))
  73. return nanddev_get_ecc_conf(nand)->strength;
  74. return eccsr;
  75. default:
  76. break;
  77. }
  78. return -EINVAL;
  79. }
  80. static const struct spinand_info macronix_spinand_table[] = {
  81. SPINAND_INFO("MX35LF1GE4AB",
  82. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x12),
  83. NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
  84. NAND_ECCREQ(4, 512),
  85. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  86. &write_cache_variants,
  87. &update_cache_variants),
  88. SPINAND_HAS_QE_BIT,
  89. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  90. mx35lf1ge4ab_ecc_get_status)),
  91. SPINAND_INFO("MX35LF2GE4AB",
  92. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x22),
  93. NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
  94. NAND_ECCREQ(4, 512),
  95. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  96. &write_cache_variants,
  97. &update_cache_variants),
  98. SPINAND_HAS_QE_BIT,
  99. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
  100. SPINAND_INFO("MX35LF2GE4AD",
  101. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x26),
  102. NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
  103. NAND_ECCREQ(8, 512),
  104. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  105. &write_cache_variants,
  106. &update_cache_variants),
  107. SPINAND_HAS_QE_BIT,
  108. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  109. mx35lf1ge4ab_ecc_get_status)),
  110. SPINAND_INFO("MX35LF4GE4AD",
  111. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x37),
  112. NAND_MEMORG(1, 4096, 128, 64, 2048, 40, 1, 1, 1),
  113. NAND_ECCREQ(8, 512),
  114. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  115. &write_cache_variants,
  116. &update_cache_variants),
  117. SPINAND_HAS_QE_BIT,
  118. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  119. mx35lf1ge4ab_ecc_get_status)),
  120. SPINAND_INFO("MX35LF1G24AD",
  121. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x14),
  122. NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
  123. NAND_ECCREQ(8, 512),
  124. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  125. &write_cache_variants,
  126. &update_cache_variants),
  127. SPINAND_HAS_QE_BIT,
  128. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
  129. SPINAND_INFO("MX35LF2G24AD",
  130. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x24),
  131. NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1),
  132. NAND_ECCREQ(8, 512),
  133. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  134. &write_cache_variants,
  135. &update_cache_variants),
  136. SPINAND_HAS_QE_BIT,
  137. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
  138. SPINAND_INFO("MX35LF4G24AD",
  139. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35),
  140. NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1),
  141. NAND_ECCREQ(8, 512),
  142. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  143. &write_cache_variants,
  144. &update_cache_variants),
  145. SPINAND_HAS_QE_BIT,
  146. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
  147. SPINAND_INFO("MX31LF1GE4BC",
  148. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x1e),
  149. NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
  150. NAND_ECCREQ(8, 512),
  151. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  152. &write_cache_variants,
  153. &update_cache_variants),
  154. SPINAND_HAS_QE_BIT,
  155. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  156. mx35lf1ge4ab_ecc_get_status)),
  157. SPINAND_INFO("MX31UF1GE4BC",
  158. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x9e),
  159. NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
  160. NAND_ECCREQ(8, 512),
  161. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  162. &write_cache_variants,
  163. &update_cache_variants),
  164. SPINAND_HAS_QE_BIT,
  165. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  166. mx35lf1ge4ab_ecc_get_status)),
  167. SPINAND_INFO("MX35LF2G14AC",
  168. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x20),
  169. NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
  170. NAND_ECCREQ(4, 512),
  171. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  172. &write_cache_variants,
  173. &update_cache_variants),
  174. SPINAND_HAS_QE_BIT,
  175. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  176. mx35lf1ge4ab_ecc_get_status)),
  177. SPINAND_INFO("MX35UF4G24AD",
  178. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb5),
  179. NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1),
  180. NAND_ECCREQ(8, 512),
  181. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  182. &write_cache_variants,
  183. &update_cache_variants),
  184. SPINAND_HAS_QE_BIT,
  185. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  186. mx35lf1ge4ab_ecc_get_status)),
  187. SPINAND_INFO("MX35UF4GE4AD",
  188. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb7),
  189. NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
  190. NAND_ECCREQ(8, 512),
  191. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  192. &write_cache_variants,
  193. &update_cache_variants),
  194. SPINAND_HAS_QE_BIT,
  195. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  196. mx35lf1ge4ab_ecc_get_status)),
  197. SPINAND_INFO("MX35UF2G14AC",
  198. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa0),
  199. NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
  200. NAND_ECCREQ(4, 512),
  201. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  202. &write_cache_variants,
  203. &update_cache_variants),
  204. SPINAND_HAS_QE_BIT,
  205. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  206. mx35lf1ge4ab_ecc_get_status)),
  207. SPINAND_INFO("MX35UF2G24AD",
  208. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa4),
  209. NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1),
  210. NAND_ECCREQ(8, 512),
  211. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  212. &write_cache_variants,
  213. &update_cache_variants),
  214. SPINAND_HAS_QE_BIT,
  215. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  216. mx35lf1ge4ab_ecc_get_status)),
  217. SPINAND_INFO("MX35UF2GE4AD",
  218. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa6),
  219. NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
  220. NAND_ECCREQ(8, 512),
  221. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  222. &write_cache_variants,
  223. &update_cache_variants),
  224. SPINAND_HAS_QE_BIT,
  225. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  226. mx35lf1ge4ab_ecc_get_status)),
  227. SPINAND_INFO("MX35UF2GE4AC",
  228. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa2),
  229. NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
  230. NAND_ECCREQ(4, 512),
  231. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  232. &write_cache_variants,
  233. &update_cache_variants),
  234. SPINAND_HAS_QE_BIT,
  235. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  236. mx35lf1ge4ab_ecc_get_status)),
  237. SPINAND_INFO("MX35UF1G14AC",
  238. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x90),
  239. NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
  240. NAND_ECCREQ(4, 512),
  241. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  242. &write_cache_variants,
  243. &update_cache_variants),
  244. SPINAND_HAS_QE_BIT,
  245. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  246. mx35lf1ge4ab_ecc_get_status)),
  247. SPINAND_INFO("MX35UF1G24AD",
  248. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x94),
  249. NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
  250. NAND_ECCREQ(8, 512),
  251. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  252. &write_cache_variants,
  253. &update_cache_variants),
  254. SPINAND_HAS_QE_BIT,
  255. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  256. mx35lf1ge4ab_ecc_get_status)),
  257. SPINAND_INFO("MX35UF1GE4AD",
  258. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x96),
  259. NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
  260. NAND_ECCREQ(8, 512),
  261. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  262. &write_cache_variants,
  263. &update_cache_variants),
  264. SPINAND_HAS_QE_BIT,
  265. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  266. mx35lf1ge4ab_ecc_get_status)),
  267. SPINAND_INFO("MX35UF1GE4AC",
  268. SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92),
  269. NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
  270. NAND_ECCREQ(4, 512),
  271. SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
  272. &write_cache_variants,
  273. &update_cache_variants),
  274. SPINAND_HAS_QE_BIT,
  275. SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
  276. mx35lf1ge4ab_ecc_get_status)),
  277. };
  278. static const struct spinand_manufacturer_ops macronix_spinand_manuf_ops = {
  279. };
  280. const struct spinand_manufacturer macronix_spinand_manufacturer = {
  281. .id = SPINAND_MFR_MACRONIX,
  282. .name = "Macronix",
  283. .chips = macronix_spinand_table,
  284. .nchips = ARRAY_SIZE(macronix_spinand_table),
  285. .ops = &macronix_spinand_manuf_ops,
  286. };