uboot/include/linux/mtd/onenand.h
<<
>>
Prefs
   1/*
   2 *  linux/include/linux/mtd/onenand.h
   3 *
   4 *  Copyright (C) 2005-2007 Samsung Electronics
   5 *  Kyungmin Park <kyungmin.park@samsung.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11
  12#ifndef __LINUX_MTD_ONENAND_H
  13#define __LINUX_MTD_ONENAND_H
  14
  15#include <linux/mtd/onenand_regs.h>
  16
  17/* Note: The header order is impoertant */
  18#include <onenand_uboot.h>
  19
  20#include <linux/compat.h>
  21#include <linux/mtd/bbm.h>
  22
  23#define MAX_DIES                2
  24#define MAX_BUFFERRAM           2
  25#define MAX_ONENAND_PAGESIZE    (4096 + 128)
  26
  27/* Scan and identify a OneNAND device */
  28extern int onenand_scan (struct mtd_info *mtd, int max_chips);
  29/* Free resources held by the OneNAND device */
  30extern void onenand_release (struct mtd_info *mtd);
  31
  32/**
  33 * struct onenand_bufferram - OneNAND BufferRAM Data
  34 * @param blockpage     block & page address in BufferRAM
  35 */
  36struct onenand_bufferram {
  37        int blockpage;
  38};
  39
  40/**
  41 * struct onenand_chip - OneNAND Private Flash Chip Data
  42 * @param base          [BOARDSPECIFIC] address to access OneNAND
  43 * @dies:               [INTERN][FLEXONENAND] number of dies on chip
  44 * @boundary:           [INTERN][FLEXONENAND] Boundary of the dies
  45 * @diesize:            [INTERN][FLEXONENAND] Size of the dies
  46 * @param chipsize      [INTERN] the size of one chip for multichip arrays
  47 * @param device_id     [INTERN] device ID
  48 * @param verstion_id   [INTERN] version ID
  49 * @technology          [INTERN] describes the internal NAND array technology such as SLC or MLC.
  50 * @density_mask:       [INTERN] chip density, used for DDP devices
  51 * @param options       [BOARDSPECIFIC] various chip options. They can partly be set to inform onenand_scan about
  52 * @param erase_shift   [INTERN] number of address bits in a block
  53 * @param page_shift    [INTERN] number of address bits in a page
  54 * @param ppb_shift     [INTERN] number of address bits in a pages per block
  55 * @param page_mask     [INTERN] a page per block mask
  56 * @param writesize     [INTERN] a real page size
  57 * @param bufferam_index        [INTERN] BufferRAM index
  58 * @param bufferam      [INTERN] BufferRAM info
  59 * @param readw         [REPLACEABLE] hardware specific function for read short
  60 * @param writew        [REPLACEABLE] hardware specific function for write short
  61 * @param command       [REPLACEABLE] hardware specific function for writing commands to the chip
  62 * @param wait          [REPLACEABLE] hardware specific function for wait on ready
  63 * @param read_bufferram        [REPLACEABLE] hardware specific function for BufferRAM Area
  64 * @param write_bufferram       [REPLACEABLE] hardware specific function for BufferRAM Area
  65 * @param chip_lock     [INTERN] spinlock used to protect access to this structure and the chip
  66 * @param wq            [INTERN] wait queue to sleep on if a OneNAND operation is in progress
  67 * @param state         [INTERN] the current state of the OneNAND device
  68 * @param autooob       [REPLACEABLE] the default (auto)placement scheme
  69 * @param priv          [OPTIONAL] pointer to private chip date
  70 */
  71struct onenand_chip {
  72        void __iomem *base;
  73        unsigned int dies;
  74        unsigned int boundary[MAX_DIES];
  75        unsigned int diesize[MAX_DIES];
  76        unsigned int chipsize;
  77        unsigned int device_id;
  78        unsigned int version_id;
  79        unsigned int technology;
  80        unsigned int density_mask;
  81        unsigned int options;
  82
  83        unsigned int erase_shift;
  84        unsigned int page_shift;
  85        unsigned int ppb_shift; /* Pages per block shift */
  86        unsigned int page_mask;
  87        unsigned int writesize;
  88
  89        unsigned int bufferram_index;
  90        struct onenand_bufferram bufferram[MAX_BUFFERRAM];
  91
  92        int (*command) (struct mtd_info *mtd, int cmd, loff_t address,
  93                        size_t len);
  94        int (*wait) (struct mtd_info *mtd, int state);
  95        int (*bbt_wait) (struct mtd_info *mtd, int state);
  96        void (*unlock_all)(struct mtd_info *mtd);
  97        int (*read_bufferram) (struct mtd_info *mtd, loff_t addr, int area,
  98                               unsigned char *buffer, int offset, size_t count);
  99        int (*write_bufferram) (struct mtd_info *mtd, loff_t addr, int area,
 100                                const unsigned char *buffer, int offset,
 101                                size_t count);
 102        unsigned short (*read_word) (void __iomem *addr);
 103        void (*write_word) (unsigned short value, void __iomem *addr);
 104        int (*chip_probe)(struct mtd_info *mtd);
 105        void (*mmcontrol) (struct mtd_info *mtd, int sync_read);
 106        int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
 107        int (*scan_bbt)(struct mtd_info *mtd);
 108
 109        unsigned char           *main_buf;
 110        unsigned char           *spare_buf;
 111#ifdef DONT_USE_UBOOT
 112        spinlock_t chip_lock;
 113        wait_queue_head_t wq;
 114#endif
 115        int state;
 116        unsigned char           *page_buf;
 117        unsigned char           *oob_buf;
 118
 119        struct nand_oobinfo *autooob;
 120        int                     subpagesize;
 121        struct nand_ecclayout   *ecclayout;
 122
 123        void *bbm;
 124
 125        void *priv;
 126};
 127
 128/*
 129 * Helper macros
 130 */
 131#define ONENAND_CURRENT_BUFFERRAM(this)         (this->bufferram_index)
 132#define ONENAND_NEXT_BUFFERRAM(this)            (this->bufferram_index ^ 1)
 133#define ONENAND_SET_NEXT_BUFFERRAM(this)        (this->bufferram_index ^= 1)
 134#define ONENAND_SET_PREV_BUFFERRAM(this)        (this->bufferram_index ^= 1)
 135#define ONENAND_SET_BUFFERRAM0(this)            (this->bufferram_index = 0)
 136#define ONENAND_SET_BUFFERRAM1(this)            (this->bufferram_index = 1)
 137
 138#define FLEXONENAND(this)       (this->device_id & DEVICE_IS_FLEXONENAND)
 139#define ONENAND_IS_MLC(this)    (this->technology & ONENAND_TECHNOLOGY_IS_MLC)
 140#define ONENAND_IS_DDP(this)                                            \
 141        (this->device_id & ONENAND_DEVICE_IS_DDP)
 142
 143#define ONENAND_IS_4KB_PAGE(this)                                       \
 144        (this->options & ONENAND_HAS_4KB_PAGE)
 145
 146#define ONENAND_IS_2PLANE(this)                 (0)
 147
 148/*
 149 * Options bits
 150 */
 151#define ONENAND_HAS_CONT_LOCK           (0x0001)
 152#define ONENAND_HAS_UNLOCK_ALL          (0x0002)
 153#define ONENAND_HAS_2PLANE              (0x0004)
 154#define ONENAND_HAS_4KB_PAGE            (0x0008)
 155#define ONENAND_RUNTIME_BADBLOCK_CHECK  (0x0200)
 156#define ONENAND_PAGEBUF_ALLOC           (0x1000)
 157#define ONENAND_OOBBUF_ALLOC            (0x2000)
 158
 159/*
 160 * OneNAND Flash Manufacturer ID Codes
 161 */
 162#define ONENAND_MFR_NUMONYX     0x20
 163#define ONENAND_MFR_SAMSUNG     0xec
 164
 165/**
 166 * struct nand_manufacturers - NAND Flash Manufacturer ID Structure
 167 * @param name:         Manufacturer name
 168 * @param id:           manufacturer ID code of device.
 169*/
 170struct onenand_manufacturers {
 171        int id;
 172        char *name;
 173};
 174
 175int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
 176                        struct mtd_oob_ops *ops);
 177
 178unsigned int onenand_block(struct onenand_chip *this, loff_t addr);
 179int flexonenand_region(struct mtd_info *mtd, loff_t addr);
 180#endif                          /* __LINUX_MTD_ONENAND_H */
 181