@@ -1,304 +0,0 @@
# ifndef __MTD_MTD_H__
# define __MTD_MTD_H__
# ifdef __KERNEL__
# include <linux/config.h>
# include <linux/version.h>
# include <linux/types.h>
# include <linux/mtd/compatmac.h>
# include <linux/notifier.h>
# include <linux/module.h>
# include <linux/uio.h>
# endif /* __KERNEL__ */
struct erase_info_user {
u_int32_t start ;
u_int32_t length ;
} ;
struct mtd_oob_buf {
u_int32_t start ;
u_int32_t length ;
unsigned char * ptr ;
} ;
# define MTD_CHAR_MAJOR 90
# define MTD_BLOCK_MAJOR 31
# define MAX_MTD_DEVICES 16
# define MTD_ABSENT 0
# define MTD_RAM 1
# define MTD_ROM 2
# define MTD_NORFLASH 3
# define MTD_NANDFLASH 4
# define MTD_PEROM 5
# define MTD_OTHER 14
# define MTD_UNKNOWN 15
# define MTD_CLEAR_BITS 1 // Bits can be cleared (flash)
# define MTD_SET_BITS 2 // Bits can be set
# define MTD_ERASEABLE 4 // Has an erase function
# define MTD_WRITEB_WRITEABLE 8 // Direct IO is possible
# define MTD_VOLATILE 16 // Set for RAMs
# define MTD_XIP 32 // eXecute-In-Place possible
# define MTD_OOB 64 // Out-of-band data (NAND flash)
# define MTD_ECC 128 // Device capable of automatic ECC
// Some common devices / combinations of capabilities
# define MTD_CAP_ROM 0
# define MTD_CAP_RAM (MTD_CLEAR_BITS|MTD_SET_BITS|MTD_WRITEB_WRITEABLE)
# define MTD_CAP_NORFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE)
# define MTD_CAP_NANDFLASH (MTD_CLEAR_BITS|MTD_ERASEABLE|MTD_OOB)
# define MTD_WRITEABLE (MTD_CLEAR_BITS|MTD_SET_BITS)
// Types of automatic ECC/Checksum available
# define MTD_ECC_NONE 0 // No automatic ECC available
# define MTD_ECC_RS_DiskOnChip 1 // Automatic ECC on DiskOnChip
# define MTD_ECC_SW 2 // SW ECC for Toshiba & Samsung devices
struct mtd_info_user {
u_char type ;
u_int32_t flags ;
u_int32_t size ; // Total size of the MTD
u_int32_t erasesize ;
u_int32_t oobblock ; // Size of OOB blocks (e.g. 512)
u_int32_t oobsize ; // Amount of OOB data per block (e.g. 16)
u_int32_t ecctype ;
u_int32_t eccsize ;
} ;
struct region_info_user {
u_int32_t offset ; /* At which this region starts,
* from the beginning of the MTD */
u_int32_t erasesize ; /* For this region */
u_int32_t numblocks ; /* Number of blocks in this region */
u_int32_t regionindex ;
} ;
# define MEMGETINFO _IOR('M', 1, struct mtd_info_user)
# define MEMERASE _IOW('M', 2, struct erase_info_user)
# define MEMWRITEOOB _IOWR('M', 3, struct mtd_oob_buf)
# define MEMREADOOB _IOWR('M', 4, struct mtd_oob_buf)
# define MEMLOCK _IOW('M', 5, struct erase_info_user)
# define MEMUNLOCK _IOW('M', 6, struct erase_info_user)
# define MEMGETREGIONCOUNT _IOR('M', 7, int)
# define MEMGETREGIONINFO _IOWR('M', 8, struct region_info_user)
# define MEMREADDATA _IOWR('M', 9, struct mtd_oob_buf)
# define MEMWRITEDATA _IOWR('M', 10, struct mtd_oob_buf)
# define MTDREFRESH _IO('M', 23)
# ifndef __KERNEL__
typedef struct mtd_info_user mtd_info_t ;
typedef struct erase_info_user erase_info_t ;
typedef struct region_info_user region_info_t ;
/* User-space ioctl definitions */
# else /* __KERNEL__ */
# define MTD_ERASE_PENDING 0x01
# define MTD_ERASING 0x02
# define MTD_ERASE_SUSPEND 0x04
# define MTD_ERASE_DONE 0x08
# define MTD_ERASE_FAILED 0x10
struct erase_info {
struct mtd_info * mtd ;
u_int32_t addr ;
u_int32_t len ;
u_long time ;
u_long retries ;
u_int dev ;
u_int cell ;
void ( * callback ) ( struct erase_info * self ) ;
u_long priv ;
u_char state ;
struct erase_info * next ;
} ;
struct mtd_erase_region_info {
u_int32_t offset ; /* At which this region starts, from the beginning of the MTD */
u_int32_t erasesize ; /* For this region */
u_int32_t numblocks ; /* Number of blocks of erasesize in this region */
} ;
struct mtd_info {
u_char type ;
u_int32_t flags ;
u_int32_t size ; // Total size of the MTD
/* "Major" erase size for the device. Na<4E> ve users may take this
* to be the only erase size available, or may use the more detailed
* information below if they desire
*/
u_int32_t erasesize ;
u_int32_t oobblock ; // Size of OOB blocks (e.g. 512)
u_int32_t oobsize ; // Amount of OOB data per block (e.g. 16)
u_int32_t ecctype ;
u_int32_t eccsize ;
// Kernel-only stuff starts here.
char * name ;
int index ;
/* Data for variable erase regions. If numeraseregions is zero,
* it means that the whole device has erasesize as given above.
*/
int numeraseregions ;
struct mtd_erase_region_info * eraseregions ;
/* This really shouldn't be here. It can go away in 2.5 */
u_int32_t bank_size ;
struct module * module ;
int ( * erase ) ( struct mtd_info * mtd , struct erase_info * instr ) ;
/* This stuff for eXecute-In-Place */
int ( * point ) ( struct mtd_info * mtd , loff_t from , size_t len , size_t * retlen , u_char * * mtdbuf ) ;
/* We probably shouldn't allow XIP if the unpoint isn't a NULL */
void ( * unpoint ) ( struct mtd_info * mtd , u_char * addr , loff_t from , size_t len ) ;
int ( * read ) ( struct mtd_info * mtd , loff_t from , size_t len , size_t * retlen , u_char * buf ) ;
int ( * write ) ( struct mtd_info * mtd , loff_t to , size_t len , size_t * retlen , const u_char * buf ) ;
int ( * read_ecc ) ( struct mtd_info * mtd , loff_t from , size_t len , size_t * retlen , u_char * buf , u_char * eccbuf , int oobsel ) ;
int ( * write_ecc ) ( struct mtd_info * mtd , loff_t to , size_t len , size_t * retlen , const u_char * buf , u_char * eccbuf , int oobsel ) ;
int ( * read_oob ) ( struct mtd_info * mtd , loff_t from , size_t len , size_t * retlen , u_char * buf ) ;
int ( * write_oob ) ( struct mtd_info * mtd , loff_t to , size_t len , size_t * retlen , const u_char * buf ) ;
/*
* Methods to access the protection register area, present in some
* flash devices. The user data is one time programmable but the
* factory data is read only.
*/
int ( * read_user_prot_reg ) ( struct mtd_info * mtd , loff_t from , size_t len , size_t * retlen , u_char * buf ) ;
int ( * read_fact_prot_reg ) ( struct mtd_info * mtd , loff_t from , size_t len , size_t * retlen , u_char * buf ) ;
/* This function is not yet implemented */
int ( * write_user_prot_reg ) ( struct mtd_info * mtd , loff_t from , size_t len , size_t * retlen , u_char * buf ) ;
/* iovec-based read/write methods. We need these especially for NAND flash,
with its limited number of write cycles per erase.
NB: The 'count' parameter is the number of _vectors_, each of
which contains an (ofs, len) tuple.
*/
int ( * readv ) ( struct mtd_info * mtd , struct iovec * vecs , unsigned long count , loff_t from , size_t * retlen ) ;
int ( * readv_ecc ) ( struct mtd_info * mtd , struct iovec * vecs , unsigned long count , loff_t from ,
size_t * retlen , u_char * eccbuf , int oobsel ) ;
int ( * writev ) ( struct mtd_info * mtd , const struct iovec * vecs , unsigned long count , loff_t to , size_t * retlen ) ;
int ( * writev_ecc ) ( struct mtd_info * mtd , const struct iovec * vecs , unsigned long count , loff_t to ,
size_t * retlen , u_char * eccbuf , int oobsel ) ;
/* Sync */
void ( * sync ) ( struct mtd_info * mtd ) ;
/* Chip-supported device locking */
int ( * lock ) ( struct mtd_info * mtd , loff_t ofs , size_t len ) ;
int ( * unlock ) ( struct mtd_info * mtd , loff_t ofs , size_t len ) ;
/* Power Management functions */
int ( * suspend ) ( struct mtd_info * mtd ) ;
void ( * resume ) ( struct mtd_info * mtd ) ;
struct notifier_block reboot_notifier ;
void * priv ;
} ;
/* Kernel-side ioctl definitions */
extern int add_mtd_device ( struct mtd_info * mtd ) ;
extern int del_mtd_device ( struct mtd_info * mtd ) ;
extern struct mtd_info * __get_mtd_device ( struct mtd_info * mtd , int num ) ;
static inline struct mtd_info * get_mtd_device ( struct mtd_info * mtd , int num )
{
struct mtd_info * ret ;
ret = __get_mtd_device ( mtd , num ) ;
if ( ret & & ret - > module & & ! try_inc_mod_count ( ret - > module ) )
return NULL ;
return ret ;
}
static inline void put_mtd_device ( struct mtd_info * mtd )
{
if ( mtd - > module )
__MOD_DEC_USE_COUNT ( mtd - > module ) ;
}
struct mtd_notifier {
void ( * add ) ( struct mtd_info * mtd ) ;
void ( * remove ) ( struct mtd_info * mtd ) ;
struct mtd_notifier * next ;
} ;
extern void register_mtd_user ( struct mtd_notifier * new ) ;
extern int unregister_mtd_user ( struct mtd_notifier * old ) ;
int default_mtd_writev ( struct mtd_info * mtd , const struct iovec * vecs ,
unsigned long count , loff_t to , size_t * retlen ) ;
int default_mtd_readv ( struct mtd_info * mtd , struct iovec * vecs ,
unsigned long count , loff_t from , size_t * retlen ) ;
# ifndef MTDC
# define MTD_ERASE(mtd, args...) (*(mtd->erase))(mtd, args)
# define MTD_POINT(mtd, a,b,c,d) (*(mtd->point))(mtd, a,b,c, (u_char **)(d))
# define MTD_UNPOINT(mtd, arg) (*(mtd->unpoint))(mtd, (u_char *)arg)
# define MTD_READ(mtd, args...) (*(mtd->read))(mtd, args)
# define MTD_WRITE(mtd, args...) (*(mtd->write))(mtd, args)
# define MTD_READV(mtd, args...) (*(mtd->readv))(mtd, args)
# define MTD_WRITEV(mtd, args...) (*(mtd->writev))(mtd, args)
# define MTD_READECC(mtd, args...) (*(mtd->read_ecc))(mtd, args)
# define MTD_WRITEECC(mtd, args...) (*(mtd->write_ecc))(mtd, args)
# define MTD_READOOB(mtd, args...) (*(mtd->read_oob))(mtd, args)
# define MTD_WRITEOOB(mtd, args...) (*(mtd->write_oob))(mtd, args)
# define MTD_SYNC(mtd) do { if (mtd->sync) (*(mtd->sync))(mtd); } while (0)
# endif /* MTDC */
/*
* Debugging macro and defines
*/
# define MTD_DEBUG_LEVEL0 (0) /* Quiet */
# define MTD_DEBUG_LEVEL1 (1) /* Audible */
# define MTD_DEBUG_LEVEL2 (2) /* Loud */
# define MTD_DEBUG_LEVEL3 (3) /* Noisy */
# ifdef CONFIG_MTD_DEBUG
# define DEBUG(n, args...) \
do { \
if (n <= CONFIG_MTD_DEBUG_VERBOSE) \
printk(KERN_INFO args); \
} while(0)
# else /* CONFIG_MTD_DEBUG */
# define DEBUG(n, args...)
# endif /* CONFIG_MTD_DEBUG */
# endif /* __KERNEL__ */
# endif /* __MTD_MTD_H__ */