xref: /linux-6.15/include/linux/mtd/flashchip.h (revision 18af7e35)
1fd534e9bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
3a1452a37SDavid Woodhouse  * Copyright © 2000      Red Hat UK Limited
4a1452a37SDavid Woodhouse  * Copyright © 2000-2010 David Woodhouse <[email protected]>
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds 
71da177e4SLinus Torvalds #ifndef __MTD_FLASHCHIP_H__
81da177e4SLinus Torvalds #define __MTD_FLASHCHIP_H__
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds /* For spinlocks. sched.h includes spinlock.h from whichever directory it
111da177e4SLinus Torvalds  * happens to be in - so we don't have to care whether we're on 2.2, which
121da177e4SLinus Torvalds  * has asm/spinlock.h, or 2.4, which has linux/spinlock.h
131da177e4SLinus Torvalds  */
141da177e4SLinus Torvalds #include <linux/sched.h>
15c4e77376SStefani Seibold #include <linux/mutex.h>
16*18af7e35STudor Ambarus #include <linux/wait.h>
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds typedef enum {
191da177e4SLinus Torvalds 	FL_READY,
201da177e4SLinus Torvalds 	FL_STATUS,
211da177e4SLinus Torvalds 	FL_CFI_QUERY,
221da177e4SLinus Torvalds 	FL_JEDEC_QUERY,
231da177e4SLinus Torvalds 	FL_ERASING,
241da177e4SLinus Torvalds 	FL_ERASE_SUSPENDING,
251da177e4SLinus Torvalds 	FL_ERASE_SUSPENDED,
261da177e4SLinus Torvalds 	FL_WRITING,
271da177e4SLinus Torvalds 	FL_WRITING_TO_BUFFER,
28f77814ddSNicolas Pitre 	FL_OTP_WRITE,
291da177e4SLinus Torvalds 	FL_WRITE_SUSPENDING,
301da177e4SLinus Torvalds 	FL_WRITE_SUSPENDED,
311da177e4SLinus Torvalds 	FL_PM_SUSPENDED,
321da177e4SLinus Torvalds 	FL_SYNCING,
331da177e4SLinus Torvalds 	FL_UNLOADING,
341da177e4SLinus Torvalds 	FL_LOCKING,
351da177e4SLinus Torvalds 	FL_UNLOCKING,
361da177e4SLinus Torvalds 	FL_POINT,
371da177e4SLinus Torvalds 	FL_XIP_WHILE_ERASING,
381da177e4SLinus Torvalds 	FL_XIP_WHILE_WRITING,
39c4a9f88dSKevin Hao 	FL_SHUTDOWN,
4030631cb8SAlessandro Rubini 	/* These 2 come from nand_state_t, which has been unified here */
4130631cb8SAlessandro Rubini 	FL_READING,
4230631cb8SAlessandro Rubini 	FL_CACHEDPRG,
4372073027SMika Korhonen 	/* These 4 come from onenand_state_t, which has been unified here */
4444f45994SAmir Mahdi Ghorbanian 	FL_RESETTING,
4530631cb8SAlessandro Rubini 	FL_OTPING,
4672073027SMika Korhonen 	FL_PREPARING_ERASE,
4772073027SMika Korhonen 	FL_VERIFYING_ERASE,
4830631cb8SAlessandro Rubini 
491da177e4SLinus Torvalds 	FL_UNKNOWN
501da177e4SLinus Torvalds } flstate_t;
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds /* NOTE: confusingly, this can be used to refer to more than one chip at a time,
551da177e4SLinus Torvalds    if they're interleaved.  This can even refer to individual partitions on
561da177e4SLinus Torvalds    the same physical chip when present. */
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds struct flchip {
591da177e4SLinus Torvalds 	unsigned long start; /* Offset within the map */
601da177e4SLinus Torvalds 	//	unsigned long len;
611da177e4SLinus Torvalds 	/* We omit len for now, because when we group them together
621da177e4SLinus Torvalds 	   we insist that they're all of the same size, and the chip size
631da177e4SLinus Torvalds 	   is held in the next level up. If we get more versatile later,
641da177e4SLinus Torvalds 	   it'll make it a damn sight harder to find which chip we want from
651da177e4SLinus Torvalds 	   a given offset, and we'll want to add the per-chip length field
661da177e4SLinus Torvalds 	   back in.
671da177e4SLinus Torvalds 	*/
681da177e4SLinus Torvalds 	int ref_point_counter;
691da177e4SLinus Torvalds 	flstate_t state;
701da177e4SLinus Torvalds 	flstate_t oldstate;
711da177e4SLinus Torvalds 
720514cd93SBen Dooks 	unsigned int write_suspended:1;
730514cd93SBen Dooks 	unsigned int erase_suspended:1;
741da177e4SLinus Torvalds 	unsigned long in_progress_block_addr;
756510bbc8SJoakim Tjernlund 	unsigned long in_progress_block_mask;
761da177e4SLinus Torvalds 
77c4e77376SStefani Seibold 	struct mutex mutex;
781da177e4SLinus Torvalds 	wait_queue_head_t wq; /* Wait on here when we're waiting for the chip
791da177e4SLinus Torvalds 			     to be ready */
801da177e4SLinus Torvalds 	int word_write_time;
811da177e4SLinus Torvalds 	int buffer_write_time;
821da177e4SLinus Torvalds 	int erase_time;
831da177e4SLinus Torvalds 
84e93cafe4SAnders Grafström 	int word_write_time_max;
85e93cafe4SAnders Grafström 	int buffer_write_time_max;
86e93cafe4SAnders Grafström 	int erase_time_max;
87e93cafe4SAnders Grafström 
881da177e4SLinus Torvalds 	void *priv;
891da177e4SLinus Torvalds };
901da177e4SLinus Torvalds 
911da177e4SLinus Torvalds /* This is used to handle contention on write/erase operations
921da177e4SLinus Torvalds    between partitions of the same physical chip. */
931da177e4SLinus Torvalds struct flchip_shared {
948ae66418SStefani Seibold 	struct mutex lock;
951da177e4SLinus Torvalds 	struct flchip *writing;
961da177e4SLinus Torvalds 	struct flchip *erasing;
971da177e4SLinus Torvalds };
981da177e4SLinus Torvalds 
991da177e4SLinus Torvalds 
1001da177e4SLinus Torvalds #endif /* __MTD_FLASHCHIP_H__ */
101