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