xref: /rk3399_rockchip-uboot/include/linux/mtd/flashchip.h (revision 42817eb85de1d7dec399c75dbd133ea6b5351a72)
1*ff94bc40SHeiko Schocher /*
2*ff94bc40SHeiko Schocher  * Copyright © 2000      Red Hat UK Limited
3*ff94bc40SHeiko Schocher  * Copyright © 2000-2010 David Woodhouse <dwmw2@infradead.org>
4*ff94bc40SHeiko Schocher  *
5*ff94bc40SHeiko Schocher  * SPDX-License-Identifier:	GPL-2.0+
6*ff94bc40SHeiko Schocher  *
7*ff94bc40SHeiko Schocher  */
8*ff94bc40SHeiko Schocher 
9*ff94bc40SHeiko Schocher #ifndef __MTD_FLASHCHIP_H__
10*ff94bc40SHeiko Schocher #define __MTD_FLASHCHIP_H__
11*ff94bc40SHeiko Schocher 
12*ff94bc40SHeiko Schocher #ifndef __UBOOT__
13*ff94bc40SHeiko Schocher /* For spinlocks. sched.h includes spinlock.h from whichever directory it
14*ff94bc40SHeiko Schocher  * happens to be in - so we don't have to care whether we're on 2.2, which
15*ff94bc40SHeiko Schocher  * has asm/spinlock.h, or 2.4, which has linux/spinlock.h
16*ff94bc40SHeiko Schocher  */
17*ff94bc40SHeiko Schocher #include <linux/sched.h>
18*ff94bc40SHeiko Schocher #include <linux/mutex.h>
19*ff94bc40SHeiko Schocher #endif
20*ff94bc40SHeiko Schocher 
21*ff94bc40SHeiko Schocher typedef enum {
22*ff94bc40SHeiko Schocher 	FL_READY,
23*ff94bc40SHeiko Schocher 	FL_STATUS,
24*ff94bc40SHeiko Schocher 	FL_CFI_QUERY,
25*ff94bc40SHeiko Schocher 	FL_JEDEC_QUERY,
26*ff94bc40SHeiko Schocher 	FL_ERASING,
27*ff94bc40SHeiko Schocher 	FL_ERASE_SUSPENDING,
28*ff94bc40SHeiko Schocher 	FL_ERASE_SUSPENDED,
29*ff94bc40SHeiko Schocher 	FL_WRITING,
30*ff94bc40SHeiko Schocher 	FL_WRITING_TO_BUFFER,
31*ff94bc40SHeiko Schocher 	FL_OTP_WRITE,
32*ff94bc40SHeiko Schocher 	FL_WRITE_SUSPENDING,
33*ff94bc40SHeiko Schocher 	FL_WRITE_SUSPENDED,
34*ff94bc40SHeiko Schocher 	FL_PM_SUSPENDED,
35*ff94bc40SHeiko Schocher 	FL_SYNCING,
36*ff94bc40SHeiko Schocher 	FL_UNLOADING,
37*ff94bc40SHeiko Schocher 	FL_LOCKING,
38*ff94bc40SHeiko Schocher 	FL_UNLOCKING,
39*ff94bc40SHeiko Schocher 	FL_POINT,
40*ff94bc40SHeiko Schocher 	FL_XIP_WHILE_ERASING,
41*ff94bc40SHeiko Schocher 	FL_XIP_WHILE_WRITING,
42*ff94bc40SHeiko Schocher 	FL_SHUTDOWN,
43*ff94bc40SHeiko Schocher 	/* These 2 come from nand_state_t, which has been unified here */
44*ff94bc40SHeiko Schocher 	FL_READING,
45*ff94bc40SHeiko Schocher 	FL_CACHEDPRG,
46*ff94bc40SHeiko Schocher 	/* These 4 come from onenand_state_t, which has been unified here */
47*ff94bc40SHeiko Schocher 	FL_RESETING,
48*ff94bc40SHeiko Schocher 	FL_OTPING,
49*ff94bc40SHeiko Schocher 	FL_PREPARING_ERASE,
50*ff94bc40SHeiko Schocher 	FL_VERIFYING_ERASE,
51*ff94bc40SHeiko Schocher 
52*ff94bc40SHeiko Schocher 	FL_UNKNOWN
53*ff94bc40SHeiko Schocher } flstate_t;
54*ff94bc40SHeiko Schocher 
55*ff94bc40SHeiko Schocher 
56*ff94bc40SHeiko Schocher 
57*ff94bc40SHeiko Schocher /* NOTE: confusingly, this can be used to refer to more than one chip at a time,
58*ff94bc40SHeiko Schocher    if they're interleaved.  This can even refer to individual partitions on
59*ff94bc40SHeiko Schocher    the same physical chip when present. */
60*ff94bc40SHeiko Schocher 
61*ff94bc40SHeiko Schocher struct flchip {
62*ff94bc40SHeiko Schocher 	unsigned long start; /* Offset within the map */
63*ff94bc40SHeiko Schocher 	//	unsigned long len;
64*ff94bc40SHeiko Schocher 	/* We omit len for now, because when we group them together
65*ff94bc40SHeiko Schocher 	   we insist that they're all of the same size, and the chip size
66*ff94bc40SHeiko Schocher 	   is held in the next level up. If we get more versatile later,
67*ff94bc40SHeiko Schocher 	   it'll make it a damn sight harder to find which chip we want from
68*ff94bc40SHeiko Schocher 	   a given offset, and we'll want to add the per-chip length field
69*ff94bc40SHeiko Schocher 	   back in.
70*ff94bc40SHeiko Schocher 	*/
71*ff94bc40SHeiko Schocher 	int ref_point_counter;
72*ff94bc40SHeiko Schocher 	flstate_t state;
73*ff94bc40SHeiko Schocher 	flstate_t oldstate;
74*ff94bc40SHeiko Schocher 
75*ff94bc40SHeiko Schocher 	unsigned int write_suspended:1;
76*ff94bc40SHeiko Schocher 	unsigned int erase_suspended:1;
77*ff94bc40SHeiko Schocher 	unsigned long in_progress_block_addr;
78*ff94bc40SHeiko Schocher 
79*ff94bc40SHeiko Schocher 	struct mutex mutex;
80*ff94bc40SHeiko Schocher #ifndef __UBOOT__
81*ff94bc40SHeiko Schocher 	wait_queue_head_t wq; /* Wait on here when we're waiting for the chip
82*ff94bc40SHeiko Schocher 			     to be ready */
83*ff94bc40SHeiko Schocher #endif
84*ff94bc40SHeiko Schocher 	int word_write_time;
85*ff94bc40SHeiko Schocher 	int buffer_write_time;
86*ff94bc40SHeiko Schocher 	int erase_time;
87*ff94bc40SHeiko Schocher 
88*ff94bc40SHeiko Schocher 	int word_write_time_max;
89*ff94bc40SHeiko Schocher 	int buffer_write_time_max;
90*ff94bc40SHeiko Schocher 	int erase_time_max;
91*ff94bc40SHeiko Schocher 
92*ff94bc40SHeiko Schocher 	void *priv;
93*ff94bc40SHeiko Schocher };
94*ff94bc40SHeiko Schocher 
95*ff94bc40SHeiko Schocher /* This is used to handle contention on write/erase operations
96*ff94bc40SHeiko Schocher    between partitions of the same physical chip. */
97*ff94bc40SHeiko Schocher struct flchip_shared {
98*ff94bc40SHeiko Schocher 	struct mutex lock;
99*ff94bc40SHeiko Schocher 	struct flchip *writing;
100*ff94bc40SHeiko Schocher 	struct flchip *erasing;
101*ff94bc40SHeiko Schocher };
102*ff94bc40SHeiko Schocher 
103*ff94bc40SHeiko Schocher 
104*ff94bc40SHeiko Schocher #endif /* __MTD_FLASHCHIP_H__ */
105