1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * $Id: mtd.h,v 1.61 2005/11/07 11:14:54 gleixner Exp $ 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> et al. 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Released under GPL 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __MTD_MTD_H__ 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __MTD_MTD_H__ 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef __KERNEL__ 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#error This is a kernel header. Perhaps include mtd-user.h instead? 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h> 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/module.h> 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/uio.h> 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/notifier.h> 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/mtd/compatmac.h> 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <mtd/mtd-abi.h> 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_CHAR_MAJOR 90 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_BLOCK_MAJOR 31 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MAX_MTD_DEVICES 16 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_ERASE_PENDING 0x01 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_ERASING 0x02 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_ERASE_SUSPEND 0x04 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_ERASE_DONE 0x08 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_ERASE_FAILED 0x10 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* If the erase fails, fail_addr might indicate exactly which block failed. If 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru fail_addr = 0xffffffff, the failure was not at the device level or was not 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru specific to any particular block. */ 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct erase_info { 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mtd_info *mtd; 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t addr; 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t len; 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t fail_addr; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_long time; 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_long retries; 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int dev; 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int cell; 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*callback) (struct erase_info *self); 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_long priv; 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_char state; 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct erase_info *next; 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mtd_erase_region_info { 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t offset; /* At which this region starts, from the beginning of the MTD */ 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t erasesize; /* For this region */ 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t numblocks; /* Number of blocks of erasesize in this region */ 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * oob operation modes 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * MTD_OOB_PLACE: oob data are placed at the given offset 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * MTD_OOB_AUTO: oob data are automatically placed at the free areas 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * which are defined by the ecclayout 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * MTD_OOB_RAW: mode to read raw data+oob in one chunk. The oob data 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is inserted into the data. Thats a raw image of the 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * flash contents. 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef enum { 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru MTD_OOB_PLACE, 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru MTD_OOB_AUTO, 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru MTD_OOB_RAW, 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} mtd_oob_mode_t; 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct mtd_oob_ops - oob operation operands 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @mode: operation mode 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @len: number of bytes to write/read. When a data buffer is given 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (datbuf != NULL) this is the number of data bytes. When 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * no data buffer is available this is the number of oob bytes. 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @retlen: number of bytes written/read. When a data buffer is given 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (datbuf != NULL) this is the number of data bytes. When 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * no data buffer is available this is the number of oob bytes. 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ooblen: number of oob bytes per page 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ooboffs: offset of oob data in the oob area (only relevant when 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * mode = MTD_OOB_PLACE) 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @datbuf: data buffer - if NULL only oob data are read/written 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @oobbuf: oob data buffer 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mtd_oob_ops { 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru mtd_oob_mode_t mode; 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru size_t len; 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru size_t retlen; 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru size_t ooblen; 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru uint32_t ooboffs; 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru uint8_t *datbuf; 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru uint8_t *oobbuf; 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mtd_info { 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_char type; 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t flags; 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t size; // Total size of the MTD 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* "Major" erase size for the device. Naïve users may take this 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to be the only erase size available, or may use the more detailed 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * information below if they desire 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t erasesize; 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Minimal writable flash unit size. In case of NOR flash it is 1 (even 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * though individual bits can be cleared), in case of NAND flash it is 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it is of ECC block size, etc. It is illegal to have writesize = 0. 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Any driver registering a struct mtd_info must ensure a writesize of 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 1 or larger. 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t writesize; 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t oobsize; // Amount of OOB data per block (e.g. 16) 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t ecctype; 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t eccsize; 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Reuse some of the above unused fields in the case of NOR flash 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * with configurable programming regions to avoid modifying the 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * user visible structure layout/size. Only valid when the 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * MTD_PROGRAM_REGIONS flag is set. 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (Maybe we should have an union for those?) 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_PROGREGION_CTRLMODE_VALID(mtd) (mtd)->oobsize 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_PROGREGION_CTRLMODE_INVALID(mtd) (mtd)->ecctype 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru // Kernel-only stuff starts here. 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char *name; 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int index; 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* ecc layout structure pointer - read only ! */ 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct nand_ecclayout *ecclayout; 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Data for variable erase regions. If numeraseregions is zero, 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it means that the whole device has erasesize as given above. 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int numeraseregions; 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mtd_erase_region_info *eraseregions; 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* This really shouldn't be here. It can go away in 2.5 */ 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u_int32_t bank_size; 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*erase) (struct mtd_info *mtd, struct erase_info *instr); 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* This stuff for eXecute-In-Place */ 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*point) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char **mtdbuf); 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* We probably shouldn't allow XIP if the unpoint isn't a NULL */ 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*unpoint) (struct mtd_info *mtd, u_char * addr, loff_t from, size_t len); 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf); 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*read_oob) (struct mtd_info *mtd, loff_t from, 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mtd_oob_ops *ops); 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*write_oob) (struct mtd_info *mtd, loff_t to, 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mtd_oob_ops *ops); 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Methods to access the protection register area, present in some 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * flash devices. The user data is one time programmable but the 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * factory data is read only. 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len); 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len); 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len); 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* kvec-based read/write methods. 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru NB: The 'count' parameter is the number of _vectors_, each of 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru which contains an (ofs, len) tuple. 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen); 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Sync */ 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*sync) (struct mtd_info *mtd); 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Chip-supported device locking */ 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len); 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len); 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Power Management functions */ 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*suspend) (struct mtd_info *mtd); 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*resume) (struct mtd_info *mtd); 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Bad block management functions */ 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*block_isbad) (struct mtd_info *mtd, loff_t ofs); 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*block_markbad) (struct mtd_info *mtd, loff_t ofs); 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct notifier_block reboot_notifier; /* default mode before reboot */ 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* ECC status information */ 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mtd_ecc_stats ecc_stats; 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *priv; 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct module *owner; 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int usecount; 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* Kernel-side ioctl definitions */ 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int add_mtd_device(struct mtd_info *mtd); 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int del_mtd_device (struct mtd_info *mtd); 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num); 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void put_mtd_device(struct mtd_info *mtd); 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mtd_notifier { 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*add)(struct mtd_info *mtd); 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*remove)(struct mtd_info *mtd); 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head list; 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void register_mtd_user (struct mtd_notifier *new); 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int unregister_mtd_user (struct mtd_notifier *old); 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long count, loff_t to, size_t *retlen); 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint default_mtd_readv(struct mtd_info *mtd, struct kvec *vecs, 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long count, loff_t from, size_t *retlen); 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_MTD_PARTITIONS 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid mtd_erase_callback(struct erase_info *instr); 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void mtd_erase_callback(struct erase_info *instr) 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (instr->callback) 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru instr->callback(instr); 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Debugging macro and defines 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_DEBUG_LEVEL0 (0) /* Quiet */ 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_DEBUG_LEVEL1 (1) /* Audible */ 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_DEBUG_LEVEL2 (2) /* Loud */ 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MTD_DEBUG_LEVEL3 (3) /* Noisy */ 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_MTD_DEBUG 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEBUG(n, args...) \ 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru do { \ 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (n <= CONFIG_MTD_DEBUG_VERBOSE) \ 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru printk(KERN_INFO args); \ 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru } while(0) 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else /* CONFIG_MTD_DEBUG */ 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEBUG(n, args...) do { } while(0) 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* CONFIG_MTD_DEBUG */ 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __MTD_MTD_H__ */ 269