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