| /******************************************************************************** |
| * Marvell GPL License Option |
| * |
| * If you received this File from Marvell, you may opt to use, redistribute and/or |
| * modify this File in accordance with the terms and conditions of the General |
| * Public License Version 2, June 1991 (the "GPL License"), a copy of which is |
| * available along with the File in the license.txt file or by writing to the Free |
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or |
| * on the worldwide web at http://www.gnu.org/licenses/gpl.txt. |
| * |
| * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY |
| * DISCLAIMED. The GPL License provides additional details about this warranty |
| * disclaimer. |
| ******************************************************************************/ |
| |
| #ifndef __NAND_CHIP_H |
| #define __NAND_CHIP_H |
| |
| struct ndtr0cs0 { |
| union{ |
| struct{ |
| unsigned int tRP : 3; |
| unsigned int tRH : 3; |
| unsigned int etRP : 1; |
| unsigned int sel_nRE_edge : 1; |
| unsigned int tWP : 3; |
| unsigned int tWH : 3; |
| unsigned int reserved : 2; |
| unsigned int tCS : 3; |
| unsigned int tCH : 3; |
| unsigned int Rd_Cnt_Del : 4; |
| unsigned int SelCntr : 1; |
| unsigned int tADL : 5; |
| }; |
| unsigned int u32_ndtr0cs0; |
| }; |
| }; |
| |
| struct ndtr1cs0{ |
| union{ |
| struct{ |
| unsigned int tAR : 4; |
| unsigned int tWHR : 4; |
| unsigned int tRHW : 2; |
| unsigned int reserved : 4; |
| unsigned int PRESCALE : 1; |
| unsigned int wait_mode : 1; |
| unsigned int tR : 16; |
| }; |
| unsigned int u32_ndtr1cs0; |
| }; |
| }; |
| |
| struct ndredel{ |
| union{ |
| struct{ |
| unsigned int reserved : 4; |
| unsigned int nd_re_en : 4; |
| unsigned int nd_re_sel : 4; |
| unsigned int nd_re_del7 : 4; |
| unsigned int nd_re_del6 : 4; |
| unsigned int nd_re_del5 : 4; |
| unsigned int nd_re_del4 : 4; |
| unsigned int nd_re_del3 : 4; |
| unsigned int nd_re_del2 : 4; |
| unsigned int nd_re_del1 : 4; |
| unsigned int nd_re_del0 : 4; |
| }; |
| unsigned int u32_ndredel; |
| }; |
| }; |
| //unit: ns |
| struct nand_timing{ |
| int tADL; //Address to Data loding time |
| int tREA; //nRE access time |
| int tCH; //Enable signal hold time |
| int tCS; //enable signal setup time |
| int tWH; //nWE high duration time |
| int tWP; //nWE pulse width |
| int tRH; //or tREH, nRE high duration time |
| int tRP; //nRE pulse width |
| int tR; //nWE high to nRE low for read, |
| int tRHW; //Read to write delay |
| int tWHR; //nWE high to nRE low for read status |
| int tAR; //ALE low to nRE low delay |
| }; |
| |
| struct nand_param { |
| const char maker; |
| const char dev_id; |
| const char id[6]; |
| const int page_size; |
| const int block_size; |
| const int chip_size; //MB |
| int t;//ECC strenght |
| struct nand_timing * timing; |
| }; |
| |
| struct nand_timing timing_ONFI_mode0 = {//ONFI mode 0 |
| .tADL = 120, |
| .tREA = 40, |
| .tCH = 20, |
| .tCS = 40, |
| .tWH = 30, |
| .tWP = 40, |
| .tRH = 30, |
| .tRP = 50, |
| .tR = 200000, |
| .tRHW = 200, |
| .tWHR = 100, |
| .tAR = 25, |
| }; |
| |
| struct nand_timing timing_ONFI_mode5 = {//ONFI mode 5 |
| .tADL = 70, |
| .tREA = 16, |
| .tCH = 5, |
| .tCS = 15, |
| .tWH = 7, |
| .tWP = 10, |
| .tRH = 7, |
| .tRP = 10, |
| .tR = 60000, |
| .tRHW = 100, |
| .tWHR = 60, |
| .tAR = 10, |
| }; |
| |
| //Samsung |
| struct nand_timing timing_K9G8G08x0M = { |
| .tADL = 100, |
| .tREA = 20, |
| .tCH = 5, |
| .tCS = 15, //20 |
| .tWH = 10, |
| .tWP = 15, |
| .tRH = 10, |
| .tRP = 15, |
| .tR = 60000, |
| .tRHW = 100, |
| .tWHR = 60, |
| .tAR = 10, |
| }; |
| |
| struct nand_timing timing_K9GAG08x0M = { |
| .tADL = 100, |
| .tREA = 20, |
| .tCH = 5, |
| .tCS = 12, //20 |
| .tWH = 10, |
| .tWP = 12, |
| .tRH = 10, |
| .tRP = 12, |
| .tR = 60000, |
| .tRHW = 100, |
| .tWHR = 60, |
| .tAR = 10, |
| }; |
| |
| struct nand_timing timing_MT29F= { |
| .tADL = 70, |
| .tREA = 16, |
| .tCH = 5, |
| .tCS = 15, //20 |
| .tWH = 7, |
| .tWP = 10, |
| .tRH = 10, |
| .tRP = 10, |
| .tR = 25000, |
| .tRHW = 100, |
| .tWHR = 60, |
| .tAR = 10, |
| }; |
| |
| //Hynix |
| struct nand_timing timing_HY27UFxx2G2B= { |
| .tADL = 100, |
| .tREA = 20, |
| .tCH = 5, |
| .tCS = 12, //20 |
| .tWH = 10, |
| .tWP = 12, |
| .tRH = 10, |
| .tRP = 12, |
| .tR = 60000, |
| .tRHW = 100, |
| .tWHR = 60, |
| .tAR = 10, |
| }; |
| |
| struct nand_param chip_default = { |
| .maker = 0, |
| .dev_id = 0, |
| .t = 16, |
| .timing = &timing_K9G8G08x0M, |
| }; |
| |
| /* |
| * Samsung |
| */ |
| //2K page |
| struct nand_param SAMSUNG_K9G8G08x0M = { |
| .maker = 0xEC, |
| .dev_id = 0xD3, |
| .id = {0x51, 0x95, 0x58, 0xEC, 0x00, 0x00}, |
| .t = 16, |
| .page_size = 2048, |
| .block_size = 256*1024, |
| .chip_size = 1024, |
| .timing = &timing_K9G8G08x0M, |
| }; |
| |
| struct nand_param SAMSUNG_K9F2G08U0D = { |
| .maker = 0xEC, |
| .dev_id = 0xDA, |
| .id = {0x10, 0x95, 0x46, 0x00, 0x00, 0x00}, |
| .t = 16, /*t*15/8 = 30 bytes, will generate 30 bytes ECC for 2048 bytes |
| data, so every page has 2048 + 30 + 32 (oob data for yaffs) valid data, this must less than physical page size, otherwise ECC will fail. |
| NAND data sheet says page size is 2048 + 64, so t = 16 fall into legal range*/ |
| /*ECC takes 32767 bytes to calculate 30 bytes result, so any data less |
| * than 32767 can be used (2048, or 2048 +32 is OK, reaming part will pad zero.*/ |
| .page_size = 2048, |
| .block_size = 128*1024, |
| .chip_size = 256, |
| .timing = &timing_K9G8G08x0M, |
| }; |
| |
| //4K page |
| struct nand_param SAMSUNG_K9GAG08x0M = { |
| .maker = 0xEC, |
| .dev_id = 0xD5, |
| .id = {0x14, 0xB6, 0x74, 0xEC, 0x00, 0x00}, |
| .t = 16, |
| .page_size = 4096, |
| .block_size = 512*1024, |
| .chip_size = 2048, |
| .timing = &timing_K9GAG08x0M, |
| }; |
| |
| struct nand_param SAMSUNG_K9GAG08U0D = { |
| .maker = 0xEC, |
| .dev_id = 0xD5, |
| .id = {0x94, 0x29, 0x34, 0x41, 0x00, 0x00}, |
| .t = 48, |
| .page_size = 4096, |
| .block_size = 512*1024, |
| .chip_size = 2048, |
| .timing = &timing_K9GAG08x0M, |
| }; |
| |
| //8K page |
| struct nand_param SAMSUNG_K9G8G08U0C = { |
| .maker = 0xEC, |
| .dev_id = 0xD3, |
| .id = {0x84, 0x72, 0x50, 0x42, 0x00, 0x00}, |
| .t = 48, |
| .page_size = 8192, |
| .block_size = 512*1024, |
| .chip_size = 1024, |
| .timing = &timing_K9GAG08x0M, |
| }; |
| |
| struct nand_param SAMSUNG_K9GBG08U0A = { |
| .maker = 0xEC, |
| .dev_id = 0xD7, |
| .id = {0x94, 0x7A, 0x54, 0x43, 0x00, 0x00}, |
| .t = 48, |
| .page_size = 8192, |
| .block_size = 1024*1024, |
| .chip_size = 4096, |
| .timing = &timing_K9GAG08x0M, |
| }; |
| |
| struct nand_param SAMSUNG_K9GAG08U0E = { |
| .maker = 0xEC, |
| .dev_id = 0xD5, |
| .id = {0x84, 0x72, 0x50, 0x42, 0x00, 0x00}, |
| .t = 48, |
| .page_size = 8192, |
| .block_size = 1024*1024, |
| .chip_size = 2048, |
| .timing = &timing_K9GAG08x0M, |
| }; |
| |
| struct nand_param SAMSUNG_K9LBG08U0E = { |
| .maker = 0xEC, |
| .dev_id = 0xD7, |
| .id = {0xC5, 0x72, 0x54, 0x42, 0x00, 0x00}, |
| .t = 48, |
| .page_size = 8192, |
| .block_size = 1024*1024, |
| .chip_size = 4096, |
| .timing = &timing_K9GAG08x0M, |
| }; |
| |
| /* |
| * Hynix |
| */ |
| //2K |
| struct nand_param HINIX_HY27UF082G2B= { |
| .maker = 0xAD, |
| .dev_id = 0xDA, |
| .id = {0x10, 0x95, 0x44, 0xAD, 0x00, 0x00}, |
| .t = 16, |
| .page_size = 2048, |
| .block_size = 128*1024, |
| .chip_size = 256, |
| .timing = &timing_HY27UFxx2G2B, |
| }; |
| |
| struct nand_param HINIX_HY27UF084G2B= { |
| .maker = 0xAD, |
| .dev_id = 0xDC, |
| .id = {0x10, 0x95, 0x54, 0xAD, 0x00, 0x00}, |
| .t = 16, |
| .page_size = 2048, |
| .block_size = 128*1024, |
| .chip_size = 512, |
| .timing = &timing_HY27UFxx2G2B, |
| }; |
| //8K |
| struct nand_param HINIX_HY27UBG8T2A= { |
| .maker = 0xAD, |
| .dev_id = 0xD7, |
| .id = {0x94, 0x9A, 0x74, 0x42, 0x00, 0x00}, |
| .t = 48, |
| .page_size = 8192, |
| .block_size = 2*1024*1024, |
| .chip_size = 4096, |
| .timing = &timing_HY27UFxx2G2B, |
| }; |
| |
| struct nand_param HINIX_H27UAG8T2CTR= { |
| .maker = 0xAD, |
| .dev_id = 0xD5, |
| .id = {0x94, 0xDA, 0x74, 0xC4, 0x00, 0x00}, |
| .t = 80, |
| .page_size = 8192, |
| .block_size = 256 * 8192, |
| .chip_size = 2048, |
| .timing = &timing_HY27UFxx2G2B, |
| }; |
| |
| /* |
| * Micron |
| */ |
| //4K page |
| struct nand_param MICRON_MT298G08A = { |
| .maker = 0x2C, |
| .dev_id = 0xD3, |
| .t = 16, |
| .timing = &timing_ONFI_mode5, |
| }; |
| |
| struct nand_param MICRON_MT29F32G08CBACA= { |
| .maker = 0x2C, |
| .dev_id = 0x68, |
| .id = {0x04, 0x46, 0x89, 0x00, 0x00, 0x00}, |
| .t = 48, |
| .page_size = 4096, |
| .block_size = 1024*1024, |
| .chip_size = 4096, |
| .timing = &timing_K9G8G08x0M, |
| }; |
| |
| struct nand_param MICRON_MT29F16G08ABABA= { |
| .maker = 0x2C, |
| .dev_id = 0x48, |
| .id = {0x00, 0x26, 0x89, 0x00, 0x00, 0x00}, |
| .t = 16, |
| .page_size = 4096, |
| .block_size = 512*1024, |
| .chip_size = 2048, |
| .timing = &timing_K9G8G08x0M, |
| }; |
| |
| struct nand_param MICRON_MT29F4G08ABADA = { |
| .maker = 0x2C, |
| .dev_id = 0xDC, |
| .id = {0x90, 0x95, 0x56, 0x00, 0x00, 0x00}, |
| .t = 16, |
| .page_size = 2048, |
| .block_size = 128*1024, |
| .chip_size = 512, |
| .timing = &timing_K9G8G08x0M, |
| }; |
| |
| struct nand_param TOSHIBA_TH58NVG2S3HTA00 = { |
| .maker = 0x98, |
| .dev_id = 0xDC, |
| .id = {0x91, 0x15, 0x76, 0x16, 0xFF, 0xFF}, |
| .t = 32, |
| .page_size = 2048, |
| .block_size = 128*1024, |
| .chip_size = 512, |
| .timing = &timing_K9GAG08x0M, |
| }; |
| |
| struct nand_param TOSHIBA_TC58NVG1S3HTA00 = { |
| .maker = 0x98, |
| .dev_id = 0xDA, |
| .id = {0x90, 0x15, 0x76, 0x16, 0xFF, 0xFF}, |
| .t = 48, |
| .page_size = 2048, |
| .block_size = 128*1024, |
| .chip_size = 256, |
| .timing = &timing_K9GAG08x0M, |
| }; |
| |
| struct nand_param TOSHIBA_TC58NVG2S0HBAI6 = { |
| .maker = 0x98, |
| .dev_id = 0xDC, |
| .id = {0x90, 0x26, 0x76, 0x16, 0xFF, 0xFF}, |
| .t = 48, |
| .page_size = 4096, |
| .block_size = 256*1024, |
| .chip_size = 512, |
| .timing = &timing_K9GAG08x0M, |
| }; |
| |
| /* |
| * Powerchip |
| */ |
| |
| struct nand_param POWERCHIP_PSU4GA30AT = { |
| .maker = 0xC8, |
| .dev_id = 0xDC, |
| .id = {0x90, 0x95, 0x54, 0x00, 0x00, 0x00}, |
| .t = 16, |
| .page_size = 2048, |
| .block_size = 64*2048, |
| .chip_size = 512, |
| .timing = &timing_K9G8G08x0M, |
| }; |
| |
| struct nand_param *buildin_nand_list []= { |
| &chip_default, |
| &SAMSUNG_K9GBG08U0A, |
| &SAMSUNG_K9GAG08x0M, |
| &SAMSUNG_K9G8G08x0M, |
| &SAMSUNG_K9F2G08U0D, |
| &SAMSUNG_K9GAG08U0D, |
| &SAMSUNG_K9G8G08U0C, |
| &SAMSUNG_K9GAG08U0E, |
| &SAMSUNG_K9LBG08U0E, |
| &HINIX_HY27UF082G2B, |
| &HINIX_HY27UF084G2B, |
| &HINIX_HY27UBG8T2A, |
| &HINIX_H27UAG8T2CTR, |
| &MICRON_MT29F4G08ABADA, |
| &MICRON_MT298G08A, |
| &MICRON_MT29F32G08CBACA, |
| &MICRON_MT29F16G08ABABA, |
| &MICRON_MT29F4G08ABADA, |
| &TOSHIBA_TH58NVG2S3HTA00, |
| &TOSHIBA_TC58NVG1S3HTA00, |
| &TOSHIBA_TC58NVG2S0HBAI6, |
| &POWERCHIP_PSU4GA30AT, |
| NULL |
| }; |
| #endif |