]>
Commit | Line | Data |
---|---|---|
1da177e4 | 1 | |
61ecfa87 | 2 | /* |
1da177e4 | 3 | * struct flchip definition |
61ecfa87 TG |
4 | * |
5 | * Contains information about the location and state of a given flash device | |
1da177e4 LT |
6 | * |
7 | * (C) 2000 Red Hat. GPLd. | |
1da177e4 LT |
8 | */ |
9 | ||
10 | #ifndef __MTD_FLASHCHIP_H__ | |
11 | #define __MTD_FLASHCHIP_H__ | |
12 | ||
13 | /* For spinlocks. sched.h includes spinlock.h from whichever directory it | |
14 | * happens to be in - so we don't have to care whether we're on 2.2, which | |
61ecfa87 | 15 | * has asm/spinlock.h, or 2.4, which has linux/spinlock.h |
1da177e4 LT |
16 | */ |
17 | #include <linux/sched.h> | |
18 | ||
61ecfa87 | 19 | typedef enum { |
1da177e4 LT |
20 | FL_READY, |
21 | FL_STATUS, | |
22 | FL_CFI_QUERY, | |
23 | FL_JEDEC_QUERY, | |
24 | FL_ERASING, | |
25 | FL_ERASE_SUSPENDING, | |
26 | FL_ERASE_SUSPENDED, | |
27 | FL_WRITING, | |
28 | FL_WRITING_TO_BUFFER, | |
f77814dd | 29 | FL_OTP_WRITE, |
1da177e4 LT |
30 | FL_WRITE_SUSPENDING, |
31 | FL_WRITE_SUSPENDED, | |
32 | FL_PM_SUSPENDED, | |
33 | FL_SYNCING, | |
34 | FL_UNLOADING, | |
35 | FL_LOCKING, | |
36 | FL_UNLOCKING, | |
37 | FL_POINT, | |
38 | FL_XIP_WHILE_ERASING, | |
39 | FL_XIP_WHILE_WRITING, | |
c4a9f88d | 40 | FL_SHUTDOWN, |
1da177e4 LT |
41 | FL_UNKNOWN |
42 | } flstate_t; | |
43 | ||
44 | ||
45 | ||
61ecfa87 | 46 | /* NOTE: confusingly, this can be used to refer to more than one chip at a time, |
1da177e4 LT |
47 | if they're interleaved. This can even refer to individual partitions on |
48 | the same physical chip when present. */ | |
49 | ||
50 | struct flchip { | |
51 | unsigned long start; /* Offset within the map */ | |
52 | // unsigned long len; | |
53 | /* We omit len for now, because when we group them together | |
54 | we insist that they're all of the same size, and the chip size | |
55 | is held in the next level up. If we get more versatile later, | |
56 | it'll make it a damn sight harder to find which chip we want from | |
57 | a given offset, and we'll want to add the per-chip length field | |
58 | back in. | |
59 | */ | |
60 | int ref_point_counter; | |
61 | flstate_t state; | |
62 | flstate_t oldstate; | |
63 | ||
0514cd93 BD |
64 | unsigned int write_suspended:1; |
65 | unsigned int erase_suspended:1; | |
1da177e4 LT |
66 | unsigned long in_progress_block_addr; |
67 | ||
68 | spinlock_t *mutex; | |
69 | spinlock_t _spinlock; /* We do it like this because sometimes they'll be shared. */ | |
70 | wait_queue_head_t wq; /* Wait on here when we're waiting for the chip | |
71 | to be ready */ | |
72 | int word_write_time; | |
73 | int buffer_write_time; | |
74 | int erase_time; | |
75 | ||
e93cafe4 AG |
76 | int word_write_time_max; |
77 | int buffer_write_time_max; | |
78 | int erase_time_max; | |
79 | ||
1da177e4 LT |
80 | void *priv; |
81 | }; | |
82 | ||
83 | /* This is used to handle contention on write/erase operations | |
84 | between partitions of the same physical chip. */ | |
85 | struct flchip_shared { | |
86 | spinlock_t lock; | |
87 | struct flchip *writing; | |
88 | struct flchip *erasing; | |
89 | }; | |
90 | ||
91 | ||
92 | #endif /* __MTD_FLASHCHIP_H__ */ |