nand.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. * (C) Copyright 2005
  3. * 2N Telekomunikace, a.s. <www.2n.cz>
  4. * Ladislav Michl <michl@2n.cz>
  5. *
  6. * SPDX-License-Identifier: GPL-2.0
  7. */
  8. #ifndef _NAND_H_
  9. #define _NAND_H_
  10. #include <config.h>
  11. /*
  12. * All boards using a given driver must convert to self-init
  13. * at the same time, so do it here. When all drivers are
  14. * converted, this will go away.
  15. */
  16. #ifdef CONFIG_SPL_BUILD
  17. #if defined(CONFIG_NAND_FSL_ELBC) || defined(CONFIG_NAND_FSL_IFC)
  18. #define CONFIG_SYS_NAND_SELF_INIT
  19. #endif
  20. #else
  21. #if defined(CONFIG_NAND_FSL_ELBC) || defined(CONFIG_NAND_ATMEL)\
  22. || defined(CONFIG_NAND_FSL_IFC)
  23. #define CONFIG_SYS_NAND_SELF_INIT
  24. #endif
  25. #endif
  26. extern void nand_init(void);
  27. unsigned long nand_size(void);
  28. #include <linux/compat.h>
  29. #include <linux/mtd/mtd.h>
  30. #include <linux/mtd/rawnand.h>
  31. int nand_mtd_to_devnum(struct mtd_info *mtd);
  32. #ifdef CONFIG_SYS_NAND_SELF_INIT
  33. void board_nand_init(void);
  34. int nand_register(int devnum, struct mtd_info *mtd);
  35. #else
  36. extern int board_nand_init(struct nand_chip *nand);
  37. #endif
  38. extern int nand_curr_device;
  39. static inline int nand_read(struct mtd_info *info, loff_t ofs, size_t *len,
  40. u_char *buf)
  41. {
  42. return mtd_read(info, ofs, *len, (size_t *)len, buf);
  43. }
  44. static inline int nand_write(struct mtd_info *info, loff_t ofs, size_t *len,
  45. u_char *buf)
  46. {
  47. return mtd_write(info, ofs, *len, (size_t *)len, buf);
  48. }
  49. static inline int nand_block_isbad(struct mtd_info *info, loff_t ofs)
  50. {
  51. return mtd_block_isbad(info, ofs);
  52. }
  53. static inline int nand_erase(struct mtd_info *info, loff_t off, size_t size)
  54. {
  55. struct erase_info instr;
  56. instr.mtd = info;
  57. instr.addr = off;
  58. instr.len = size;
  59. instr.callback = 0;
  60. return mtd_erase(info, &instr);
  61. }
  62. /*****************************************************************************
  63. * declarations from nand_util.c
  64. ****************************************************************************/
  65. typedef struct mtd_oob_ops mtd_oob_ops_t;
  66. struct nand_erase_options {
  67. loff_t length; /* number of bytes to erase */
  68. loff_t offset; /* first address in NAND to erase */
  69. int quiet; /* don't display progress messages */
  70. int jffs2; /* if true: format for jffs2 usage
  71. * (write appropriate cleanmarker blocks) */
  72. int scrub; /* if true, really clean NAND by erasing
  73. * bad blocks (UNSAFE) */
  74. /* Don't include skipped bad blocks in size to be erased */
  75. int spread;
  76. /* maximum size that actual may be in order to not exceed the buf */
  77. loff_t lim;
  78. };
  79. typedef struct nand_erase_options nand_erase_options_t;
  80. int nand_read_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length,
  81. size_t *actual, loff_t lim, u_char *buffer);
  82. #define WITH_DROP_FFS (1 << 0) /* drop trailing all-0xff pages */
  83. #define WITH_WR_VERIFY (1 << 1) /* verify data was written correctly */
  84. int nand_write_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length,
  85. size_t *actual, loff_t lim, u_char *buffer, int flags);
  86. int nand_erase_opts(struct mtd_info *mtd,
  87. const nand_erase_options_t *opts);
  88. int nand_torture(struct mtd_info *mtd, loff_t offset);
  89. int nand_verify_page_oob(struct mtd_info *mtd, struct mtd_oob_ops *ops,
  90. loff_t ofs);
  91. int nand_verify(struct mtd_info *mtd, loff_t ofs, size_t len, u_char *buf);
  92. #define NAND_LOCK_STATUS_TIGHT 0x01
  93. #define NAND_LOCK_STATUS_UNLOCK 0x04
  94. int nand_lock(struct mtd_info *mtd, int tight);
  95. int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length,
  96. int allexcept);
  97. int nand_get_lock_status(struct mtd_info *mtd, loff_t offset);
  98. int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst);
  99. int nand_spl_read_block(int block, int offset, int len, void *dst);
  100. void nand_deselect(void);
  101. #ifdef CONFIG_SYS_NAND_SELECT_DEVICE
  102. void board_nand_select_device(struct nand_chip *nand, int chip);
  103. #endif
  104. __attribute__((noreturn)) void nand_boot(void);
  105. #ifdef CONFIG_ENV_OFFSET_OOB
  106. #define ENV_OOB_MARKER 0x30425645 /*"EVB0" in little-endian -- offset is stored
  107. as block number*/
  108. #define ENV_OOB_MARKER_OLD 0x30564e45 /*"ENV0" in little-endian -- offset is
  109. stored as byte number */
  110. #define ENV_OFFSET_SIZE 8
  111. int get_nand_env_oob(struct mtd_info *mtd, unsigned long *result);
  112. #endif
  113. int spl_nand_erase_one(int block, int page);
  114. /* platform specific init functions */
  115. void sunxi_nand_init(void);
  116. /*
  117. * get_nand_dev_by_index - Get the nand info based in index.
  118. *
  119. * @dev - index to the nand device.
  120. *
  121. * returns pointer to the nand device info structure or NULL on failure.
  122. */
  123. struct mtd_info *get_nand_dev_by_index(int dev);
  124. #endif /* _NAND_H_ */