diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /include/linux/mtd/mtd.h |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'include/linux/mtd/mtd.h')
-rw-r--r-- | include/linux/mtd/mtd.h | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h new file mode 100644 index 000000000000..b3d134392b31 --- /dev/null +++ b/include/linux/mtd/mtd.h | |||
@@ -0,0 +1,226 @@ | |||
1 | /* | ||
2 | * $Id: mtd.h,v 1.56 2004/08/09 18:46:04 dmarlin Exp $ | ||
3 | * | ||
4 | * Copyright (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> et al. | ||
5 | * | ||
6 | * Released under GPL | ||
7 | */ | ||
8 | |||
9 | #ifndef __MTD_MTD_H__ | ||
10 | #define __MTD_MTD_H__ | ||
11 | |||
12 | #ifndef __KERNEL__ | ||
13 | #error This is a kernel header. Perhaps include mtd-user.h instead? | ||
14 | #endif | ||
15 | |||
16 | #include <linux/config.h> | ||
17 | #include <linux/version.h> | ||
18 | #include <linux/types.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/uio.h> | ||
21 | |||
22 | #include <linux/mtd/compatmac.h> | ||
23 | #include <mtd/mtd-abi.h> | ||
24 | |||
25 | #define MTD_CHAR_MAJOR 90 | ||
26 | #define MTD_BLOCK_MAJOR 31 | ||
27 | #define MAX_MTD_DEVICES 16 | ||
28 | |||
29 | #define MTD_ERASE_PENDING 0x01 | ||
30 | #define MTD_ERASING 0x02 | ||
31 | #define MTD_ERASE_SUSPEND 0x04 | ||
32 | #define MTD_ERASE_DONE 0x08 | ||
33 | #define MTD_ERASE_FAILED 0x10 | ||
34 | |||
35 | /* If the erase fails, fail_addr might indicate exactly which block failed. If | ||
36 | fail_addr = 0xffffffff, the failure was not at the device level or was not | ||
37 | specific to any particular block. */ | ||
38 | struct erase_info { | ||
39 | struct mtd_info *mtd; | ||
40 | u_int32_t addr; | ||
41 | u_int32_t len; | ||
42 | u_int32_t fail_addr; | ||
43 | u_long time; | ||
44 | u_long retries; | ||
45 | u_int dev; | ||
46 | u_int cell; | ||
47 | void (*callback) (struct erase_info *self); | ||
48 | u_long priv; | ||
49 | u_char state; | ||
50 | struct erase_info *next; | ||
51 | }; | ||
52 | |||
53 | struct mtd_erase_region_info { | ||
54 | u_int32_t offset; /* At which this region starts, from the beginning of the MTD */ | ||
55 | u_int32_t erasesize; /* For this region */ | ||
56 | u_int32_t numblocks; /* Number of blocks of erasesize in this region */ | ||
57 | }; | ||
58 | |||
59 | struct mtd_info { | ||
60 | u_char type; | ||
61 | u_int32_t flags; | ||
62 | u_int32_t size; // Total size of the MTD | ||
63 | |||
64 | /* "Major" erase size for the device. Naïve users may take this | ||
65 | * to be the only erase size available, or may use the more detailed | ||
66 | * information below if they desire | ||
67 | */ | ||
68 | u_int32_t erasesize; | ||
69 | |||
70 | u_int32_t oobblock; // Size of OOB blocks (e.g. 512) | ||
71 | u_int32_t oobsize; // Amount of OOB data per block (e.g. 16) | ||
72 | u_int32_t oobavail; // Number of bytes in OOB area available for fs | ||
73 | u_int32_t ecctype; | ||
74 | u_int32_t eccsize; | ||
75 | |||
76 | |||
77 | // Kernel-only stuff starts here. | ||
78 | char *name; | ||
79 | int index; | ||
80 | |||
81 | // oobinfo is a nand_oobinfo structure, which can be set by iotcl (MEMSETOOBINFO) | ||
82 | struct nand_oobinfo oobinfo; | ||
83 | |||
84 | /* Data for variable erase regions. If numeraseregions is zero, | ||
85 | * it means that the whole device has erasesize as given above. | ||
86 | */ | ||
87 | int numeraseregions; | ||
88 | struct mtd_erase_region_info *eraseregions; | ||
89 | |||
90 | /* This really shouldn't be here. It can go away in 2.5 */ | ||
91 | u_int32_t bank_size; | ||
92 | |||
93 | int (*erase) (struct mtd_info *mtd, struct erase_info *instr); | ||
94 | |||
95 | /* This stuff for eXecute-In-Place */ | ||
96 | int (*point) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char **mtdbuf); | ||
97 | |||
98 | /* We probably shouldn't allow XIP if the unpoint isn't a NULL */ | ||
99 | void (*unpoint) (struct mtd_info *mtd, u_char * addr, loff_t from, size_t len); | ||
100 | |||
101 | |||
102 | int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); | ||
103 | int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); | ||
104 | |||
105 | int (*read_ecc) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf, u_char *eccbuf, struct nand_oobinfo *oobsel); | ||
106 | int (*write_ecc) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf, u_char *eccbuf, struct nand_oobinfo *oobsel); | ||
107 | |||
108 | int (*read_oob) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); | ||
109 | int (*write_oob) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); | ||
110 | |||
111 | /* | ||
112 | * Methods to access the protection register area, present in some | ||
113 | * flash devices. The user data is one time programmable but the | ||
114 | * factory data is read only. | ||
115 | */ | ||
116 | int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); | ||
117 | |||
118 | int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); | ||
119 | |||
120 | /* This function is not yet implemented */ | ||
121 | int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); | ||
122 | |||
123 | /* kvec-based read/write methods. We need these especially for NAND flash, | ||
124 | with its limited number of write cycles per erase. | ||
125 | NB: The 'count' parameter is the number of _vectors_, each of | ||
126 | which contains an (ofs, len) tuple. | ||
127 | */ | ||
128 | int (*readv) (struct mtd_info *mtd, struct kvec *vecs, unsigned long count, loff_t from, size_t *retlen); | ||
129 | int (*readv_ecc) (struct mtd_info *mtd, struct kvec *vecs, unsigned long count, loff_t from, | ||
130 | size_t *retlen, u_char *eccbuf, struct nand_oobinfo *oobsel); | ||
131 | int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen); | ||
132 | int (*writev_ecc) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, | ||
133 | size_t *retlen, u_char *eccbuf, struct nand_oobinfo *oobsel); | ||
134 | |||
135 | /* Sync */ | ||
136 | void (*sync) (struct mtd_info *mtd); | ||
137 | |||
138 | /* Chip-supported device locking */ | ||
139 | int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len); | ||
140 | int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len); | ||
141 | |||
142 | /* Power Management functions */ | ||
143 | int (*suspend) (struct mtd_info *mtd); | ||
144 | void (*resume) (struct mtd_info *mtd); | ||
145 | |||
146 | /* Bad block management functions */ | ||
147 | int (*block_isbad) (struct mtd_info *mtd, loff_t ofs); | ||
148 | int (*block_markbad) (struct mtd_info *mtd, loff_t ofs); | ||
149 | |||
150 | void *priv; | ||
151 | |||
152 | struct module *owner; | ||
153 | int usecount; | ||
154 | }; | ||
155 | |||
156 | |||
157 | /* Kernel-side ioctl definitions */ | ||
158 | |||
159 | extern int add_mtd_device(struct mtd_info *mtd); | ||
160 | extern int del_mtd_device (struct mtd_info *mtd); | ||
161 | |||
162 | extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num); | ||
163 | |||
164 | extern void put_mtd_device(struct mtd_info *mtd); | ||
165 | |||
166 | |||
167 | struct mtd_notifier { | ||
168 | void (*add)(struct mtd_info *mtd); | ||
169 | void (*remove)(struct mtd_info *mtd); | ||
170 | struct list_head list; | ||
171 | }; | ||
172 | |||
173 | |||
174 | extern void register_mtd_user (struct mtd_notifier *new); | ||
175 | extern int unregister_mtd_user (struct mtd_notifier *old); | ||
176 | |||
177 | int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, | ||
178 | unsigned long count, loff_t to, size_t *retlen); | ||
179 | |||
180 | int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs, | ||
181 | unsigned long count, loff_t from, size_t *retlen); | ||
182 | |||
183 | #define MTD_ERASE(mtd, args...) (*(mtd->erase))(mtd, args) | ||
184 | #define MTD_POINT(mtd, a,b,c,d) (*(mtd->point))(mtd, a,b,c, (u_char **)(d)) | ||
185 | #define MTD_UNPOINT(mtd, arg) (*(mtd->unpoint))(mtd, (u_char *)arg) | ||
186 | #define MTD_READ(mtd, args...) (*(mtd->read))(mtd, args) | ||
187 | #define MTD_WRITE(mtd, args...) (*(mtd->write))(mtd, args) | ||
188 | #define MTD_READV(mtd, args...) (*(mtd->readv))(mtd, args) | ||
189 | #define MTD_WRITEV(mtd, args...) (*(mtd->writev))(mtd, args) | ||
190 | #define MTD_READECC(mtd, args...) (*(mtd->read_ecc))(mtd, args) | ||
191 | #define MTD_WRITEECC(mtd, args...) (*(mtd->write_ecc))(mtd, args) | ||
192 | #define MTD_READOOB(mtd, args...) (*(mtd->read_oob))(mtd, args) | ||
193 | #define MTD_WRITEOOB(mtd, args...) (*(mtd->write_oob))(mtd, args) | ||
194 | #define MTD_SYNC(mtd) do { if (mtd->sync) (*(mtd->sync))(mtd); } while (0) | ||
195 | |||
196 | |||
197 | #ifdef CONFIG_MTD_PARTITIONS | ||
198 | void mtd_erase_callback(struct erase_info *instr); | ||
199 | #else | ||
200 | static inline void mtd_erase_callback(struct erase_info *instr) | ||
201 | { | ||
202 | if (instr->callback) | ||
203 | instr->callback(instr); | ||
204 | } | ||
205 | #endif | ||
206 | |||
207 | /* | ||
208 | * Debugging macro and defines | ||
209 | */ | ||
210 | #define MTD_DEBUG_LEVEL0 (0) /* Quiet */ | ||
211 | #define MTD_DEBUG_LEVEL1 (1) /* Audible */ | ||
212 | #define MTD_DEBUG_LEVEL2 (2) /* Loud */ | ||
213 | #define MTD_DEBUG_LEVEL3 (3) /* Noisy */ | ||
214 | |||
215 | #ifdef CONFIG_MTD_DEBUG | ||
216 | #define DEBUG(n, args...) \ | ||
217 | do { \ | ||
218 | if (n <= CONFIG_MTD_DEBUG_VERBOSE) \ | ||
219 | printk(KERN_INFO args); \ | ||
220 | } while(0) | ||
221 | #else /* CONFIG_MTD_DEBUG */ | ||
222 | #define DEBUG(n, args...) do { } while(0) | ||
223 | |||
224 | #endif /* CONFIG_MTD_DEBUG */ | ||
225 | |||
226 | #endif /* __MTD_MTD_H__ */ | ||