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