]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - include/linux/mtd/onenand.h
upgrade to upstream version 2013.07
[karo-tx-uboot.git] / include / linux / mtd / onenand.h
index 4b0c2dfaaaa412305ae301ef93e7c9d0dd58277b..e7b63ddd107243d93d2955e4c0b2656957b8f9ae 100644 (file)
 /* Note: The header order is impoertant */
 #include <onenand_uboot.h>
 
+#include <linux/compat.h>
 #include <linux/mtd/bbm.h>
 
+#define MAX_DIES               2
 #define MAX_BUFFERRAM          2
-#define MAX_ONENAND_PAGESIZE   (2048 + 64)
+#define MAX_ONENAND_PAGESIZE   (4096 + 128)
 
 /* Scan and identify a OneNAND device */
 extern int onenand_scan (struct mtd_info *mtd, int max_chips);
 /* Free resources held by the OneNAND device */
 extern void onenand_release (struct mtd_info *mtd);
 
-/**
- * onenand_state_t - chip states
- * Enumeration for OneNAND flash chip state
- */
-typedef enum {
-       FL_READY,
-       FL_READING,
-       FL_WRITING,
-       FL_ERASING,
-       FL_SYNCING,
-       FL_UNLOCKING,
-       FL_LOCKING,
-} onenand_state_t;
-
 /**
  * struct onenand_bufferram - OneNAND BufferRAM Data
- * @param block                block address in BufferRAM
- * @param page         page address in BufferRAM
- * @param valid                valid flag
+ * @param blockpage    block & page address in BufferRAM
  */
 struct onenand_bufferram {
-       int block;
-       int page;
-       int valid;
+       int blockpage;
 };
 
 /**
  * struct onenand_chip - OneNAND Private Flash Chip Data
  * @param base         [BOARDSPECIFIC] address to access OneNAND
+ * @dies:               [INTERN][FLEXONENAND] number of dies on chip
+ * @boundary:           [INTERN][FLEXONENAND] Boundary of the dies
+ * @diesize:            [INTERN][FLEXONENAND] Size of the dies
  * @param chipsize     [INTERN] the size of one chip for multichip arrays
  * @param device_id    [INTERN] device ID
  * @param verstion_id  [INTERN] version ID
+ * @technology         [INTERN] describes the internal NAND array technology such as SLC or MLC.
+ * @density_mask:      [INTERN] chip density, used for DDP devices
  * @param options      [BOARDSPECIFIC] various chip options. They can partly be set to inform onenand_scan about
  * @param erase_shift  [INTERN] number of address bits in a block
  * @param page_shift   [INTERN] number of address bits in a page
  * @param ppb_shift    [INTERN] number of address bits in a pages per block
  * @param page_mask    [INTERN] a page per block mask
+ * @param writesize    [INTERN] a real page size
  * @param bufferam_index       [INTERN] BufferRAM index
  * @param bufferam     [INTERN] BufferRAM info
  * @param readw                [REPLACEABLE] hardware specific function for read short
@@ -80,55 +70,97 @@ struct onenand_bufferram {
  */
 struct onenand_chip {
        void __iomem *base;
+       unsigned int dies;
+       unsigned int boundary[MAX_DIES];
+       unsigned int diesize[MAX_DIES];
        unsigned int chipsize;
        unsigned int device_id;
+       unsigned int version_id;
+       unsigned int technology;
+       unsigned int density_mask;
        unsigned int options;
 
        unsigned int erase_shift;
        unsigned int page_shift;
        unsigned int ppb_shift; /* Pages per block shift */
        unsigned int page_mask;
+       unsigned int writesize;
 
        unsigned int bufferram_index;
        struct onenand_bufferram bufferram[MAX_BUFFERRAM];
 
-       int (*command) (struct mtd_info * mtd, int cmd, loff_t address,
+       int (*command) (struct mtd_info *mtd, int cmd, loff_t address,
                        size_t len);
-       int (*wait) (struct mtd_info * mtd, int state);
-       int (*read_bufferram) (struct mtd_info * mtd, int area,
+       int (*wait) (struct mtd_info *mtd, int state);
+       int (*bbt_wait) (struct mtd_info *mtd, int state);
+       void (*unlock_all)(struct mtd_info *mtd);
+       int (*read_bufferram) (struct mtd_info *mtd, loff_t addr, int area,
                               unsigned char *buffer, int offset, size_t count);
-       int (*write_bufferram) (struct mtd_info * mtd, int area,
+       int (*write_bufferram) (struct mtd_info *mtd, loff_t addr, int area,
                                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);
-
+       unsigned short (*read_word) (void __iomem *addr);
+       void (*write_word) (unsigned short value, void __iomem *addr);
+       int (*chip_probe)(struct mtd_info *mtd);
+       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);
+
+       unsigned char           *main_buf;
+       unsigned char           *spare_buf;
+#ifdef DONT_USE_UBOOT
        spinlock_t chip_lock;
        wait_queue_head_t wq;
-       onenand_state_t state;
+#endif
+       int state;
+       unsigned char           *page_buf;
+       unsigned char           *oob_buf;
 
        struct nand_oobinfo *autooob;
+       int                     subpagesize;
+       struct nand_ecclayout   *ecclayout;
 
        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_SET_PREV_BUFFERRAM(this)       (this->bufferram_index ^= 1)
+#define ONENAND_SET_BUFFERRAM0(this)           (this->bufferram_index = 0)
+#define ONENAND_SET_BUFFERRAM1(this)           (this->bufferram_index = 1)
+
+#define FLEXONENAND(this)      (this->device_id & DEVICE_IS_FLEXONENAND)
+#define ONENAND_IS_MLC(this)   (this->technology & ONENAND_TECHNOLOGY_IS_MLC)
+#define ONENAND_IS_DDP(this)                                           \
+       (this->device_id & ONENAND_DEVICE_IS_DDP)
+
+#define ONENAND_IS_4KB_PAGE(this)                                      \
+       (this->options & ONENAND_HAS_4KB_PAGE)
+
+#define ONENAND_IS_2PLANE(this)                        (0)
 
 /*
  * Options bits
  */
-#define ONENAND_CONT_LOCK              (0x0001)
+#define ONENAND_HAS_CONT_LOCK          (0x0001)
+#define ONENAND_HAS_UNLOCK_ALL         (0x0002)
+#define ONENAND_HAS_2PLANE             (0x0004)
+#define ONENAND_HAS_4KB_PAGE            (0x0008)
+#define ONENAND_RUNTIME_BADBLOCK_CHECK (0x0200)
+#define ONENAND_PAGEBUF_ALLOC          (0x1000)
+#define ONENAND_OOBBUF_ALLOC           (0x2000)
 
 /*
  * OneNAND Flash Manufacturer ID Codes
  */
+#define ONENAND_MFR_NUMONYX    0x20
 #define ONENAND_MFR_SAMSUNG    0xec
-#define ONENAND_MFR_UNKNOWN    0x00
 
 /**
  * struct nand_manufacturers - NAND Flash Manufacturer ID Structure
@@ -140,4 +172,9 @@ struct onenand_manufacturers {
        char *name;
 };
 
+int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
+                       struct mtd_oob_ops *ops);
+
+unsigned int onenand_block(struct onenand_chip *this, loff_t addr);
+int flexonenand_region(struct mtd_info *mtd, loff_t addr);
 #endif                         /* __LINUX_MTD_ONENAND_H */