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