| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 |  | 
| Thomas Gleixner | 61ecfa8 | 2005-11-07 11:15:31 +0000 | [diff] [blame] | 2 | /* | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 3 |  * struct flchip definition | 
| Thomas Gleixner | 61ecfa8 | 2005-11-07 11:15:31 +0000 | [diff] [blame] | 4 |  * | 
 | 5 |  * Contains information about the location and state of a given flash device | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 |  * | 
 | 7 |  * (C) 2000 Red Hat. GPLd. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | 
| Thomas Gleixner | 61ecfa8 | 2005-11-07 11:15:31 +0000 | [diff] [blame] | 15 |  * has asm/spinlock.h, or 2.4, which has linux/spinlock.h | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 16 |  */ | 
 | 17 | #include <linux/sched.h> | 
 | 18 |  | 
| Thomas Gleixner | 61ecfa8 | 2005-11-07 11:15:31 +0000 | [diff] [blame] | 19 | typedef enum { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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, | 
| Nicolas Pitre | f77814d | 2005-02-08 17:11:19 +0000 | [diff] [blame] | 29 | 	FL_OTP_WRITE, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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, | 
| Kevin Hao | c4a9f88 | 2007-10-02 13:56:04 -0700 | [diff] [blame] | 40 | 	FL_SHUTDOWN, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 41 | 	FL_UNKNOWN | 
 | 42 | } flstate_t; | 
 | 43 |  | 
 | 44 |  | 
 | 45 |  | 
| Thomas Gleixner | 61ecfa8 | 2005-11-07 11:15:31 +0000 | [diff] [blame] | 46 | /* NOTE: confusingly, this can be used to refer to more than one chip at a time, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Ben Dooks | 0514cd9 | 2005-03-14 18:27:18 +0000 | [diff] [blame] | 64 | 	unsigned int write_suspended:1; | 
 | 65 | 	unsigned int erase_suspended:1; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Anders Grafström | e93cafe | 2008-08-05 18:37:41 +0200 | [diff] [blame] | 76 | 	int word_write_time_max; | 
 | 77 | 	int buffer_write_time_max; | 
 | 78 | 	int erase_time_max; | 
 | 79 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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__ */ |