1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun /* Copyright (c) 2018 Rockchip Electronics Co. Ltd. */ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifndef __FLASH_H 6*4882a593Smuzhiyun #define __FLASH_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef BIT 9*4882a593Smuzhiyun #define BIT(nr) (1 << (nr)) 10*4882a593Smuzhiyun #endif 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define MAX_FLASH_NUM 2 13*4882a593Smuzhiyun #define MAX_IDB_RESERVED_BLOCK 12 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define NAND_CACHE_READ_EN BIT(0) 16*4882a593Smuzhiyun #define NAND_CACHE_RANDOM_READ_EN BIT(1) 17*4882a593Smuzhiyun #define NAND_CACHE_PROG_EN BIT(2) 18*4882a593Smuzhiyun #define NAND_MULTI_READ_EN BIT(3) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define NAND_MULTI_PROG_EN BIT(4) 21*4882a593Smuzhiyun #define NAND_INTERLEAVE_EN BIT(5) 22*4882a593Smuzhiyun #define NAND_READ_RETRY_EN BIT(6) 23*4882a593Smuzhiyun #define NAND_RANDOMIZER_EN BIT(7) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define NAND_INTER_MODE_OFFSET (0x8) 26*4882a593Smuzhiyun #define NAND_INTER_MODE_MARK (0x07) 27*4882a593Smuzhiyun #define NAND_INTER_SDR_EN BIT(0) 28*4882a593Smuzhiyun #define NAND_INTER_ONFI_EN BIT(1) 29*4882a593Smuzhiyun #define NAND_INTER_TOGGLE_EN BIT(2) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define NAND_SDR_EN BIT(8) 32*4882a593Smuzhiyun #define NAND_ONFI_EN BIT(9) 33*4882a593Smuzhiyun #define NAND_TOGGLE_EN BIT(10) 34*4882a593Smuzhiyun #define NAND_UNIQUE_ID_EN BIT(11) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define RESET_CMD 0xff 37*4882a593Smuzhiyun #define READ_ID_CMD 0x90 38*4882a593Smuzhiyun #define READ_STATUS_CMD 0x70 39*4882a593Smuzhiyun #define PAGE_PROG_CMD 0x8010 40*4882a593Smuzhiyun #define BLOCK_ERASE_CMD 0x60d0 41*4882a593Smuzhiyun #define READ_CMD 0x0030 42*4882a593Smuzhiyun #define READ_DP_OUT_CMD 0x05E0 43*4882a593Smuzhiyun #define READ_ECC_STATUS_CMD 0x7A 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define SAMSUNG 0x00 /* SAMSUNG */ 46*4882a593Smuzhiyun #define TOSHIBA 0x01 /* TOSHIBA */ 47*4882a593Smuzhiyun #define HYNIX 0x02 /* HYNIX */ 48*4882a593Smuzhiyun #define INFINEON 0x03 /* INFINEON */ 49*4882a593Smuzhiyun #define MICRON 0x04 /* MICRON */ 50*4882a593Smuzhiyun #define RENESAS 0x05 /* RENESAS */ 51*4882a593Smuzhiyun #define ST 0x06 /* ST */ 52*4882a593Smuzhiyun #define INTEL 0x07 /* intel */ 53*4882a593Smuzhiyun #define Sandisk 0x08 /* Sandisk */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define RR_NONE 0x00 56*4882a593Smuzhiyun #define RR_HY_1 0x01 /* hynix H27UCG8T2M */ 57*4882a593Smuzhiyun #define RR_HY_2 0x02 /* hynix H27UBG08U0B */ 58*4882a593Smuzhiyun #define RR_HY_3 0x03 /* hynix H27UCG08U0B H27UBG08U0C */ 59*4882a593Smuzhiyun #define RR_HY_4 0x04 /* hynix H27UCG8T2A */ 60*4882a593Smuzhiyun #define RR_HY_5 0x05 /* hynix H27UCG8T2E */ 61*4882a593Smuzhiyun #define RR_HY_6 0x06 /* hynix H27QCG8T2F5R-BCG */ 62*4882a593Smuzhiyun #define RR_MT_1 0x11 /* micron */ 63*4882a593Smuzhiyun #define RR_MT_2 0x12 /* micron L94C L95B */ 64*4882a593Smuzhiyun #define RR_TH_1 0x21 /* toshiba */ 65*4882a593Smuzhiyun #define RR_TH_2 0x22 /* toshiba */ 66*4882a593Smuzhiyun #define RR_TH_3 0x23 /* toshiba */ 67*4882a593Smuzhiyun #define RR_SS_1 0x31 /* samsung */ 68*4882a593Smuzhiyun #define RR_SD_1 0x41 /* Sandisk */ 69*4882a593Smuzhiyun #define RR_SD_2 0x42 /* Sandisk */ 70*4882a593Smuzhiyun #define RR_SD_3 0x43 /* Sandisk */ 71*4882a593Smuzhiyun #define RR_SD_4 0x44 /* Sandisk */ 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* 0 1 2 3 4 5 6 7 8 9 slc */ 74*4882a593Smuzhiyun #define LSB_0 0 75*4882a593Smuzhiyun /* 0 1 2 3 6 7 A B E F hynix, micron 74A */ 76*4882a593Smuzhiyun #define LSB_1 1 77*4882a593Smuzhiyun /* 0 1 3 5 7 9 B D toshiba samsung sandisk */ 78*4882a593Smuzhiyun #define LSB_2 2 79*4882a593Smuzhiyun /* 0 1 2 3 4 5 8 9 C D 10 11 micron 84A */ 80*4882a593Smuzhiyun #define LSB_3 3 81*4882a593Smuzhiyun /* 0 1 2 3 4 5 7 8 A B E F micron L95B */ 82*4882a593Smuzhiyun #define LSB_4 4 83*4882a593Smuzhiyun /* 0 1 2 3 4 5 8 9 14 15 20 21 26 27 micron B74A TLC */ 84*4882a593Smuzhiyun #define LSB_6 6 85*4882a593Smuzhiyun /* 0 3 6 9 C F 12 15 18 15 1B 1E 21 24 K9ABGD8U0C TLC */ 86*4882a593Smuzhiyun #define LSB_7 7 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* BadBlockFlagMode */ 89*4882a593Smuzhiyun /* first spare @ first page of each blocks */ 90*4882a593Smuzhiyun #define BBF_1 1 91*4882a593Smuzhiyun /* first spare @ last page of each blocks */ 92*4882a593Smuzhiyun #define BBF_2 2 93*4882a593Smuzhiyun /* first spare @ first and last page of each blocks */ 94*4882a593Smuzhiyun #define BBF_11 3 95*4882a593Smuzhiyun /* sandisk 15nm flash prog first page without data and check status */ 96*4882a593Smuzhiyun #define BBF_3 4 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #define MPM_0 0 /* block 0 ~ 1 */ 99*4882a593Smuzhiyun #define MPM_1 1 /* block 0 ~ 2048... */ 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun struct NAND_PARA_INFO_T { 102*4882a593Smuzhiyun u8 id_bytes; 103*4882a593Smuzhiyun u8 nand_id[6]; 104*4882a593Smuzhiyun u8 vendor; 105*4882a593Smuzhiyun u8 die_per_chip; 106*4882a593Smuzhiyun u8 sec_per_page; 107*4882a593Smuzhiyun u16 page_per_blk; 108*4882a593Smuzhiyun u8 cell; /* 1 slc , 2 mlc , 3 tlc */ 109*4882a593Smuzhiyun u8 plane_per_die; 110*4882a593Smuzhiyun u16 blk_per_plane; 111*4882a593Smuzhiyun u16 operation_opt; 112*4882a593Smuzhiyun u8 lsb_mode; 113*4882a593Smuzhiyun u8 read_retry_mode; 114*4882a593Smuzhiyun u8 ecc_bits; 115*4882a593Smuzhiyun u8 access_freq; 116*4882a593Smuzhiyun u8 opt_mode; 117*4882a593Smuzhiyun u8 die_gap; 118*4882a593Smuzhiyun u8 bad_block_mode; 119*4882a593Smuzhiyun u8 multi_plane_mode; 120*4882a593Smuzhiyun u8 reversd2[6]; /* 32 bytes */ 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun extern struct nand_phy_info g_nand_phy_info; 124*4882a593Smuzhiyun extern struct nand_ops g_nand_ops; 125*4882a593Smuzhiyun extern void __iomem *nandc_base; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun void nandc_flash_get_id(u8 cs, void *buf); 128*4882a593Smuzhiyun void nandc_flash_reset(u8 chip_sel); 129*4882a593Smuzhiyun u32 nandc_flash_init(void __iomem *nandc_addr); 130*4882a593Smuzhiyun u32 nandc_flash_deinit(void); 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #endif 133