]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - include/linux/mtd/mtd.h
Merge branch 'master' of git://www.denx.de/git/u-boot-at91
[karo-tx-uboot.git] / include / linux / mtd / mtd.h
1 /*
2  * $Id: mtd.h,v 1.61 2005/11/07 11:14:54 gleixner 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 #include <linux/types.h>
13 #include <linux/mtd/mtd-abi.h>
14
15 #define MTD_CHAR_MAJOR 90
16 #define MTD_BLOCK_MAJOR 31
17 #define MAX_MTD_DEVICES 32
18
19 #define MTD_ERASE_PENDING       0x01
20 #define MTD_ERASING             0x02
21 #define MTD_ERASE_SUSPEND       0x04
22 #define MTD_ERASE_DONE          0x08
23 #define MTD_ERASE_FAILED        0x10
24
25 /* If the erase fails, fail_addr might indicate exactly which block failed.  If
26    fail_addr = 0xffffffff, the failure was not at the device level or was not
27    specific to any particular block. */
28 struct erase_info {
29         struct mtd_info *mtd;
30         u_int32_t addr;
31         u_int32_t len;
32         u_int32_t fail_addr;
33         u_long time;
34         u_long retries;
35         u_int dev;
36         u_int cell;
37         void (*callback) (struct erase_info *self);
38         u_long priv;
39         u_char state;
40         struct erase_info *next;
41 };
42
43 struct mtd_erase_region_info {
44         u_int32_t offset;                       /* At which this region starts, from the beginning of the MTD */
45         u_int32_t erasesize;            /* For this region */
46         u_int32_t numblocks;            /* Number of blocks of erasesize in this region */
47         unsigned long *lockmap;         /* If keeping bitmap of locks */
48 };
49
50 /*
51  * oob operation modes
52  *
53  * MTD_OOB_PLACE:       oob data are placed at the given offset
54  * MTD_OOB_AUTO:        oob data are automatically placed at the free areas
55  *                      which are defined by the ecclayout
56  * MTD_OOB_RAW:         mode to read raw data+oob in one chunk. The oob data
57  *                      is inserted into the data. Thats a raw image of the
58  *                      flash contents.
59  */
60 typedef enum {
61         MTD_OOB_PLACE,
62         MTD_OOB_AUTO,
63         MTD_OOB_RAW,
64 } mtd_oob_mode_t;
65
66 /**
67  * struct mtd_oob_ops - oob operation operands
68  * @mode:       operation mode
69  *
70  * @len:        number of data bytes to write/read
71  *
72  * @retlen:     number of data bytes written/read
73  *
74  * @ooblen:     number of oob bytes to write/read
75  * @oobretlen:  number of oob bytes written/read
76  * @ooboffs:    offset of oob data in the oob area (only relevant when
77  *              mode = MTD_OOB_PLACE)
78  * @datbuf:     data buffer - if NULL only oob data are read/written
79  * @oobbuf:     oob data buffer
80  *
81  * Note, it is allowed to read more then one OOB area at one go, but not write.
82  * The interface assumes that the OOB write requests program only one page's
83  * OOB area.
84  */
85 struct mtd_oob_ops {
86         mtd_oob_mode_t  mode;
87         size_t          len;
88         size_t          retlen;
89         size_t          ooblen;
90         size_t          oobretlen;
91         uint32_t        ooboffs;
92         uint8_t         *datbuf;
93         uint8_t         *oobbuf;
94 };
95
96 struct mtd_info {
97         u_char type;
98         u_int32_t flags;
99         u_int32_t size;  // Total size of the MTD
100
101         /* "Major" erase size for the device. Naïve users may take this
102          * to be the only erase size available, or may use the more detailed
103          * information below if they desire
104          */
105         u_int32_t erasesize;
106         /* Minimal writable flash unit size. In case of NOR flash it is 1 (even
107          * though individual bits can be cleared), in case of NAND flash it is
108          * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR
109          * it is of ECC block size, etc. It is illegal to have writesize = 0.
110          * Any driver registering a struct mtd_info must ensure a writesize of
111          * 1 or larger.
112          */
113         u_int32_t writesize;
114
115         u_int32_t oobsize;   // Amount of OOB data per block (e.g. 16)
116         u_int32_t oobavail;  // Available OOB bytes per block
117
118         // Kernel-only stuff starts here.
119         char *name;
120         int index;
121
122         /* ecc layout structure pointer - read only ! */
123         struct nand_ecclayout *ecclayout;
124
125         /* Data for variable erase regions. If numeraseregions is zero,
126          * it means that the whole device has erasesize as given above.
127          */
128         int numeraseregions;
129         struct mtd_erase_region_info *eraseregions;
130
131         int (*erase) (struct mtd_info *mtd, struct erase_info *instr);
132
133         /* This stuff for eXecute-In-Place */
134         int (*point) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char **mtdbuf);
135
136         /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
137         void (*unpoint) (struct mtd_info *mtd, u_char * addr, loff_t from, size_t len);
138
139
140         int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
141         int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
142
143         int (*read_oob) (struct mtd_info *mtd, loff_t from,
144                          struct mtd_oob_ops *ops);
145         int (*write_oob) (struct mtd_info *mtd, loff_t to,
146                          struct mtd_oob_ops *ops);
147
148         /*
149          * Methods to access the protection register area, present in some
150          * flash devices. The user data is one time programmable but the
151          * factory data is read only.
152          */
153         int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
154         int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
155         int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len);
156         int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
157         int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
158         int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len);
159
160 /* XXX U-BOOT XXX */
161 #if 0
162         /* kvec-based read/write methods.
163            NB: The 'count' parameter is the number of _vectors_, each of
164            which contains an (ofs, len) tuple.
165         */
166         int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);
167 #endif
168
169         /* Sync */
170         void (*sync) (struct mtd_info *mtd);
171
172         /* Chip-supported device locking */
173         int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len);
174         int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len);
175
176         /* Power Management functions */
177         int (*suspend) (struct mtd_info *mtd);
178         void (*resume) (struct mtd_info *mtd);
179
180         /* Bad block management functions */
181         int (*block_isbad) (struct mtd_info *mtd, loff_t ofs);
182         int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);
183
184 /* XXX U-BOOT XXX */
185 #if 0
186         struct notifier_block reboot_notifier;  /* default mode before reboot */
187 #endif
188
189         /* ECC status information */
190         struct mtd_ecc_stats ecc_stats;
191         /* Subpage shift (NAND) */
192         int subpage_sft;
193
194         void *priv;
195
196         struct module *owner;
197         int usecount;
198
199         /* If the driver is something smart, like UBI, it may need to maintain
200          * its own reference counting. The below functions are only for driver.
201          * The driver may register its callbacks. These callbacks are not
202          * supposed to be called by MTD users */
203         int (*get_device) (struct mtd_info *mtd);
204         void (*put_device) (struct mtd_info *mtd);
205 };
206
207
208         /* Kernel-side ioctl definitions */
209
210 extern int add_mtd_device(struct mtd_info *mtd);
211 extern int del_mtd_device (struct mtd_info *mtd);
212
213 extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num);
214 extern struct mtd_info *get_mtd_device_nm(const char *name);
215
216 extern void put_mtd_device(struct mtd_info *mtd);
217
218 /* XXX U-BOOT XXX */
219 #if 0
220 struct mtd_notifier {
221         void (*add)(struct mtd_info *mtd);
222         void (*remove)(struct mtd_info *mtd);
223         struct list_head list;
224 };
225
226 extern void register_mtd_user (struct mtd_notifier *new);
227 extern int unregister_mtd_user (struct mtd_notifier *old);
228
229 int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
230                        unsigned long count, loff_t to, size_t *retlen);
231
232 int default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs,
233                       unsigned long count, loff_t from, size_t *retlen);
234 #endif
235
236 #ifdef CONFIG_MTD_PARTITIONS
237 void mtd_erase_callback(struct erase_info *instr);
238 #else
239 static inline void mtd_erase_callback(struct erase_info *instr)
240 {
241         if (instr->callback)
242                 instr->callback(instr);
243 }
244 #endif
245
246 /*
247  * Debugging macro and defines
248  */
249 #define MTD_DEBUG_LEVEL0        (0)     /* Quiet   */
250 #define MTD_DEBUG_LEVEL1        (1)     /* Audible */
251 #define MTD_DEBUG_LEVEL2        (2)     /* Loud    */
252 #define MTD_DEBUG_LEVEL3        (3)     /* Noisy   */
253
254 #ifdef CONFIG_MTD_DEBUG
255 #define MTDDEBUG(n, args...)                            \
256         do {                                            \
257                 if (n <= CONFIG_MTD_DEBUG_VERBOSE)      \
258                         printk(KERN_INFO args);         \
259         } while(0)
260 #else /* CONFIG_MTD_DEBUG */
261 #define MTDDEBUG(n, args...) do { } while(0)
262 #endif /* CONFIG_MTD_DEBUG */
263
264 #endif /* __MTD_MTD_H__ */