1 /* 2 * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd 3 * 4 * SPDX-License-Identifier: GPL-2.0 5 */ 6 7 #ifndef __NAND_H 8 #define __NAND_H 9 10 #include <asm/io.h> 11 12 #define nandc_writel(v, offs) writel((v), (offs) + nandc_base) 13 #define nandc_readl(offs) readl((offs) + nandc_base) 14 15 #define NANDC_READ 0 16 #define NANDC_WRITE 1 17 #define RK3326_NANDC_VER 0x56393030 18 19 /* INT ID */ 20 enum NANDC_IRQ_NUM_T { 21 NC_IRQ_DMA = 0, 22 NC_IRQ_FRDY, 23 NC_IRQ_BCHERR, 24 NC_IRQ_BCHFAIL, 25 NC_IRQ_LLP 26 }; 27 28 enum ENUM_NANDC_BCH_CFG { 29 NC_BCH_70 = 0, 30 NC_BCH_24, 31 NC_BCH_40, 32 NC_BCH_60, 33 }; 34 35 union FM_CTL_T { 36 u32 d32; 37 struct { 38 unsigned cs : 8; /* bits[0:7] */ 39 unsigned wp : 1; /* bits[8] */ 40 unsigned rdy : 1; /* bits[9] */ 41 unsigned fifo_empty : 1; /* bits[10] */ 42 unsigned reserved11 : 1; /* bits[11] */ 43 unsigned dwidth : 1; /* bits[12] */ 44 unsigned tm : 1; /* bits[13] */ 45 unsigned onficlk_en : 1; /* bits[14] */ 46 unsigned toggle_en : 1; /* bits[15] */ 47 unsigned flash_abort_en : 1; /* bits[16] */ 48 unsigned flash_abort_clear : 1; /* bits[17] */ 49 unsigned reserved18_23 : 6; /* bits[18:23] */ 50 unsigned read_delay : 3; /* bits[24:26] */ 51 unsigned reserved27_31 : 5; /* bits[27:31] */ 52 } V6; 53 struct { 54 unsigned cs : 8; 55 unsigned wp : 1; 56 unsigned frdy : 1; 57 unsigned fifo_empth_flash : 1; 58 unsigned reserved11_12 : 2; 59 unsigned tm : 1; 60 unsigned syn_clken : 1; 61 unsigned syn_mode : 1; 62 unsigned flash_abort_en : 1; 63 unsigned flash_abort_clear : 1; 64 unsigned sif_read_delay : 3; 65 unsigned io_mux : 3; 66 unsigned reserved24_31 : 8; 67 } V9; 68 }; 69 70 union FM_WAIT_T { 71 u32 d32; 72 struct { 73 unsigned csrw : 5; 74 unsigned rwpw : 6; 75 unsigned rdy : 1; 76 unsigned rwcs : 6; 77 unsigned reserved18_23 : 6; 78 unsigned fmw_dly : 6; 79 unsigned fmw_dly_en : 1; 80 unsigned reserved31_31 : 1; 81 } V6; 82 struct { 83 unsigned rwcs : 5; 84 unsigned rwpw : 6; 85 unsigned hard_rdy : 1; 86 unsigned csrw : 6; 87 unsigned wait_frdy_dly : 5; 88 unsigned reserved23_23 : 1; 89 unsigned fmw_dly : 6; 90 unsigned fmw_dly_en : 1; 91 unsigned reserved31_31 : 1; 92 } V9; 93 }; 94 95 union FL_CTL_T { 96 u32 d32; 97 struct { 98 unsigned rst : 1; 99 unsigned rdn : 1; 100 unsigned start : 1; 101 unsigned dma : 1; 102 unsigned st_addr : 1; 103 unsigned tr_count : 2; 104 unsigned rdy_ignore : 1; 105 /* unsigned int_clr : 1; */ 106 /* unsigned int_en : 1; */ 107 unsigned reserved8_9 : 2; 108 unsigned cor_en : 1; 109 unsigned lba_en : 1; 110 unsigned spare_size : 7; 111 unsigned reserved19 : 1; 112 unsigned tr_rdy : 1; 113 unsigned page_size : 1; 114 unsigned page_num : 6; 115 unsigned low_power : 1; 116 unsigned async_tog_mix : 1; 117 unsigned reserved30_31 : 2; 118 } V6; 119 struct { 120 unsigned flash_rst : 1; 121 unsigned flash_rdn : 1; 122 unsigned flash_st : 1; 123 unsigned bypass : 1; 124 unsigned st_addr : 1; 125 unsigned tr_count : 2; 126 unsigned flash_st_mod : 1; 127 unsigned not_tran_data : 1; 128 unsigned tran_seed : 1; 129 unsigned cor_able : 1; 130 unsigned lba_en : 1; 131 unsigned lba_spare_sel : 1; 132 unsigned reserved13_18 : 6; 133 unsigned bchst_trans : 1; 134 unsigned tr_rdy : 1; 135 unsigned page_size : 1; 136 unsigned page_num : 6; 137 unsigned low_power : 1; 138 unsigned async_tog_mix : 1; 139 unsigned bypass_fifo_mode : 1; 140 unsigned reserved31_31 : 1; 141 } V9; 142 }; 143 144 union BCH_CTL_T { 145 u32 d32; 146 struct { 147 unsigned rst : 1; 148 unsigned reserved : 1; 149 unsigned addr_not_care : 1; 150 unsigned power_down : 1; 151 unsigned bch_mode : 1; /* 0-16bit/1KB, 1-24bit/1KB */ 152 unsigned region : 3; 153 unsigned addr : 8; 154 unsigned bchpage : 1; 155 unsigned reserved17 : 1; 156 unsigned bch_mode1 : 1; 157 unsigned thres : 8; 158 unsigned reserved27_31 : 5; 159 } V6; 160 struct { 161 unsigned bchrst : 1; 162 unsigned wcnt_clear : 1; 163 unsigned reserved2 : 1; 164 unsigned bchepd : 1; 165 unsigned reserved4_15 : 12; 166 unsigned bchpage : 1; 167 unsigned bchthre : 8; 168 unsigned bchmode : 3; 169 unsigned reserved28_31 : 4; 170 } V9; 171 }; 172 173 union BCH_ST_T { 174 u32 d32; 175 struct { 176 unsigned errf0 : 1; 177 unsigned done0 : 1; 178 unsigned fail0 : 1; 179 unsigned err_bits0 : 5; 180 unsigned err_bits_low0 : 5; 181 unsigned errf1 : 1; 182 unsigned done1 : 1; 183 unsigned fail1 : 1; 184 unsigned err_bits1 : 5; 185 unsigned err_bits_low1 : 5; 186 unsigned rdy : 1; 187 /* unsigned cnt : 1; */ 188 unsigned err_bits0_5 : 1; 189 unsigned err_bits_low0_5 : 1; 190 unsigned err_bits1_5 : 1; 191 unsigned err_bits_low1_5 : 1; 192 unsigned reserved31_31 : 1; 193 } V6; 194 struct { 195 unsigned errf0 : 1; 196 unsigned done0 : 1; 197 unsigned fail0 : 1; 198 unsigned err_bits0 : 7; 199 unsigned all_f_flag0 : 1; 200 unsigned reserved11_15 : 5; 201 unsigned errf1 : 1; 202 unsigned done1 : 1; 203 unsigned fail1 : 1; 204 unsigned err_bits1 : 7; 205 unsigned all_f_flag1 : 1; 206 unsigned reserved27_30 : 4; 207 unsigned bch_ready_flag: 1; 208 } V9; 209 }; 210 211 union MTRANS_CFG_T { 212 u32 d32; 213 struct { 214 unsigned ahb_wr_st : 1; 215 unsigned ahb_wr : 1; 216 unsigned bus_mode : 1; 217 unsigned hsize : 3; 218 unsigned burst : 3; 219 unsigned incr_num : 5; 220 unsigned fl_pwd : 1; 221 unsigned ahb_rst : 1; 222 unsigned reserved16_31 : 16; 223 } V6; 224 struct { 225 unsigned ahb_wr_st : 1; 226 unsigned ahb_wr : 1; 227 unsigned bus_mode : 1; 228 unsigned hsize : 3; 229 unsigned burst : 3; 230 unsigned incr_num : 5; 231 unsigned fl_pwd : 1; 232 unsigned ahb_rst : 1; 233 unsigned redundance_size : 11; 234 unsigned reserved27_31 : 5; 235 } V9; 236 }; 237 238 union MTRANS_STAT_T { 239 u32 d32; 240 struct { 241 unsigned bus_err : 16; 242 unsigned mtrans_cnt : 5; 243 unsigned reserved21_31 : 11; 244 } V6; 245 struct { 246 unsigned bus_err : 16; 247 unsigned mtrans_cnt : 6; 248 unsigned reserved22_31 : 10; 249 } V9; 250 }; 251 252 /* NANDC Registers */ 253 #define NANDC_FMCTL 0x0 254 #define NANDC_FMWAIT 0x4 255 #define NANDC_FLCTL 0x8 256 #define NANDC_BCHCTL 0xc 257 #define NANDC_MTRANS_CFG 0x10 258 #define NANDC_MTRANS_SADDR0 0x14 259 #define NANDC_MTRANS_SADDR1 0x18 260 #define NANDC_MTRANS_STAT 0x1c 261 #define NANDC_DLL_CTL_REG0 0x130 262 #define NANDC_DLL_CTL_REG1 0x134 263 #define NANDC_DLL_OBS_REG0 0x138 264 #define NANDC_RANDMZ_CFG 0x150 265 #define NANDC_EBI_EN 0x154 266 #define NANDC_FMWAIT_SYN 0x158 267 #define NANDC_MTRANS_STAT2 0x15c 268 #define NANDC_NANDC_VER 0x160 269 #define NANDC_LLP_CTL 0x164 270 #define NANDC_LLP_STAT 0x168 271 #define NANDC_INTEN 0x16c 272 #define NANDC_INTCLR 0x170 273 #define NANDC_INTST 0x174 274 #define NANDC_SPARE0 0x200 275 #define NANDC_SPARE1 0x230 276 277 #define NANDC_BCHST(i) ({ \ 278 u32 x = (i); \ 279 4 * x + x < 8 ? 0x20 : 0x520; }) 280 281 #define NANDC_CHIP_DATA(id) (0x800 + (id) * 0x100) 282 #define NANDC_CHIP_ADDR(id) (0x800 + (id) * 0x100 + 0x4) 283 #define NANDC_CHIP_CMD(id) (0x800 + (id) * 0x100 + 0x8) 284 285 #define NANDC_V9_FMCTL 0x0 286 #define NANDC_V9_FMWAIT 0x4 287 #define NANDC_V9_FLCTL 0x10 288 #define NANDC_V9_BCHCTL 0x20 289 #define NANDC_V9_MTRANS_CFG 0x30 290 #define NANDC_V9_MTRANS_SADDR0 0x34 291 #define NANDC_V9_MTRANS_SADDR1 0x38 292 #define NANDC_V9_MTRANS_STAT 0x40 293 #define NANDC_V9_MTRANS_STAT2 0x44 294 #define NANDC_V9_NANDC_VER 0x80 295 296 #define NANDC_V9_INTEN 0x120 297 #define NANDC_V9_INTCLR 0x124 298 #define NANDC_V9_INTST 0x128 299 #define NANDC_V9_SPARE0 0x200 300 #define NANDC_V9_SPARE1 0x204 301 #define NANDC_V9_RANDMZ_CFG 0x208 302 #define NANDC_V9_BCHST(i) (0x150 + (i) * 4) 303 304 #define NANDC_V9_CHIP_DATA(id) (0x800 + (id) * 0x100) 305 #define NANDC_V9_CHIP_ADDR(id) (0x800 + (id) * 0x100 + 0x4) 306 #define NANDC_V9_CHIP_CMD(id) (0x800 + (id) * 0x100 + 0x8) 307 308 struct MASTER_INFO_T { 309 u32 *page_buf; /* [DATA_LEN]; */ 310 u32 *spare_buf; /* [DATA_LEN / (1024/128)]; */ 311 u32 *page_vir; /* page_buf_vir_addr */ 312 u32 *spare_vir; /* spare_buf_vir_addr */ 313 u32 page_phy; /* page_buf_phy_addr */ 314 u32 spare_phy; /* spare_buf_phy_addr*/ 315 u32 mapped; 316 u32 cnt; 317 }; 318 319 struct CHIP_MAP_INFO_T { 320 u32 *nandc_addr; 321 u32 chip_num; 322 }; 323 324 unsigned long rknandc_dma_map_single(unsigned long ptr, 325 int size, 326 int dir); 327 void rknandc_dma_unmap_single(unsigned long ptr, 328 int size, 329 int dir); 330 331 void nandc_init(void __iomem *nandc_addr); 332 void nandc_flash_cs(u8 chip_sel); 333 void nandc_flash_de_cs(u8 chip_sel); 334 u32 nandc_wait_flash_ready(u8 chip_sel); 335 u32 nandc_delayns(u32 count); 336 u32 nandc_xfer_data(u8 chip_sel, 337 u8 dir, 338 u8 sector_count, 339 u32 *p_data, 340 u32 *p_spare); 341 void nandc_randmz_sel(u8 chip_sel, u32 randmz_seed); 342 void nandc_bch_sel(u8 bits); 343 void nandc_read_not_case_busy_en(u8 en); 344 void nandc_time_cfg(u32 ns); 345 void nandc_clean_irq(void); 346 u8 nandc_get_version(void); 347 348 #endif 349