1*d7e8ce10SKyungmin Park /* 2*d7e8ce10SKyungmin Park * linux/include/linux/mtd/onenand.h 3*d7e8ce10SKyungmin Park * 4*d7e8ce10SKyungmin Park * Copyright (C) 2005-2007 Samsung Electronics 5*d7e8ce10SKyungmin Park * Kyungmin Park <kyungmin.park@samsung.com> 6*d7e8ce10SKyungmin Park * 7*d7e8ce10SKyungmin Park * This program is free software; you can redistribute it and/or modify 8*d7e8ce10SKyungmin Park * it under the terms of the GNU General Public License version 2 as 9*d7e8ce10SKyungmin Park * published by the Free Software Foundation. 10*d7e8ce10SKyungmin Park */ 11*d7e8ce10SKyungmin Park 12*d7e8ce10SKyungmin Park #ifndef __LINUX_MTD_ONENAND_H 13*d7e8ce10SKyungmin Park #define __LINUX_MTD_ONENAND_H 14*d7e8ce10SKyungmin Park 15*d7e8ce10SKyungmin Park #include <linux/mtd/onenand_regs.h> 16*d7e8ce10SKyungmin Park 17*d7e8ce10SKyungmin Park /* Note: The header order is impoertant */ 18*d7e8ce10SKyungmin Park #include <onenand_uboot.h> 19*d7e8ce10SKyungmin Park 20*d7e8ce10SKyungmin Park #include <linux/mtd/bbm.h> 21*d7e8ce10SKyungmin Park 22*d7e8ce10SKyungmin Park #define MAX_BUFFERRAM 2 23*d7e8ce10SKyungmin Park #define MAX_ONENAND_PAGESIZE (2048 + 64) 24*d7e8ce10SKyungmin Park 25*d7e8ce10SKyungmin Park /* Scan and identify a OneNAND device */ 26*d7e8ce10SKyungmin Park extern int onenand_scan (struct mtd_info *mtd, int max_chips); 27*d7e8ce10SKyungmin Park /* Free resources held by the OneNAND device */ 28*d7e8ce10SKyungmin Park extern void onenand_release (struct mtd_info *mtd); 29*d7e8ce10SKyungmin Park 30*d7e8ce10SKyungmin Park /** 31*d7e8ce10SKyungmin Park * onenand_state_t - chip states 32*d7e8ce10SKyungmin Park * Enumeration for OneNAND flash chip state 33*d7e8ce10SKyungmin Park */ 34*d7e8ce10SKyungmin Park typedef enum { 35*d7e8ce10SKyungmin Park FL_READY, 36*d7e8ce10SKyungmin Park FL_READING, 37*d7e8ce10SKyungmin Park FL_WRITING, 38*d7e8ce10SKyungmin Park FL_ERASING, 39*d7e8ce10SKyungmin Park FL_SYNCING, 40*d7e8ce10SKyungmin Park FL_UNLOCKING, 41*d7e8ce10SKyungmin Park FL_LOCKING, 42*d7e8ce10SKyungmin Park } onenand_state_t; 43*d7e8ce10SKyungmin Park 44*d7e8ce10SKyungmin Park /** 45*d7e8ce10SKyungmin Park * struct onenand_bufferram - OneNAND BufferRAM Data 46*d7e8ce10SKyungmin Park * @param block block address in BufferRAM 47*d7e8ce10SKyungmin Park * @param page page address in BufferRAM 48*d7e8ce10SKyungmin Park * @param valid valid flag 49*d7e8ce10SKyungmin Park */ 50*d7e8ce10SKyungmin Park struct onenand_bufferram { 51*d7e8ce10SKyungmin Park int block; 52*d7e8ce10SKyungmin Park int page; 53*d7e8ce10SKyungmin Park int valid; 54*d7e8ce10SKyungmin Park }; 55*d7e8ce10SKyungmin Park 56*d7e8ce10SKyungmin Park /** 57*d7e8ce10SKyungmin Park * struct onenand_chip - OneNAND Private Flash Chip Data 58*d7e8ce10SKyungmin Park * @param base [BOARDSPECIFIC] address to access OneNAND 59*d7e8ce10SKyungmin Park * @param chipsize [INTERN] the size of one chip for multichip arrays 60*d7e8ce10SKyungmin Park * @param device_id [INTERN] device ID 61*d7e8ce10SKyungmin Park * @param verstion_id [INTERN] version ID 62*d7e8ce10SKyungmin Park * @param options [BOARDSPECIFIC] various chip options. They can partly be set to inform onenand_scan about 63*d7e8ce10SKyungmin Park * @param erase_shift [INTERN] number of address bits in a block 64*d7e8ce10SKyungmin Park * @param page_shift [INTERN] number of address bits in a page 65*d7e8ce10SKyungmin Park * @param ppb_shift [INTERN] number of address bits in a pages per block 66*d7e8ce10SKyungmin Park * @param page_mask [INTERN] a page per block mask 67*d7e8ce10SKyungmin Park * @param bufferam_index [INTERN] BufferRAM index 68*d7e8ce10SKyungmin Park * @param bufferam [INTERN] BufferRAM info 69*d7e8ce10SKyungmin Park * @param readw [REPLACEABLE] hardware specific function for read short 70*d7e8ce10SKyungmin Park * @param writew [REPLACEABLE] hardware specific function for write short 71*d7e8ce10SKyungmin Park * @param command [REPLACEABLE] hardware specific function for writing commands to the chip 72*d7e8ce10SKyungmin Park * @param wait [REPLACEABLE] hardware specific function for wait on ready 73*d7e8ce10SKyungmin Park * @param read_bufferram [REPLACEABLE] hardware specific function for BufferRAM Area 74*d7e8ce10SKyungmin Park * @param write_bufferram [REPLACEABLE] hardware specific function for BufferRAM Area 75*d7e8ce10SKyungmin Park * @param chip_lock [INTERN] spinlock used to protect access to this structure and the chip 76*d7e8ce10SKyungmin Park * @param wq [INTERN] wait queue to sleep on if a OneNAND operation is in progress 77*d7e8ce10SKyungmin Park * @param state [INTERN] the current state of the OneNAND device 78*d7e8ce10SKyungmin Park * @param autooob [REPLACEABLE] the default (auto)placement scheme 79*d7e8ce10SKyungmin Park * @param priv [OPTIONAL] pointer to private chip date 80*d7e8ce10SKyungmin Park */ 81*d7e8ce10SKyungmin Park struct onenand_chip { 82*d7e8ce10SKyungmin Park void __iomem *base; 83*d7e8ce10SKyungmin Park unsigned int chipsize; 84*d7e8ce10SKyungmin Park unsigned int device_id; 85*d7e8ce10SKyungmin Park unsigned int options; 86*d7e8ce10SKyungmin Park 87*d7e8ce10SKyungmin Park unsigned int erase_shift; 88*d7e8ce10SKyungmin Park unsigned int page_shift; 89*d7e8ce10SKyungmin Park unsigned int ppb_shift; /* Pages per block shift */ 90*d7e8ce10SKyungmin Park unsigned int page_mask; 91*d7e8ce10SKyungmin Park 92*d7e8ce10SKyungmin Park unsigned int bufferram_index; 93*d7e8ce10SKyungmin Park struct onenand_bufferram bufferram[MAX_BUFFERRAM]; 94*d7e8ce10SKyungmin Park 95*d7e8ce10SKyungmin Park int (*command) (struct mtd_info * mtd, int cmd, loff_t address, 96*d7e8ce10SKyungmin Park size_t len); 97*d7e8ce10SKyungmin Park int (*wait) (struct mtd_info * mtd, int state); 98*d7e8ce10SKyungmin Park int (*read_bufferram) (struct mtd_info * mtd, int area, 99*d7e8ce10SKyungmin Park unsigned char *buffer, int offset, size_t count); 100*d7e8ce10SKyungmin Park int (*write_bufferram) (struct mtd_info * mtd, int area, 101*d7e8ce10SKyungmin Park const unsigned char *buffer, int offset, 102*d7e8ce10SKyungmin Park size_t count); 103*d7e8ce10SKyungmin Park unsigned short (*read_word) (void __iomem * addr); 104*d7e8ce10SKyungmin Park void (*write_word) (unsigned short value, void __iomem * addr); 105*d7e8ce10SKyungmin Park void (*mmcontrol) (struct mtd_info * mtd, int sync_read); 106*d7e8ce10SKyungmin Park 107*d7e8ce10SKyungmin Park spinlock_t chip_lock; 108*d7e8ce10SKyungmin Park wait_queue_head_t wq; 109*d7e8ce10SKyungmin Park onenand_state_t state; 110*d7e8ce10SKyungmin Park 111*d7e8ce10SKyungmin Park struct nand_oobinfo *autooob; 112*d7e8ce10SKyungmin Park 113*d7e8ce10SKyungmin Park void *bbm; 114*d7e8ce10SKyungmin Park 115*d7e8ce10SKyungmin Park void *priv; 116*d7e8ce10SKyungmin Park }; 117*d7e8ce10SKyungmin Park 118*d7e8ce10SKyungmin Park #define ONENAND_CURRENT_BUFFERRAM(this) (this->bufferram_index) 119*d7e8ce10SKyungmin Park #define ONENAND_NEXT_BUFFERRAM(this) (this->bufferram_index ^ 1) 120*d7e8ce10SKyungmin Park #define ONENAND_SET_NEXT_BUFFERRAM(this) (this->bufferram_index ^= 1) 121*d7e8ce10SKyungmin Park 122*d7e8ce10SKyungmin Park /* 123*d7e8ce10SKyungmin Park * Options bits 124*d7e8ce10SKyungmin Park */ 125*d7e8ce10SKyungmin Park #define ONENAND_CONT_LOCK (0x0001) 126*d7e8ce10SKyungmin Park 127*d7e8ce10SKyungmin Park /* 128*d7e8ce10SKyungmin Park * OneNAND Flash Manufacturer ID Codes 129*d7e8ce10SKyungmin Park */ 130*d7e8ce10SKyungmin Park #define ONENAND_MFR_SAMSUNG 0xec 131*d7e8ce10SKyungmin Park #define ONENAND_MFR_UNKNOWN 0x00 132*d7e8ce10SKyungmin Park 133*d7e8ce10SKyungmin Park /** 134*d7e8ce10SKyungmin Park * struct nand_manufacturers - NAND Flash Manufacturer ID Structure 135*d7e8ce10SKyungmin Park * @param name: Manufacturer name 136*d7e8ce10SKyungmin Park * @param id: manufacturer ID code of device. 137*d7e8ce10SKyungmin Park */ 138*d7e8ce10SKyungmin Park struct onenand_manufacturers { 139*d7e8ce10SKyungmin Park int id; 140*d7e8ce10SKyungmin Park char *name; 141*d7e8ce10SKyungmin Park }; 142*d7e8ce10SKyungmin Park 143*d7e8ce10SKyungmin Park #endif /* __LINUX_MTD_ONENAND_H */ 144