diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 10:25:43 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 10:25:43 -0400 |
commit | 05ec7dd8dd5aa42c22a49682e4a51cadd4166b7e (patch) | |
tree | 6370b43c0d8f324aa7421bbb5a647aa04ab5d747 /include/linux/mtd | |
parent | c316ba3b518bc35ce5aef5421135220389f4eb98 (diff) | |
parent | 8046112818b70329e930b1d4557ef0876c1ad2bb (diff) |
Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6: (154 commits)
mtd: cfi_cmdset_0002: use AMD standard command-set with Winbond flash chips
mtd: cfi_cmdset_0002: Fix MODULE_ALIAS and linkage for new 0701 commandset ID
mtd: mxc_nand: Remove duplicate NAND_CMD_RESET case value
mtd: update gfp/slab.h includes
jffs2: Stop triggering block erases from jffs2_write_super()
jffs2: Rename jffs2_erase_pending_trigger() to jffs2_dirty_trigger()
jffs2: Use jffs2_garbage_collect_trigger() to trigger pending erases
jffs2: Require jffs2_garbage_collect_trigger() to be called with lock held
jffs2: Wake GC thread when there are blocks to be erased
jffs2: Erase pending blocks in GC pass, avoid invalid -EIO return
jffs2: Add 'work_done' return value from jffs2_erase_pending_blocks()
mtd: mtdchar: Do not corrupt backing device of device node inode
mtd/maps/pcmciamtd: Fix printk format for ssize_t in debug messages
drivers/mtd: Use kmemdup
mtd: cfi_cmdset_0002: Fix argument order in bootloc warning
mtd: nand: add Toshiba TC58NVG0 device ID
pcmciamtd: add another ID
pcmciamtd: coding style cleanups
pcmciamtd: fixing obvious errors
mtd: chips: add SST39WF160x NOR-flashes
...
Trivial conflicts due to dev_node removal in drivers/mtd/maps/pcmciamtd.c
Diffstat (limited to 'include/linux/mtd')
-rw-r--r-- | include/linux/mtd/blktrans.h | 15 | ||||
-rw-r--r-- | include/linux/mtd/cfi.h | 30 | ||||
-rw-r--r-- | include/linux/mtd/flashchip.h | 4 | ||||
-rw-r--r-- | include/linux/mtd/map.h | 3 | ||||
-rw-r--r-- | include/linux/mtd/mtd.h | 8 | ||||
-rw-r--r-- | include/linux/mtd/mtdram.h | 2 | ||||
-rw-r--r-- | include/linux/mtd/nand.h | 25 | ||||
-rw-r--r-- | include/linux/mtd/onenand.h | 9 | ||||
-rw-r--r-- | include/linux/mtd/sh_flctl.h | 7 |
9 files changed, 77 insertions, 26 deletions
diff --git a/include/linux/mtd/blktrans.h b/include/linux/mtd/blktrans.h index 8b4aa0523db7..b481ccd7ff3c 100644 --- a/include/linux/mtd/blktrans.h +++ b/include/linux/mtd/blktrans.h | |||
@@ -9,6 +9,8 @@ | |||
9 | #define __MTD_TRANS_H__ | 9 | #define __MTD_TRANS_H__ |
10 | 10 | ||
11 | #include <linux/mutex.h> | 11 | #include <linux/mutex.h> |
12 | #include <linux/kref.h> | ||
13 | #include <linux/sysfs.h> | ||
12 | 14 | ||
13 | struct hd_geometry; | 15 | struct hd_geometry; |
14 | struct mtd_info; | 16 | struct mtd_info; |
@@ -24,11 +26,16 @@ struct mtd_blktrans_dev { | |||
24 | int devnum; | 26 | int devnum; |
25 | unsigned long size; | 27 | unsigned long size; |
26 | int readonly; | 28 | int readonly; |
27 | void *blkcore_priv; /* gendisk in 2.5, devfs_handle in 2.4 */ | 29 | int open; |
30 | struct kref ref; | ||
31 | struct gendisk *disk; | ||
32 | struct attribute_group *disk_attributes; | ||
33 | struct task_struct *thread; | ||
34 | struct request_queue *rq; | ||
35 | spinlock_t queue_lock; | ||
36 | void *priv; | ||
28 | }; | 37 | }; |
29 | 38 | ||
30 | struct blkcore_priv; /* Differs for 2.4 and 2.5 kernels; private */ | ||
31 | |||
32 | struct mtd_blktrans_ops { | 39 | struct mtd_blktrans_ops { |
33 | char *name; | 40 | char *name; |
34 | int major; | 41 | int major; |
@@ -60,8 +67,6 @@ struct mtd_blktrans_ops { | |||
60 | struct list_head devs; | 67 | struct list_head devs; |
61 | struct list_head list; | 68 | struct list_head list; |
62 | struct module *owner; | 69 | struct module *owner; |
63 | |||
64 | struct mtd_blkcore_priv *blkcore_priv; | ||
65 | }; | 70 | }; |
66 | 71 | ||
67 | extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr); | 72 | extern int register_mtd_blktrans(struct mtd_blktrans_ops *tr); |
diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h index df89f4275232..574d9ee066f1 100644 --- a/include/linux/mtd/cfi.h +++ b/include/linux/mtd/cfi.h | |||
@@ -253,6 +253,7 @@ struct cfi_bri_query { | |||
253 | #define P_ID_MITSUBISHI_STD 0x0100 | 253 | #define P_ID_MITSUBISHI_STD 0x0100 |
254 | #define P_ID_MITSUBISHI_EXT 0x0101 | 254 | #define P_ID_MITSUBISHI_EXT 0x0101 |
255 | #define P_ID_SST_PAGE 0x0102 | 255 | #define P_ID_SST_PAGE 0x0102 |
256 | #define P_ID_SST_OLD 0x0701 | ||
256 | #define P_ID_INTEL_PERFORMANCE 0x0200 | 257 | #define P_ID_INTEL_PERFORMANCE 0x0200 |
257 | #define P_ID_INTEL_DATA 0x0210 | 258 | #define P_ID_INTEL_DATA 0x0210 |
258 | #define P_ID_RESERVED 0xffff | 259 | #define P_ID_RESERVED 0xffff |
@@ -297,7 +298,7 @@ static inline uint32_t cfi_build_cmd_addr(uint32_t cmd_ofs, | |||
297 | * and 32bit devices on 16 bit busses | 298 | * and 32bit devices on 16 bit busses |
298 | * set the low bit of the alternating bit sequence of the address. | 299 | * set the low bit of the alternating bit sequence of the address. |
299 | */ | 300 | */ |
300 | if (((type * interleave) > bankwidth) && ((uint8_t)cmd_ofs == 0xaa)) | 301 | if (((type * interleave) > bankwidth) && ((cmd_ofs & 0xff) == 0xaa)) |
301 | addr |= (type >> 1)*interleave; | 302 | addr |= (type >> 1)*interleave; |
302 | 303 | ||
303 | return addr; | 304 | return addr; |
@@ -515,14 +516,25 @@ struct cfi_fixup { | |||
515 | void* param; | 516 | void* param; |
516 | }; | 517 | }; |
517 | 518 | ||
518 | #define CFI_MFR_ANY 0xffff | 519 | #define CFI_MFR_ANY 0xFFFF |
519 | #define CFI_ID_ANY 0xffff | 520 | #define CFI_ID_ANY 0xFFFF |
520 | 521 | #define CFI_MFR_CONTINUATION 0x007F | |
521 | #define CFI_MFR_AMD 0x0001 | 522 | |
522 | #define CFI_MFR_INTEL 0x0089 | 523 | #define CFI_MFR_AMD 0x0001 |
523 | #define CFI_MFR_ATMEL 0x001F | 524 | #define CFI_MFR_ATMEL 0x001F |
524 | #define CFI_MFR_SAMSUNG 0x00EC | 525 | #define CFI_MFR_EON 0x001C |
525 | #define CFI_MFR_ST 0x0020 /* STMicroelectronics */ | 526 | #define CFI_MFR_FUJITSU 0x0004 |
527 | #define CFI_MFR_HYUNDAI 0x00AD | ||
528 | #define CFI_MFR_INTEL 0x0089 | ||
529 | #define CFI_MFR_MACRONIX 0x00C2 | ||
530 | #define CFI_MFR_NEC 0x0010 | ||
531 | #define CFI_MFR_PMC 0x009D | ||
532 | #define CFI_MFR_SAMSUNG 0x00EC | ||
533 | #define CFI_MFR_SHARP 0x00B0 | ||
534 | #define CFI_MFR_SST 0x00BF | ||
535 | #define CFI_MFR_ST 0x0020 /* STMicroelectronics */ | ||
536 | #define CFI_MFR_TOSHIBA 0x0098 | ||
537 | #define CFI_MFR_WINBOND 0x00DA | ||
526 | 538 | ||
527 | void cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups); | 539 | void cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups); |
528 | 540 | ||
diff --git a/include/linux/mtd/flashchip.h b/include/linux/mtd/flashchip.h index d0bf422ae374..f43e9b49b751 100644 --- a/include/linux/mtd/flashchip.h +++ b/include/linux/mtd/flashchip.h | |||
@@ -15,6 +15,7 @@ | |||
15 | * has asm/spinlock.h, or 2.4, which has linux/spinlock.h | 15 | * has asm/spinlock.h, or 2.4, which has linux/spinlock.h |
16 | */ | 16 | */ |
17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | #include <linux/mutex.h> | ||
18 | 19 | ||
19 | typedef enum { | 20 | typedef enum { |
20 | FL_READY, | 21 | FL_READY, |
@@ -74,8 +75,7 @@ struct flchip { | |||
74 | unsigned int erase_suspended:1; | 75 | unsigned int erase_suspended:1; |
75 | unsigned long in_progress_block_addr; | 76 | unsigned long in_progress_block_addr; |
76 | 77 | ||
77 | spinlock_t *mutex; | 78 | struct mutex mutex; |
78 | spinlock_t _spinlock; /* We do it like this because sometimes they'll be shared. */ | ||
79 | wait_queue_head_t wq; /* Wait on here when we're waiting for the chip | 79 | wait_queue_head_t wq; /* Wait on here when we're waiting for the chip |
80 | to be ready */ | 80 | to be ready */ |
81 | int word_write_time; | 81 | int word_write_time; |
diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h index b981b8772217..de89eca864ce 100644 --- a/include/linux/mtd/map.h +++ b/include/linux/mtd/map.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
8 | #include <linux/list.h> | 8 | #include <linux/list.h> |
9 | #include <linux/string.h> | 9 | #include <linux/string.h> |
10 | #include <linux/bug.h> | ||
10 | 11 | ||
11 | #include <linux/mtd/compatmac.h> | 12 | #include <linux/mtd/compatmac.h> |
12 | 13 | ||
@@ -386,6 +387,8 @@ static inline map_word inline_map_read(struct map_info *map, unsigned long ofs) | |||
386 | #endif | 387 | #endif |
387 | else if (map_bankwidth_is_large(map)) | 388 | else if (map_bankwidth_is_large(map)) |
388 | memcpy_fromio(r.x, map->virt+ofs, map->bankwidth); | 389 | memcpy_fromio(r.x, map->virt+ofs, map->bankwidth); |
390 | else | ||
391 | BUG(); | ||
389 | 392 | ||
390 | return r; | 393 | return r; |
391 | } | 394 | } |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 0f32a9b6ff55..5326435a7571 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
@@ -20,7 +20,6 @@ | |||
20 | 20 | ||
21 | #define MTD_CHAR_MAJOR 90 | 21 | #define MTD_CHAR_MAJOR 90 |
22 | #define MTD_BLOCK_MAJOR 31 | 22 | #define MTD_BLOCK_MAJOR 31 |
23 | #define MAX_MTD_DEVICES 32 | ||
24 | 23 | ||
25 | #define MTD_ERASE_PENDING 0x01 | 24 | #define MTD_ERASE_PENDING 0x01 |
26 | #define MTD_ERASING 0x02 | 25 | #define MTD_ERASING 0x02 |
@@ -61,9 +60,7 @@ struct mtd_erase_region_info { | |||
61 | * MTD_OOB_PLACE: oob data are placed at the given offset | 60 | * MTD_OOB_PLACE: oob data are placed at the given offset |
62 | * MTD_OOB_AUTO: oob data are automatically placed at the free areas | 61 | * MTD_OOB_AUTO: oob data are automatically placed at the free areas |
63 | * which are defined by the ecclayout | 62 | * which are defined by the ecclayout |
64 | * MTD_OOB_RAW: mode to read raw data+oob in one chunk. The oob data | 63 | * MTD_OOB_RAW: mode to read oob and data without doing ECC checking |
65 | * is inserted into the data. Thats a raw image of the | ||
66 | * flash contents. | ||
67 | */ | 64 | */ |
68 | typedef enum { | 65 | typedef enum { |
69 | MTD_OOB_PLACE, | 66 | MTD_OOB_PLACE, |
@@ -290,8 +287,9 @@ extern int add_mtd_device(struct mtd_info *mtd); | |||
290 | extern int del_mtd_device (struct mtd_info *mtd); | 287 | extern int del_mtd_device (struct mtd_info *mtd); |
291 | 288 | ||
292 | extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num); | 289 | extern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num); |
290 | extern int __get_mtd_device(struct mtd_info *mtd); | ||
291 | extern void __put_mtd_device(struct mtd_info *mtd); | ||
293 | extern struct mtd_info *get_mtd_device_nm(const char *name); | 292 | extern struct mtd_info *get_mtd_device_nm(const char *name); |
294 | |||
295 | extern void put_mtd_device(struct mtd_info *mtd); | 293 | extern void put_mtd_device(struct mtd_info *mtd); |
296 | 294 | ||
297 | 295 | ||
diff --git a/include/linux/mtd/mtdram.h b/include/linux/mtd/mtdram.h index 04fdc07b7353..68891313875d 100644 --- a/include/linux/mtd/mtdram.h +++ b/include/linux/mtd/mtdram.h | |||
@@ -3,6 +3,6 @@ | |||
3 | 3 | ||
4 | #include <linux/mtd/mtd.h> | 4 | #include <linux/mtd/mtd.h> |
5 | int mtdram_init_device(struct mtd_info *mtd, void *mapped_address, | 5 | int mtdram_init_device(struct mtd_info *mtd, void *mapped_address, |
6 | unsigned long size, char *name); | 6 | unsigned long size, char *name); |
7 | 7 | ||
8 | #endif /* __MTD_MTDRAM_H__ */ | 8 | #endif /* __MTD_MTDRAM_H__ */ |
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index ccab9dfc5217..a81b185e23a7 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
@@ -25,11 +25,13 @@ | |||
25 | #include <linux/mtd/bbm.h> | 25 | #include <linux/mtd/bbm.h> |
26 | 26 | ||
27 | struct mtd_info; | 27 | struct mtd_info; |
28 | struct nand_flash_dev; | ||
28 | /* Scan and identify a NAND device */ | 29 | /* Scan and identify a NAND device */ |
29 | extern int nand_scan (struct mtd_info *mtd, int max_chips); | 30 | extern int nand_scan (struct mtd_info *mtd, int max_chips); |
30 | /* Separate phases of nand_scan(), allowing board driver to intervene | 31 | /* Separate phases of nand_scan(), allowing board driver to intervene |
31 | * and override command or ECC setup according to flash type */ | 32 | * and override command or ECC setup according to flash type */ |
32 | extern int nand_scan_ident(struct mtd_info *mtd, int max_chips); | 33 | extern int nand_scan_ident(struct mtd_info *mtd, int max_chips, |
34 | struct nand_flash_dev *table); | ||
33 | extern int nand_scan_tail(struct mtd_info *mtd); | 35 | extern int nand_scan_tail(struct mtd_info *mtd); |
34 | 36 | ||
35 | /* Free resources held by the NAND device */ | 37 | /* Free resources held by the NAND device */ |
@@ -38,6 +40,12 @@ extern void nand_release (struct mtd_info *mtd); | |||
38 | /* Internal helper for board drivers which need to override command function */ | 40 | /* Internal helper for board drivers which need to override command function */ |
39 | extern void nand_wait_ready(struct mtd_info *mtd); | 41 | extern void nand_wait_ready(struct mtd_info *mtd); |
40 | 42 | ||
43 | /* locks all blockes present in the device */ | ||
44 | extern int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len); | ||
45 | |||
46 | /* unlocks specified locked blockes */ | ||
47 | extern int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len); | ||
48 | |||
41 | /* The maximum number of NAND chips in an array */ | 49 | /* The maximum number of NAND chips in an array */ |
42 | #define NAND_MAX_CHIPS 8 | 50 | #define NAND_MAX_CHIPS 8 |
43 | 51 | ||
@@ -45,7 +53,7 @@ extern void nand_wait_ready(struct mtd_info *mtd); | |||
45 | * is supported now. If you add a chip with bigger oobsize/page | 53 | * is supported now. If you add a chip with bigger oobsize/page |
46 | * adjust this accordingly. | 54 | * adjust this accordingly. |
47 | */ | 55 | */ |
48 | #define NAND_MAX_OOBSIZE 128 | 56 | #define NAND_MAX_OOBSIZE 256 |
49 | #define NAND_MAX_PAGESIZE 4096 | 57 | #define NAND_MAX_PAGESIZE 4096 |
50 | 58 | ||
51 | /* | 59 | /* |
@@ -82,6 +90,10 @@ extern void nand_wait_ready(struct mtd_info *mtd); | |||
82 | #define NAND_CMD_ERASE2 0xd0 | 90 | #define NAND_CMD_ERASE2 0xd0 |
83 | #define NAND_CMD_RESET 0xff | 91 | #define NAND_CMD_RESET 0xff |
84 | 92 | ||
93 | #define NAND_CMD_LOCK 0x2a | ||
94 | #define NAND_CMD_UNLOCK1 0x23 | ||
95 | #define NAND_CMD_UNLOCK2 0x24 | ||
96 | |||
85 | /* Extended commands for large page devices */ | 97 | /* Extended commands for large page devices */ |
86 | #define NAND_CMD_READSTART 0x30 | 98 | #define NAND_CMD_READSTART 0x30 |
87 | #define NAND_CMD_RNDOUTSTART 0xE0 | 99 | #define NAND_CMD_RNDOUTSTART 0xE0 |
@@ -169,6 +181,14 @@ typedef enum { | |||
169 | #define NAND_NO_READRDY 0x00000100 | 181 | #define NAND_NO_READRDY 0x00000100 |
170 | /* Chip does not allow subpage writes */ | 182 | /* Chip does not allow subpage writes */ |
171 | #define NAND_NO_SUBPAGE_WRITE 0x00000200 | 183 | #define NAND_NO_SUBPAGE_WRITE 0x00000200 |
184 | /* Chip stores bad block marker on the last page of the eraseblock */ | ||
185 | #define NAND_BB_LAST_PAGE 0x00000400 | ||
186 | |||
187 | /* Device is one of 'new' xD cards that expose fake nand command set */ | ||
188 | #define NAND_BROKEN_XD 0x00000400 | ||
189 | |||
190 | /* Device behaves just like nand, but is readonly */ | ||
191 | #define NAND_ROM 0x00000800 | ||
172 | 192 | ||
173 | /* Options valid for Samsung large page devices */ | 193 | /* Options valid for Samsung large page devices */ |
174 | #define NAND_SAMSUNG_LP_OPTIONS \ | 194 | #define NAND_SAMSUNG_LP_OPTIONS \ |
@@ -391,6 +411,7 @@ struct nand_chip { | |||
391 | int subpagesize; | 411 | int subpagesize; |
392 | uint8_t cellinfo; | 412 | uint8_t cellinfo; |
393 | int badblockpos; | 413 | int badblockpos; |
414 | int badblockbits; | ||
394 | 415 | ||
395 | flstate_t state; | 416 | flstate_t state; |
396 | 417 | ||
diff --git a/include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h index 5509eb06b326..c26ff86ad08a 100644 --- a/include/linux/mtd/onenand.h +++ b/include/linux/mtd/onenand.h | |||
@@ -125,6 +125,9 @@ struct onenand_chip { | |||
125 | flstate_t state; | 125 | flstate_t state; |
126 | unsigned char *page_buf; | 126 | unsigned char *page_buf; |
127 | unsigned char *oob_buf; | 127 | unsigned char *oob_buf; |
128 | #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE | ||
129 | unsigned char *verify_buf; | ||
130 | #endif | ||
128 | 131 | ||
129 | int subpagesize; | 132 | int subpagesize; |
130 | struct nand_ecclayout *ecclayout; | 133 | struct nand_ecclayout *ecclayout; |
@@ -175,10 +178,14 @@ struct onenand_chip { | |||
175 | #define ONENAND_HAS_CONT_LOCK (0x0001) | 178 | #define ONENAND_HAS_CONT_LOCK (0x0001) |
176 | #define ONENAND_HAS_UNLOCK_ALL (0x0002) | 179 | #define ONENAND_HAS_UNLOCK_ALL (0x0002) |
177 | #define ONENAND_HAS_2PLANE (0x0004) | 180 | #define ONENAND_HAS_2PLANE (0x0004) |
181 | #define ONENAND_HAS_4KB_PAGE (0x0008) | ||
178 | #define ONENAND_SKIP_UNLOCK_CHECK (0x0100) | 182 | #define ONENAND_SKIP_UNLOCK_CHECK (0x0100) |
179 | #define ONENAND_PAGEBUF_ALLOC (0x1000) | 183 | #define ONENAND_PAGEBUF_ALLOC (0x1000) |
180 | #define ONENAND_OOBBUF_ALLOC (0x2000) | 184 | #define ONENAND_OOBBUF_ALLOC (0x2000) |
181 | 185 | ||
186 | #define ONENAND_IS_4KB_PAGE(this) \ | ||
187 | (this->options & ONENAND_HAS_4KB_PAGE) | ||
188 | |||
182 | /* | 189 | /* |
183 | * OneNAND Flash Manufacturer ID Codes | 190 | * OneNAND Flash Manufacturer ID Codes |
184 | */ | 191 | */ |
@@ -205,6 +212,8 @@ struct mtd_partition; | |||
205 | 212 | ||
206 | struct onenand_platform_data { | 213 | struct onenand_platform_data { |
207 | void (*mmcontrol)(struct mtd_info *mtd, int sync_read); | 214 | void (*mmcontrol)(struct mtd_info *mtd, int sync_read); |
215 | int (*read_bufferram)(struct mtd_info *mtd, int area, | ||
216 | unsigned char *buffer, int offset, size_t count); | ||
208 | struct mtd_partition *parts; | 217 | struct mtd_partition *parts; |
209 | unsigned int nr_parts; | 218 | unsigned int nr_parts; |
210 | }; | 219 | }; |
diff --git a/include/linux/mtd/sh_flctl.h b/include/linux/mtd/sh_flctl.h index ab77609ec337..9cf4c4c79555 100644 --- a/include/linux/mtd/sh_flctl.h +++ b/include/linux/mtd/sh_flctl.h | |||
@@ -93,8 +93,6 @@ | |||
93 | #define INIT_FL4ECCRESULT_VAL 0x03FF03FF | 93 | #define INIT_FL4ECCRESULT_VAL 0x03FF03FF |
94 | #define LOOP_TIMEOUT_MAX 0x00010000 | 94 | #define LOOP_TIMEOUT_MAX 0x00010000 |
95 | 95 | ||
96 | #define mtd_to_flctl(mtd) container_of(mtd, struct sh_flctl, mtd) | ||
97 | |||
98 | struct sh_flctl { | 96 | struct sh_flctl { |
99 | struct mtd_info mtd; | 97 | struct mtd_info mtd; |
100 | struct nand_chip chip; | 98 | struct nand_chip chip; |
@@ -125,4 +123,9 @@ struct sh_flctl_platform_data { | |||
125 | unsigned has_hwecc:1; | 123 | unsigned has_hwecc:1; |
126 | }; | 124 | }; |
127 | 125 | ||
126 | static inline struct sh_flctl *mtd_to_flctl(struct mtd_info *mtdinfo) | ||
127 | { | ||
128 | return container_of(mtdinfo, struct sh_flctl, mtd); | ||
129 | } | ||
130 | |||
128 | #endif /* __SH_FLCTL_H__ */ | 131 | #endif /* __SH_FLCTL_H__ */ |