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