1*cfa460adSWilliam Juul /* 2*cfa460adSWilliam Juul * Linux driver for Disk-On-Chip devices 3*cfa460adSWilliam Juul * 4*cfa460adSWilliam Juul * Copyright (C) 1999 Machine Vision Holdings, Inc. 5*cfa460adSWilliam Juul * Copyright (C) 2001-2003 David Woodhouse <dwmw2@infradead.org> 6*cfa460adSWilliam Juul * Copyright (C) 2002-2003 Greg Ungerer <gerg@snapgear.com> 7*cfa460adSWilliam Juul * Copyright (C) 2002-2003 SnapGear Inc 8*cfa460adSWilliam Juul * 9*cfa460adSWilliam Juul * $Id: doc2000.h,v 1.25 2005/11/07 11:14:54 gleixner Exp $ 10*cfa460adSWilliam Juul * 11*cfa460adSWilliam Juul * Released under GPL 12*cfa460adSWilliam Juul */ 13012771d8Swdenk 14012771d8Swdenk #ifndef __MTD_DOC2000_H__ 15012771d8Swdenk #define __MTD_DOC2000_H__ 16012771d8Swdenk 17*cfa460adSWilliam Juul #include <linux/mtd/mtd.h> 18*cfa460adSWilliam Juul #if 0 19*cfa460adSWilliam Juul #include <linux/mutex.h> 20*cfa460adSWilliam Juul #endif 21012771d8Swdenk 22012771d8Swdenk #define DoC_Sig1 0 23012771d8Swdenk #define DoC_Sig2 1 24012771d8Swdenk 25012771d8Swdenk #define DoC_ChipID 0x1000 26012771d8Swdenk #define DoC_DOCStatus 0x1001 27012771d8Swdenk #define DoC_DOCControl 0x1002 28012771d8Swdenk #define DoC_FloorSelect 0x1003 29012771d8Swdenk #define DoC_CDSNControl 0x1004 30012771d8Swdenk #define DoC_CDSNDeviceSelect 0x1005 31012771d8Swdenk #define DoC_ECCConf 0x1006 32012771d8Swdenk #define DoC_2k_ECCStatus 0x1007 33012771d8Swdenk 34012771d8Swdenk #define DoC_CDSNSlowIO 0x100d 35012771d8Swdenk #define DoC_ECCSyndrome0 0x1010 36012771d8Swdenk #define DoC_ECCSyndrome1 0x1011 37012771d8Swdenk #define DoC_ECCSyndrome2 0x1012 38012771d8Swdenk #define DoC_ECCSyndrome3 0x1013 39012771d8Swdenk #define DoC_ECCSyndrome4 0x1014 40012771d8Swdenk #define DoC_ECCSyndrome5 0x1015 41012771d8Swdenk #define DoC_AliasResolution 0x101b 42012771d8Swdenk #define DoC_ConfigInput 0x101c 43012771d8Swdenk #define DoC_ReadPipeInit 0x101d 44012771d8Swdenk #define DoC_WritePipeTerm 0x101e 45012771d8Swdenk #define DoC_LastDataRead 0x101f 46012771d8Swdenk #define DoC_NOP 0x1020 47012771d8Swdenk 48012771d8Swdenk #define DoC_Mil_CDSN_IO 0x0800 49012771d8Swdenk #define DoC_2k_CDSN_IO 0x1800 50012771d8Swdenk 51*cfa460adSWilliam Juul #define DoC_Mplus_NOP 0x1002 52*cfa460adSWilliam Juul #define DoC_Mplus_AliasResolution 0x1004 53*cfa460adSWilliam Juul #define DoC_Mplus_DOCControl 0x1006 54*cfa460adSWilliam Juul #define DoC_Mplus_AccessStatus 0x1008 55*cfa460adSWilliam Juul #define DoC_Mplus_DeviceSelect 0x1008 56*cfa460adSWilliam Juul #define DoC_Mplus_Configuration 0x100a 57*cfa460adSWilliam Juul #define DoC_Mplus_OutputControl 0x100c 58*cfa460adSWilliam Juul #define DoC_Mplus_FlashControl 0x1020 59*cfa460adSWilliam Juul #define DoC_Mplus_FlashSelect 0x1022 60*cfa460adSWilliam Juul #define DoC_Mplus_FlashCmd 0x1024 61*cfa460adSWilliam Juul #define DoC_Mplus_FlashAddress 0x1026 62*cfa460adSWilliam Juul #define DoC_Mplus_FlashData0 0x1028 63*cfa460adSWilliam Juul #define DoC_Mplus_FlashData1 0x1029 64*cfa460adSWilliam Juul #define DoC_Mplus_ReadPipeInit 0x102a 65*cfa460adSWilliam Juul #define DoC_Mplus_LastDataRead 0x102c 66*cfa460adSWilliam Juul #define DoC_Mplus_LastDataRead1 0x102d 67*cfa460adSWilliam Juul #define DoC_Mplus_WritePipeTerm 0x102e 68*cfa460adSWilliam Juul #define DoC_Mplus_ECCSyndrome0 0x1040 69*cfa460adSWilliam Juul #define DoC_Mplus_ECCSyndrome1 0x1041 70*cfa460adSWilliam Juul #define DoC_Mplus_ECCSyndrome2 0x1042 71*cfa460adSWilliam Juul #define DoC_Mplus_ECCSyndrome3 0x1043 72*cfa460adSWilliam Juul #define DoC_Mplus_ECCSyndrome4 0x1044 73*cfa460adSWilliam Juul #define DoC_Mplus_ECCSyndrome5 0x1045 74*cfa460adSWilliam Juul #define DoC_Mplus_ECCConf 0x1046 75*cfa460adSWilliam Juul #define DoC_Mplus_Toggle 0x1046 76*cfa460adSWilliam Juul #define DoC_Mplus_DownloadStatus 0x1074 77*cfa460adSWilliam Juul #define DoC_Mplus_CtrlConfirm 0x1076 78*cfa460adSWilliam Juul #define DoC_Mplus_Power 0x1fff 79012771d8Swdenk 80*cfa460adSWilliam Juul /* How to access the device? 81*cfa460adSWilliam Juul * On ARM, it'll be mmap'd directly with 32-bit wide accesses. 82*cfa460adSWilliam Juul * On PPC, it's mmap'd and 16-bit wide. 83*cfa460adSWilliam Juul * Others use readb/writeb 84*cfa460adSWilliam Juul */ 85*cfa460adSWilliam Juul #if defined(__arm__) 86*cfa460adSWilliam Juul #define ReadDOC_(adr, reg) ((unsigned char)(*(volatile __u32 *)(((unsigned long)adr)+((reg)<<2)))) 87*cfa460adSWilliam Juul #define WriteDOC_(d, adr, reg) do{ *(volatile __u32 *)(((unsigned long)adr)+((reg)<<2)) = (__u32)d; wmb();} while(0) 88*cfa460adSWilliam Juul #define DOC_IOREMAP_LEN 0x8000 89*cfa460adSWilliam Juul #elif defined(__ppc__) 90*cfa460adSWilliam Juul #define ReadDOC_(adr, reg) ((unsigned char)(*(volatile __u16 *)(((unsigned long)adr)+((reg)<<1)))) 91*cfa460adSWilliam Juul #define WriteDOC_(d, adr, reg) do{ *(volatile __u16 *)(((unsigned long)adr)+((reg)<<1)) = (__u16)d; wmb();} while(0) 92012771d8Swdenk #define DOC_IOREMAP_LEN 0x4000 93*cfa460adSWilliam Juul #else 94*cfa460adSWilliam Juul #define ReadDOC_(adr, reg) readb((void __iomem *)(adr) + (reg)) 95*cfa460adSWilliam Juul #define WriteDOC_(d, adr, reg) writeb(d, (void __iomem *)(adr) + (reg)) 96*cfa460adSWilliam Juul #define DOC_IOREMAP_LEN 0x2000 97*cfa460adSWilliam Juul 98*cfa460adSWilliam Juul #endif 99*cfa460adSWilliam Juul 100*cfa460adSWilliam Juul #if defined(__i386__) || defined(__x86_64__) 101*cfa460adSWilliam Juul #define USE_MEMCPY 102*cfa460adSWilliam Juul #endif 103012771d8Swdenk 104012771d8Swdenk /* These are provided to directly use the DoC_xxx defines */ 105012771d8Swdenk #define ReadDOC(adr, reg) ReadDOC_(adr,DoC_##reg) 106012771d8Swdenk #define WriteDOC(d, adr, reg) WriteDOC_(d,adr,DoC_##reg) 107012771d8Swdenk 108012771d8Swdenk #define DOC_MODE_RESET 0 109012771d8Swdenk #define DOC_MODE_NORMAL 1 110012771d8Swdenk #define DOC_MODE_RESERVED1 2 111012771d8Swdenk #define DOC_MODE_RESERVED2 3 112012771d8Swdenk 113012771d8Swdenk #define DOC_MODE_CLR_ERR 0x80 114*cfa460adSWilliam Juul #define DOC_MODE_RST_LAT 0x10 115*cfa460adSWilliam Juul #define DOC_MODE_BDECT 0x08 116*cfa460adSWilliam Juul #define DOC_MODE_MDWREN 0x04 117012771d8Swdenk 118012771d8Swdenk #define DOC_ChipID_Doc2k 0x20 119*cfa460adSWilliam Juul #define DOC_ChipID_Doc2kTSOP 0x21 /* internal number for MTD */ 120012771d8Swdenk #define DOC_ChipID_DocMil 0x30 121*cfa460adSWilliam Juul #define DOC_ChipID_DocMilPlus32 0x40 122*cfa460adSWilliam Juul #define DOC_ChipID_DocMilPlus16 0x41 123012771d8Swdenk 124012771d8Swdenk #define CDSN_CTRL_FR_B 0x80 125*cfa460adSWilliam Juul #define CDSN_CTRL_FR_B0 0x40 126*cfa460adSWilliam Juul #define CDSN_CTRL_FR_B1 0x80 127*cfa460adSWilliam Juul 128012771d8Swdenk #define CDSN_CTRL_ECC_IO 0x20 129012771d8Swdenk #define CDSN_CTRL_FLASH_IO 0x10 130012771d8Swdenk #define CDSN_CTRL_WP 0x08 131012771d8Swdenk #define CDSN_CTRL_ALE 0x04 132012771d8Swdenk #define CDSN_CTRL_CLE 0x02 133012771d8Swdenk #define CDSN_CTRL_CE 0x01 134012771d8Swdenk 135012771d8Swdenk #define DOC_ECC_RESET 0 136012771d8Swdenk #define DOC_ECC_ERROR 0x80 137012771d8Swdenk #define DOC_ECC_RW 0x20 138012771d8Swdenk #define DOC_ECC__EN 0x08 139012771d8Swdenk #define DOC_TOGGLE_BIT 0x04 140012771d8Swdenk #define DOC_ECC_RESV 0x02 141012771d8Swdenk #define DOC_ECC_IGNORE 0x01 142012771d8Swdenk 143*cfa460adSWilliam Juul #define DOC_FLASH_CE 0x80 144*cfa460adSWilliam Juul #define DOC_FLASH_WP 0x40 145*cfa460adSWilliam Juul #define DOC_FLASH_BANK 0x02 146*cfa460adSWilliam Juul 147012771d8Swdenk /* We have to also set the reserved bit 1 for enable */ 148012771d8Swdenk #define DOC_ECC_EN (DOC_ECC__EN | DOC_ECC_RESV) 149012771d8Swdenk #define DOC_ECC_DIS (DOC_ECC_RESV) 150012771d8Swdenk 1512fc000d7SMarian Balakowicz struct Nand { 1522fc000d7SMarian Balakowicz char floor, chip; 1532fc000d7SMarian Balakowicz unsigned long curadr; 1542fc000d7SMarian Balakowicz unsigned char curmode; 1552fc000d7SMarian Balakowicz /* Also some erase/write/pipeline info when we get that far */ 1562fc000d7SMarian Balakowicz }; 1572fc000d7SMarian Balakowicz 158*cfa460adSWilliam Juul #define MAX_FLOORS 4 159*cfa460adSWilliam Juul #define MAX_CHIPS 4 160*cfa460adSWilliam Juul 161*cfa460adSWilliam Juul #define MAX_FLOORS_MIL 1 162*cfa460adSWilliam Juul #define MAX_CHIPS_MIL 1 163*cfa460adSWilliam Juul 164*cfa460adSWilliam Juul #define MAX_FLOORS_MPLUS 2 165*cfa460adSWilliam Juul #define MAX_CHIPS_MPLUS 1 166*cfa460adSWilliam Juul 167*cfa460adSWilliam Juul #define ADDR_COLUMN 1 168*cfa460adSWilliam Juul #define ADDR_PAGE 2 169*cfa460adSWilliam Juul #define ADDR_COLUMN_PAGE 3 170*cfa460adSWilliam Juul 171012771d8Swdenk struct DiskOnChip { 172012771d8Swdenk unsigned long physadr; 173*cfa460adSWilliam Juul void __iomem *virtadr; 174012771d8Swdenk unsigned long totlen; 175*cfa460adSWilliam Juul unsigned char ChipID; /* Type of DiskOnChip */ 176012771d8Swdenk int ioreg; 177012771d8Swdenk 178012771d8Swdenk unsigned long mfr; /* Flash IDs - only one type of flash per device */ 179012771d8Swdenk unsigned long id; 180012771d8Swdenk int chipshift; 181012771d8Swdenk char page256; 182012771d8Swdenk char pageadrlen; 183*cfa460adSWilliam Juul char interleave; /* Internal interleaving - Millennium Plus style */ 184012771d8Swdenk unsigned long erasesize; 185012771d8Swdenk 186012771d8Swdenk int curfloor; 187012771d8Swdenk int curchip; 188012771d8Swdenk 189012771d8Swdenk int numchips; 190012771d8Swdenk struct Nand *chips; 191*cfa460adSWilliam Juul struct mtd_info *nextdoc; 192*cfa460adSWilliam Juul /* XXX U-BOOT XXX */ 193*cfa460adSWilliam Juul #if 0 194*cfa460adSWilliam Juul struct mutex lock; 195*cfa460adSWilliam Juul #endif 196012771d8Swdenk }; 197012771d8Swdenk 198012771d8Swdenk int doc_decode_ecc(unsigned char sector[512], unsigned char ecc1[6]); 199012771d8Swdenk 200*cfa460adSWilliam Juul /* XXX U-BOOT XXX */ 201*cfa460adSWilliam Juul #if 1 2022fc000d7SMarian Balakowicz /* 2032fc000d7SMarian Balakowicz * NAND Flash Manufacturer ID Codes 2042fc000d7SMarian Balakowicz */ 2052fc000d7SMarian Balakowicz #define NAND_MFR_TOSHIBA 0x98 2062fc000d7SMarian Balakowicz #define NAND_MFR_SAMSUNG 0xec 207*cfa460adSWilliam Juul #endif 2082fc000d7SMarian Balakowicz 209012771d8Swdenk #endif /* __MTD_DOC2000_H__ */ 210