xref: /OK3568_Linux_fs/kernel/drivers/rkflash/flash.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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