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