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 32 #include <linux/compat.h> 33 #include <linux/mtd/mtd.h> 34 #include <linux/mtd/nand.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 extern struct mtd_info *nand_info[]; 47 48 static inline int nand_read(struct mtd_info *info, loff_t ofs, size_t *len, 49 u_char *buf) 50 { 51 return mtd_read(info, ofs, *len, (size_t *)len, buf); 52 } 53 54 static inline int nand_write(struct mtd_info *info, loff_t ofs, size_t *len, 55 u_char *buf) 56 { 57 return mtd_write(info, ofs, *len, (size_t *)len, buf); 58 } 59 60 static inline int nand_block_isbad(struct mtd_info *info, loff_t ofs) 61 { 62 return mtd_block_isbad(info, ofs); 63 } 64 65 static inline int nand_erase(struct mtd_info *info, loff_t off, size_t size) 66 { 67 struct erase_info instr; 68 69 instr.mtd = info; 70 instr.addr = off; 71 instr.len = size; 72 instr.callback = 0; 73 74 return mtd_erase(info, &instr); 75 } 76 77 78 /***************************************************************************** 79 * declarations from nand_util.c 80 ****************************************************************************/ 81 82 typedef struct mtd_oob_ops mtd_oob_ops_t; 83 84 struct nand_erase_options { 85 loff_t length; /* number of bytes to erase */ 86 loff_t offset; /* first address in NAND to erase */ 87 int quiet; /* don't display progress messages */ 88 int jffs2; /* if true: format for jffs2 usage 89 * (write appropriate cleanmarker blocks) */ 90 int scrub; /* if true, really clean NAND by erasing 91 * bad blocks (UNSAFE) */ 92 93 /* Don't include skipped bad blocks in size to be erased */ 94 int spread; 95 /* maximum size that actual may be in order to not exceed the buf */ 96 loff_t lim; 97 }; 98 99 typedef struct nand_erase_options nand_erase_options_t; 100 101 int nand_read_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length, 102 size_t *actual, loff_t lim, u_char *buffer); 103 104 #define WITH_DROP_FFS (1 << 0) /* drop trailing all-0xff pages */ 105 #define WITH_WR_VERIFY (1 << 1) /* verify data was written correctly */ 106 107 int nand_write_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length, 108 size_t *actual, loff_t lim, u_char *buffer, int flags); 109 int nand_erase_opts(struct mtd_info *mtd, 110 const nand_erase_options_t *opts); 111 int nand_torture(struct mtd_info *mtd, loff_t offset); 112 int nand_verify_page_oob(struct mtd_info *mtd, struct mtd_oob_ops *ops, 113 loff_t ofs); 114 int nand_verify(struct mtd_info *mtd, loff_t ofs, size_t len, u_char *buf); 115 116 #define NAND_LOCK_STATUS_TIGHT 0x01 117 #define NAND_LOCK_STATUS_UNLOCK 0x04 118 119 int nand_lock(struct mtd_info *mtd, int tight); 120 int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length, 121 int allexcept); 122 int nand_get_lock_status(struct mtd_info *mtd, loff_t offset); 123 124 int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst); 125 int nand_spl_read_block(int block, int offset, int len, void *dst); 126 void nand_deselect(void); 127 128 #ifdef CONFIG_SYS_NAND_SELECT_DEVICE 129 void board_nand_select_device(struct nand_chip *nand, int chip); 130 #endif 131 132 __attribute__((noreturn)) void nand_boot(void); 133 134 #endif 135 136 #ifdef CONFIG_ENV_OFFSET_OOB 137 #define ENV_OOB_MARKER 0x30425645 /*"EVB0" in little-endian -- offset is stored 138 as block number*/ 139 #define ENV_OOB_MARKER_OLD 0x30564e45 /*"ENV0" in little-endian -- offset is 140 stored as byte number */ 141 #define ENV_OFFSET_SIZE 8 142 int get_nand_env_oob(struct mtd_info *mtd, unsigned long *result); 143 #endif 144 int spl_nand_erase_one(int block, int page); 145 146 /* platform specific init functions */ 147 void sunxi_nand_init(void); 148