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