Merge branch 'linus'
[powerpc.git] / include / linux / mtd / onenand.h
index b9a6411..7419b5f 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <linux/spinlock.h>
 #include <linux/mtd/onenand_regs.h>
+#include <linux/mtd/bbm.h>
 
 #define MAX_BUFFERRAM          2
 
@@ -34,6 +35,7 @@ typedef enum {
        FL_SYNCING,
        FL_UNLOCKING,
        FL_LOCKING,
+       FL_PM_SUSPENDED,
 } onenand_state_t;
 
 /**
@@ -67,16 +69,21 @@ struct onenand_bufferram {
  * @param wait         [REPLACEABLE] hardware specific function for wait on ready
  * @param read_bufferram       [REPLACEABLE] hardware specific function for BufferRAM Area
  * @param write_bufferram      [REPLACEABLE] hardware specific function for BufferRAM Area
+ * @param read_word    [REPLACEABLE] hardware specific function for read register of OneNAND
+ * @param write_word   [REPLACEABLE] hardware specific function for write register of OneNAND
+ * @param scan_bbt     [REPLACEALBE] hardware specific function for scaning Bad block Table
  * @param chip_lock    [INTERN] spinlock used to protect access to this structure and the chip
  * @param wq           [INTERN] wait queue to sleep on if a OneNAND operation is in progress
  * @param state                [INTERN] the current state of the OneNAND device
  * @param autooob      [REPLACEABLE] the default (auto)placement scheme
+ * @param bbm          [REPLACEABLE] pointer to Bad Block Management
  * @param priv         [OPTIONAL] pointer to private chip date
  */
 struct onenand_chip {
        void __iomem            *base;
        unsigned int            chipsize;
        unsigned int            device_id;
+       unsigned int            density_mask;
        unsigned int            options;
 
        unsigned int            erase_shift;
@@ -95,31 +102,44 @@ struct onenand_chip {
                        const unsigned char *buffer, int offset, size_t count);
        unsigned short (*read_word)(void __iomem *addr);
        void (*write_word)(unsigned short value, void __iomem *addr);
+       void (*mmcontrol)(struct mtd_info *mtd, int sync_read);
+       int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
+       int (*scan_bbt)(struct mtd_info *mtd);
 
        spinlock_t              chip_lock;
        wait_queue_head_t       wq;
        onenand_state_t         state;
+       unsigned char           *page_buf;
 
        struct nand_oobinfo     *autooob;
 
+       void                    *bbm;
+
        void                    *priv;
 };
 
+/*
+ * Helper macros
+ */
 #define ONENAND_CURRENT_BUFFERRAM(this)                (this->bufferram_index)
 #define ONENAND_NEXT_BUFFERRAM(this)           (this->bufferram_index ^ 1)
 #define ONENAND_SET_NEXT_BUFFERRAM(this)       (this->bufferram_index ^= 1)
 
+#define ONENAND_GET_SYS_CFG1(this)                                     \
+       (this->read_word(this->base + ONENAND_REG_SYS_CFG1))
+#define ONENAND_SET_SYS_CFG1(v, this)                                  \
+       (this->write_word(v, this->base + ONENAND_REG_SYS_CFG1))
+
 /*
  * Options bits
  */
 #define ONENAND_CONT_LOCK              (0x0001)
-
+#define ONENAND_PAGEBUF_ALLOC          (0x1000)
 
 /*
  * OneNAND Flash Manufacturer ID Codes
  */
 #define ONENAND_MFR_SAMSUNG    0xec
-#define ONENAND_MFR_UNKNOWN    0x00
 
 /**
  * struct nand_manufacturers - NAND Flash Manufacturer ID Structure