1cfcc706cSMiquel Raynal /* 2cfcc706cSMiquel Raynal * Copyright (C) 2013-2014 Altera Corporation <www.altera.com> 3cfcc706cSMiquel Raynal * Copyright (C) 2009-2010, Intel Corporation and its suppliers. 4cfcc706cSMiquel Raynal * 5cfcc706cSMiquel Raynal * SPDX-License-Identifier: GPL-2.0+ 6cfcc706cSMiquel Raynal */ 7cfcc706cSMiquel Raynal 8cfcc706cSMiquel Raynal #ifndef __DENALI_H__ 9cfcc706cSMiquel Raynal #define __DENALI_H__ 10cfcc706cSMiquel Raynal 11cfcc706cSMiquel Raynal #include <linux/bitops.h> 12cfcc706cSMiquel Raynal #include <linux/mtd/rawnand.h> 13cfcc706cSMiquel Raynal #include <linux/types.h> 14*f6b2aa45SSimon Goldschmidt #include <reset.h> 15cfcc706cSMiquel Raynal 16cfcc706cSMiquel Raynal #define DEVICE_RESET 0x0 17cfcc706cSMiquel Raynal #define DEVICE_RESET__BANK(bank) BIT(bank) 18cfcc706cSMiquel Raynal 19cfcc706cSMiquel Raynal #define TRANSFER_SPARE_REG 0x10 20cfcc706cSMiquel Raynal #define TRANSFER_SPARE_REG__FLAG BIT(0) 21cfcc706cSMiquel Raynal 22cfcc706cSMiquel Raynal #define LOAD_WAIT_CNT 0x20 23cfcc706cSMiquel Raynal #define LOAD_WAIT_CNT__VALUE GENMASK(15, 0) 24cfcc706cSMiquel Raynal 25cfcc706cSMiquel Raynal #define PROGRAM_WAIT_CNT 0x30 26cfcc706cSMiquel Raynal #define PROGRAM_WAIT_CNT__VALUE GENMASK(15, 0) 27cfcc706cSMiquel Raynal 28cfcc706cSMiquel Raynal #define ERASE_WAIT_CNT 0x40 29cfcc706cSMiquel Raynal #define ERASE_WAIT_CNT__VALUE GENMASK(15, 0) 30cfcc706cSMiquel Raynal 31cfcc706cSMiquel Raynal #define INT_MON_CYCCNT 0x50 32cfcc706cSMiquel Raynal #define INT_MON_CYCCNT__VALUE GENMASK(15, 0) 33cfcc706cSMiquel Raynal 34cfcc706cSMiquel Raynal #define RB_PIN_ENABLED 0x60 35cfcc706cSMiquel Raynal #define RB_PIN_ENABLED__BANK(bank) BIT(bank) 36cfcc706cSMiquel Raynal 37cfcc706cSMiquel Raynal #define MULTIPLANE_OPERATION 0x70 38cfcc706cSMiquel Raynal #define MULTIPLANE_OPERATION__FLAG BIT(0) 39cfcc706cSMiquel Raynal 40cfcc706cSMiquel Raynal #define MULTIPLANE_READ_ENABLE 0x80 41cfcc706cSMiquel Raynal #define MULTIPLANE_READ_ENABLE__FLAG BIT(0) 42cfcc706cSMiquel Raynal 43cfcc706cSMiquel Raynal #define COPYBACK_DISABLE 0x90 44cfcc706cSMiquel Raynal #define COPYBACK_DISABLE__FLAG BIT(0) 45cfcc706cSMiquel Raynal 46cfcc706cSMiquel Raynal #define CACHE_WRITE_ENABLE 0xa0 47cfcc706cSMiquel Raynal #define CACHE_WRITE_ENABLE__FLAG BIT(0) 48cfcc706cSMiquel Raynal 49cfcc706cSMiquel Raynal #define CACHE_READ_ENABLE 0xb0 50cfcc706cSMiquel Raynal #define CACHE_READ_ENABLE__FLAG BIT(0) 51cfcc706cSMiquel Raynal 52cfcc706cSMiquel Raynal #define PREFETCH_MODE 0xc0 53cfcc706cSMiquel Raynal #define PREFETCH_MODE__PREFETCH_EN BIT(0) 54cfcc706cSMiquel Raynal #define PREFETCH_MODE__PREFETCH_BURST_LENGTH GENMASK(15, 4) 55cfcc706cSMiquel Raynal 56cfcc706cSMiquel Raynal #define CHIP_ENABLE_DONT_CARE 0xd0 57cfcc706cSMiquel Raynal #define CHIP_EN_DONT_CARE__FLAG BIT(0) 58cfcc706cSMiquel Raynal 59cfcc706cSMiquel Raynal #define ECC_ENABLE 0xe0 60cfcc706cSMiquel Raynal #define ECC_ENABLE__FLAG BIT(0) 61cfcc706cSMiquel Raynal 62cfcc706cSMiquel Raynal #define GLOBAL_INT_ENABLE 0xf0 63cfcc706cSMiquel Raynal #define GLOBAL_INT_EN_FLAG BIT(0) 64cfcc706cSMiquel Raynal 65cfcc706cSMiquel Raynal #define TWHR2_AND_WE_2_RE 0x100 66cfcc706cSMiquel Raynal #define TWHR2_AND_WE_2_RE__WE_2_RE GENMASK(5, 0) 67cfcc706cSMiquel Raynal #define TWHR2_AND_WE_2_RE__TWHR2 GENMASK(13, 8) 68cfcc706cSMiquel Raynal 69cfcc706cSMiquel Raynal #define TCWAW_AND_ADDR_2_DATA 0x110 70cfcc706cSMiquel Raynal /* The width of ADDR_2_DATA is 6 bit for old IP, 7 bit for new IP */ 71cfcc706cSMiquel Raynal #define TCWAW_AND_ADDR_2_DATA__ADDR_2_DATA GENMASK(6, 0) 72cfcc706cSMiquel Raynal #define TCWAW_AND_ADDR_2_DATA__TCWAW GENMASK(13, 8) 73cfcc706cSMiquel Raynal 74cfcc706cSMiquel Raynal #define RE_2_WE 0x120 75cfcc706cSMiquel Raynal #define RE_2_WE__VALUE GENMASK(5, 0) 76cfcc706cSMiquel Raynal 77cfcc706cSMiquel Raynal #define ACC_CLKS 0x130 78cfcc706cSMiquel Raynal #define ACC_CLKS__VALUE GENMASK(3, 0) 79cfcc706cSMiquel Raynal 80cfcc706cSMiquel Raynal #define NUMBER_OF_PLANES 0x140 81cfcc706cSMiquel Raynal #define NUMBER_OF_PLANES__VALUE GENMASK(2, 0) 82cfcc706cSMiquel Raynal 83cfcc706cSMiquel Raynal #define PAGES_PER_BLOCK 0x150 84cfcc706cSMiquel Raynal #define PAGES_PER_BLOCK__VALUE GENMASK(15, 0) 85cfcc706cSMiquel Raynal 86cfcc706cSMiquel Raynal #define DEVICE_WIDTH 0x160 87cfcc706cSMiquel Raynal #define DEVICE_WIDTH__VALUE GENMASK(1, 0) 88cfcc706cSMiquel Raynal 89cfcc706cSMiquel Raynal #define DEVICE_MAIN_AREA_SIZE 0x170 90cfcc706cSMiquel Raynal #define DEVICE_MAIN_AREA_SIZE__VALUE GENMASK(15, 0) 91cfcc706cSMiquel Raynal 92cfcc706cSMiquel Raynal #define DEVICE_SPARE_AREA_SIZE 0x180 93cfcc706cSMiquel Raynal #define DEVICE_SPARE_AREA_SIZE__VALUE GENMASK(15, 0) 94cfcc706cSMiquel Raynal 95cfcc706cSMiquel Raynal #define TWO_ROW_ADDR_CYCLES 0x190 96cfcc706cSMiquel Raynal #define TWO_ROW_ADDR_CYCLES__FLAG BIT(0) 97cfcc706cSMiquel Raynal 98cfcc706cSMiquel Raynal #define MULTIPLANE_ADDR_RESTRICT 0x1a0 99cfcc706cSMiquel Raynal #define MULTIPLANE_ADDR_RESTRICT__FLAG BIT(0) 100cfcc706cSMiquel Raynal 101cfcc706cSMiquel Raynal #define ECC_CORRECTION 0x1b0 102cfcc706cSMiquel Raynal #define ECC_CORRECTION__VALUE GENMASK(4, 0) 103cfcc706cSMiquel Raynal #define ECC_CORRECTION__ERASE_THRESHOLD GENMASK(31, 16) 104cfcc706cSMiquel Raynal 105cfcc706cSMiquel Raynal #define READ_MODE 0x1c0 106cfcc706cSMiquel Raynal #define READ_MODE__VALUE GENMASK(3, 0) 107cfcc706cSMiquel Raynal 108cfcc706cSMiquel Raynal #define WRITE_MODE 0x1d0 109cfcc706cSMiquel Raynal #define WRITE_MODE__VALUE GENMASK(3, 0) 110cfcc706cSMiquel Raynal 111cfcc706cSMiquel Raynal #define COPYBACK_MODE 0x1e0 112cfcc706cSMiquel Raynal #define COPYBACK_MODE__VALUE GENMASK(3, 0) 113cfcc706cSMiquel Raynal 114cfcc706cSMiquel Raynal #define RDWR_EN_LO_CNT 0x1f0 115cfcc706cSMiquel Raynal #define RDWR_EN_LO_CNT__VALUE GENMASK(4, 0) 116cfcc706cSMiquel Raynal 117cfcc706cSMiquel Raynal #define RDWR_EN_HI_CNT 0x200 118cfcc706cSMiquel Raynal #define RDWR_EN_HI_CNT__VALUE GENMASK(4, 0) 119cfcc706cSMiquel Raynal 120cfcc706cSMiquel Raynal #define MAX_RD_DELAY 0x210 121cfcc706cSMiquel Raynal #define MAX_RD_DELAY__VALUE GENMASK(3, 0) 122cfcc706cSMiquel Raynal 123cfcc706cSMiquel Raynal #define CS_SETUP_CNT 0x220 124cfcc706cSMiquel Raynal #define CS_SETUP_CNT__VALUE GENMASK(4, 0) 125cfcc706cSMiquel Raynal #define CS_SETUP_CNT__TWB GENMASK(17, 12) 126cfcc706cSMiquel Raynal 127cfcc706cSMiquel Raynal #define SPARE_AREA_SKIP_BYTES 0x230 128cfcc706cSMiquel Raynal #define SPARE_AREA_SKIP_BYTES__VALUE GENMASK(5, 0) 129cfcc706cSMiquel Raynal 130cfcc706cSMiquel Raynal #define SPARE_AREA_MARKER 0x240 131cfcc706cSMiquel Raynal #define SPARE_AREA_MARKER__VALUE GENMASK(15, 0) 132cfcc706cSMiquel Raynal 133cfcc706cSMiquel Raynal #define DEVICES_CONNECTED 0x250 134cfcc706cSMiquel Raynal #define DEVICES_CONNECTED__VALUE GENMASK(2, 0) 135cfcc706cSMiquel Raynal 136cfcc706cSMiquel Raynal #define DIE_MASK 0x260 137cfcc706cSMiquel Raynal #define DIE_MASK__VALUE GENMASK(7, 0) 138cfcc706cSMiquel Raynal 139cfcc706cSMiquel Raynal #define FIRST_BLOCK_OF_NEXT_PLANE 0x270 140cfcc706cSMiquel Raynal #define FIRST_BLOCK_OF_NEXT_PLANE__VALUE GENMASK(15, 0) 141cfcc706cSMiquel Raynal 142cfcc706cSMiquel Raynal #define WRITE_PROTECT 0x280 143cfcc706cSMiquel Raynal #define WRITE_PROTECT__FLAG BIT(0) 144cfcc706cSMiquel Raynal 145cfcc706cSMiquel Raynal #define RE_2_RE 0x290 146cfcc706cSMiquel Raynal #define RE_2_RE__VALUE GENMASK(5, 0) 147cfcc706cSMiquel Raynal 148cfcc706cSMiquel Raynal #define MANUFACTURER_ID 0x300 149cfcc706cSMiquel Raynal #define MANUFACTURER_ID__VALUE GENMASK(7, 0) 150cfcc706cSMiquel Raynal 151cfcc706cSMiquel Raynal #define DEVICE_ID 0x310 152cfcc706cSMiquel Raynal #define DEVICE_ID__VALUE GENMASK(7, 0) 153cfcc706cSMiquel Raynal 154cfcc706cSMiquel Raynal #define DEVICE_PARAM_0 0x320 155cfcc706cSMiquel Raynal #define DEVICE_PARAM_0__VALUE GENMASK(7, 0) 156cfcc706cSMiquel Raynal 157cfcc706cSMiquel Raynal #define DEVICE_PARAM_1 0x330 158cfcc706cSMiquel Raynal #define DEVICE_PARAM_1__VALUE GENMASK(7, 0) 159cfcc706cSMiquel Raynal 160cfcc706cSMiquel Raynal #define DEVICE_PARAM_2 0x340 161cfcc706cSMiquel Raynal #define DEVICE_PARAM_2__VALUE GENMASK(7, 0) 162cfcc706cSMiquel Raynal 163cfcc706cSMiquel Raynal #define LOGICAL_PAGE_DATA_SIZE 0x350 164cfcc706cSMiquel Raynal #define LOGICAL_PAGE_DATA_SIZE__VALUE GENMASK(15, 0) 165cfcc706cSMiquel Raynal 166cfcc706cSMiquel Raynal #define LOGICAL_PAGE_SPARE_SIZE 0x360 167cfcc706cSMiquel Raynal #define LOGICAL_PAGE_SPARE_SIZE__VALUE GENMASK(15, 0) 168cfcc706cSMiquel Raynal 169cfcc706cSMiquel Raynal #define REVISION 0x370 170cfcc706cSMiquel Raynal #define REVISION__VALUE GENMASK(15, 0) 171cfcc706cSMiquel Raynal 172cfcc706cSMiquel Raynal #define ONFI_DEVICE_FEATURES 0x380 173cfcc706cSMiquel Raynal #define ONFI_DEVICE_FEATURES__VALUE GENMASK(5, 0) 174cfcc706cSMiquel Raynal 175cfcc706cSMiquel Raynal #define ONFI_OPTIONAL_COMMANDS 0x390 176cfcc706cSMiquel Raynal #define ONFI_OPTIONAL_COMMANDS__VALUE GENMASK(5, 0) 177cfcc706cSMiquel Raynal 178cfcc706cSMiquel Raynal #define ONFI_TIMING_MODE 0x3a0 179cfcc706cSMiquel Raynal #define ONFI_TIMING_MODE__VALUE GENMASK(5, 0) 180cfcc706cSMiquel Raynal 181cfcc706cSMiquel Raynal #define ONFI_PGM_CACHE_TIMING_MODE 0x3b0 182cfcc706cSMiquel Raynal #define ONFI_PGM_CACHE_TIMING_MODE__VALUE GENMASK(5, 0) 183cfcc706cSMiquel Raynal 184cfcc706cSMiquel Raynal #define ONFI_DEVICE_NO_OF_LUNS 0x3c0 185cfcc706cSMiquel Raynal #define ONFI_DEVICE_NO_OF_LUNS__NO_OF_LUNS GENMASK(7, 0) 186cfcc706cSMiquel Raynal #define ONFI_DEVICE_NO_OF_LUNS__ONFI_DEVICE BIT(8) 187cfcc706cSMiquel Raynal 188cfcc706cSMiquel Raynal #define ONFI_DEVICE_NO_OF_BLOCKS_PER_LUN_L 0x3d0 189cfcc706cSMiquel Raynal #define ONFI_DEVICE_NO_OF_BLOCKS_PER_LUN_L__VALUE GENMASK(15, 0) 190cfcc706cSMiquel Raynal 191cfcc706cSMiquel Raynal #define ONFI_DEVICE_NO_OF_BLOCKS_PER_LUN_U 0x3e0 192cfcc706cSMiquel Raynal #define ONFI_DEVICE_NO_OF_BLOCKS_PER_LUN_U__VALUE GENMASK(15, 0) 193cfcc706cSMiquel Raynal 194cfcc706cSMiquel Raynal #define FEATURES 0x3f0 195cfcc706cSMiquel Raynal #define FEATURES__N_BANKS GENMASK(1, 0) 196cfcc706cSMiquel Raynal #define FEATURES__ECC_MAX_ERR GENMASK(5, 2) 197cfcc706cSMiquel Raynal #define FEATURES__DMA BIT(6) 198cfcc706cSMiquel Raynal #define FEATURES__CMD_DMA BIT(7) 199cfcc706cSMiquel Raynal #define FEATURES__PARTITION BIT(8) 200cfcc706cSMiquel Raynal #define FEATURES__XDMA_SIDEBAND BIT(9) 201cfcc706cSMiquel Raynal #define FEATURES__GPREG BIT(10) 202cfcc706cSMiquel Raynal #define FEATURES__INDEX_ADDR BIT(11) 203cfcc706cSMiquel Raynal 204cfcc706cSMiquel Raynal #define TRANSFER_MODE 0x400 205cfcc706cSMiquel Raynal #define TRANSFER_MODE__VALUE GENMASK(1, 0) 206cfcc706cSMiquel Raynal 207cfcc706cSMiquel Raynal #define INTR_STATUS(bank) (0x410 + (bank) * 0x50) 208cfcc706cSMiquel Raynal #define INTR_EN(bank) (0x420 + (bank) * 0x50) 209cfcc706cSMiquel Raynal /* bit[1:0] is used differently depending on IP version */ 210cfcc706cSMiquel Raynal #define INTR__ECC_UNCOR_ERR BIT(0) /* new IP */ 211cfcc706cSMiquel Raynal #define INTR__ECC_TRANSACTION_DONE BIT(0) /* old IP */ 212cfcc706cSMiquel Raynal #define INTR__ECC_ERR BIT(1) /* old IP */ 213cfcc706cSMiquel Raynal #define INTR__DMA_CMD_COMP BIT(2) 214cfcc706cSMiquel Raynal #define INTR__TIME_OUT BIT(3) 215cfcc706cSMiquel Raynal #define INTR__PROGRAM_FAIL BIT(4) 216cfcc706cSMiquel Raynal #define INTR__ERASE_FAIL BIT(5) 217cfcc706cSMiquel Raynal #define INTR__LOAD_COMP BIT(6) 218cfcc706cSMiquel Raynal #define INTR__PROGRAM_COMP BIT(7) 219cfcc706cSMiquel Raynal #define INTR__ERASE_COMP BIT(8) 220cfcc706cSMiquel Raynal #define INTR__PIPE_CPYBCK_CMD_COMP BIT(9) 221cfcc706cSMiquel Raynal #define INTR__LOCKED_BLK BIT(10) 222cfcc706cSMiquel Raynal #define INTR__UNSUP_CMD BIT(11) 223cfcc706cSMiquel Raynal #define INTR__INT_ACT BIT(12) 224cfcc706cSMiquel Raynal #define INTR__RST_COMP BIT(13) 225cfcc706cSMiquel Raynal #define INTR__PIPE_CMD_ERR BIT(14) 226cfcc706cSMiquel Raynal #define INTR__PAGE_XFER_INC BIT(15) 227cfcc706cSMiquel Raynal #define INTR__ERASED_PAGE BIT(16) 228cfcc706cSMiquel Raynal 229cfcc706cSMiquel Raynal #define PAGE_CNT(bank) (0x430 + (bank) * 0x50) 230cfcc706cSMiquel Raynal #define ERR_PAGE_ADDR(bank) (0x440 + (bank) * 0x50) 231cfcc706cSMiquel Raynal #define ERR_BLOCK_ADDR(bank) (0x450 + (bank) * 0x50) 232cfcc706cSMiquel Raynal 233cfcc706cSMiquel Raynal #define ECC_THRESHOLD 0x600 234cfcc706cSMiquel Raynal #define ECC_THRESHOLD__VALUE GENMASK(9, 0) 235cfcc706cSMiquel Raynal 236cfcc706cSMiquel Raynal #define ECC_ERROR_BLOCK_ADDRESS 0x610 237cfcc706cSMiquel Raynal #define ECC_ERROR_BLOCK_ADDRESS__VALUE GENMASK(15, 0) 238cfcc706cSMiquel Raynal 239cfcc706cSMiquel Raynal #define ECC_ERROR_PAGE_ADDRESS 0x620 240cfcc706cSMiquel Raynal #define ECC_ERROR_PAGE_ADDRESS__VALUE GENMASK(11, 0) 241cfcc706cSMiquel Raynal #define ECC_ERROR_PAGE_ADDRESS__BANK GENMASK(15, 12) 242cfcc706cSMiquel Raynal 243cfcc706cSMiquel Raynal #define ECC_ERROR_ADDRESS 0x630 244cfcc706cSMiquel Raynal #define ECC_ERROR_ADDRESS__OFFSET GENMASK(11, 0) 245cfcc706cSMiquel Raynal #define ECC_ERROR_ADDRESS__SECTOR GENMASK(15, 12) 246cfcc706cSMiquel Raynal 247cfcc706cSMiquel Raynal #define ERR_CORRECTION_INFO 0x640 248cfcc706cSMiquel Raynal #define ERR_CORRECTION_INFO__BYTE GENMASK(7, 0) 249cfcc706cSMiquel Raynal #define ERR_CORRECTION_INFO__DEVICE GENMASK(11, 8) 250cfcc706cSMiquel Raynal #define ERR_CORRECTION_INFO__UNCOR BIT(14) 251cfcc706cSMiquel Raynal #define ERR_CORRECTION_INFO__LAST_ERR BIT(15) 252cfcc706cSMiquel Raynal 253cfcc706cSMiquel Raynal #define ECC_COR_INFO(bank) (0x650 + (bank) / 2 * 0x10) 254cfcc706cSMiquel Raynal #define ECC_COR_INFO__SHIFT(bank) ((bank) % 2 * 8) 255cfcc706cSMiquel Raynal #define ECC_COR_INFO__MAX_ERRORS GENMASK(6, 0) 256cfcc706cSMiquel Raynal #define ECC_COR_INFO__UNCOR_ERR BIT(7) 257cfcc706cSMiquel Raynal 258cfcc706cSMiquel Raynal #define CFG_DATA_BLOCK_SIZE 0x6b0 259cfcc706cSMiquel Raynal 260cfcc706cSMiquel Raynal #define CFG_LAST_DATA_BLOCK_SIZE 0x6c0 261cfcc706cSMiquel Raynal 262cfcc706cSMiquel Raynal #define CFG_NUM_DATA_BLOCKS 0x6d0 263cfcc706cSMiquel Raynal 264cfcc706cSMiquel Raynal #define CFG_META_DATA_SIZE 0x6e0 265cfcc706cSMiquel Raynal 266cfcc706cSMiquel Raynal #define DMA_ENABLE 0x700 267cfcc706cSMiquel Raynal #define DMA_ENABLE__FLAG BIT(0) 268cfcc706cSMiquel Raynal 269cfcc706cSMiquel Raynal #define IGNORE_ECC_DONE 0x710 270cfcc706cSMiquel Raynal #define IGNORE_ECC_DONE__FLAG BIT(0) 271cfcc706cSMiquel Raynal 272cfcc706cSMiquel Raynal #define DMA_INTR 0x720 273cfcc706cSMiquel Raynal #define DMA_INTR_EN 0x730 274cfcc706cSMiquel Raynal #define DMA_INTR__TARGET_ERROR BIT(0) 275cfcc706cSMiquel Raynal #define DMA_INTR__DESC_COMP_CHANNEL0 BIT(1) 276cfcc706cSMiquel Raynal #define DMA_INTR__DESC_COMP_CHANNEL1 BIT(2) 277cfcc706cSMiquel Raynal #define DMA_INTR__DESC_COMP_CHANNEL2 BIT(3) 278cfcc706cSMiquel Raynal #define DMA_INTR__DESC_COMP_CHANNEL3 BIT(4) 279cfcc706cSMiquel Raynal #define DMA_INTR__MEMCOPY_DESC_COMP BIT(5) 280cfcc706cSMiquel Raynal 281cfcc706cSMiquel Raynal #define TARGET_ERR_ADDR_LO 0x740 282cfcc706cSMiquel Raynal #define TARGET_ERR_ADDR_LO__VALUE GENMASK(15, 0) 283cfcc706cSMiquel Raynal 284cfcc706cSMiquel Raynal #define TARGET_ERR_ADDR_HI 0x750 285cfcc706cSMiquel Raynal #define TARGET_ERR_ADDR_HI__VALUE GENMASK(15, 0) 286cfcc706cSMiquel Raynal 287cfcc706cSMiquel Raynal #define CHNL_ACTIVE 0x760 288cfcc706cSMiquel Raynal #define CHNL_ACTIVE__CHANNEL0 BIT(0) 289cfcc706cSMiquel Raynal #define CHNL_ACTIVE__CHANNEL1 BIT(1) 290cfcc706cSMiquel Raynal #define CHNL_ACTIVE__CHANNEL2 BIT(2) 291cfcc706cSMiquel Raynal #define CHNL_ACTIVE__CHANNEL3 BIT(3) 292cfcc706cSMiquel Raynal 293cfcc706cSMiquel Raynal struct udevice; 294cfcc706cSMiquel Raynal 295cfcc706cSMiquel Raynal struct denali_nand_info { 296cfcc706cSMiquel Raynal struct nand_chip nand; 2973d00936cSMasahiro Yamada unsigned long clk_rate; /* core clock rate */ 298cfcc706cSMiquel Raynal unsigned long clk_x_rate; /* bus interface clock rate */ 299cfcc706cSMiquel Raynal int active_bank; /* currently selected bank */ 300cfcc706cSMiquel Raynal struct udevice *dev; 301cfcc706cSMiquel Raynal uint32_t page; 302cfcc706cSMiquel Raynal void __iomem *reg; /* Register Interface */ 303cfcc706cSMiquel Raynal void __iomem *host; /* Host Data/Command Interface */ 304cfcc706cSMiquel Raynal u32 irq_mask; /* interrupts we are waiting for */ 305cfcc706cSMiquel Raynal u32 irq_status; /* interrupts that have happened */ 306cfcc706cSMiquel Raynal int irq; 307cfcc706cSMiquel Raynal void *buf; /* for syndrome layout conversion */ 308cfcc706cSMiquel Raynal dma_addr_t dma_addr; 309cfcc706cSMiquel Raynal int dma_avail; /* can support DMA? */ 310cfcc706cSMiquel Raynal int devs_per_cs; /* devices connected in parallel */ 311cfcc706cSMiquel Raynal int oob_skip_bytes; /* number of bytes reserved for BBM */ 312cfcc706cSMiquel Raynal int max_banks; 313cfcc706cSMiquel Raynal unsigned int revision; /* IP revision */ 314cfcc706cSMiquel Raynal unsigned int caps; /* IP capability (or quirk) */ 315cfcc706cSMiquel Raynal const struct nand_ecc_caps *ecc_caps; 316cfcc706cSMiquel Raynal u32 (*host_read)(struct denali_nand_info *denali, u32 addr); 317cfcc706cSMiquel Raynal void (*host_write)(struct denali_nand_info *denali, u32 addr, u32 data); 318cfcc706cSMiquel Raynal void (*setup_dma)(struct denali_nand_info *denali, dma_addr_t dma_addr, 319cfcc706cSMiquel Raynal int page, int write); 320*f6b2aa45SSimon Goldschmidt struct reset_ctl_bulk resets; 321cfcc706cSMiquel Raynal }; 322cfcc706cSMiquel Raynal 323cfcc706cSMiquel Raynal #define DENALI_CAP_HW_ECC_FIXUP BIT(0) 324cfcc706cSMiquel Raynal #define DENALI_CAP_DMA_64BIT BIT(1) 325cfcc706cSMiquel Raynal 326cfcc706cSMiquel Raynal int denali_calc_ecc_bytes(int step_size, int strength); 327cfcc706cSMiquel Raynal int denali_init(struct denali_nand_info *denali); 328cfcc706cSMiquel Raynal 329cfcc706cSMiquel Raynal #endif /* __DENALI_H__ */ 330