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