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