xref: /OK3568_Linux_fs/kernel/drivers/rkflash/sfc_nand.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 __SFC_NAND_H
6*4882a593Smuzhiyun #define __SFC_NAND_H
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include "flash_com.h"
9*4882a593Smuzhiyun #include "sfc.h"
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define SFC_NAND_WAIT_TIME_OUT		3
12*4882a593Smuzhiyun #define SFC_NAND_PROG_ERASE_ERROR	2
13*4882a593Smuzhiyun #define SFC_NAND_HW_ERROR		1
14*4882a593Smuzhiyun #define SFC_NAND_ECC_ERROR		NAND_ERROR
15*4882a593Smuzhiyun #define SFC_NAND_ECC_REFRESH		NAND_STS_REFRESH
16*4882a593Smuzhiyun #define SFC_NAND_ECC_OK			NAND_STS_OK
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define SFC_NAND_PAGE_MAX_SIZE		4224
19*4882a593Smuzhiyun #define SFC_NAND_SECTOR_FULL_SIZE	528
20*4882a593Smuzhiyun #define SFC_NAND_SECTOR_SIZE		512
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define FEA_READ_STATUE_MASK    (0x3 << 0)
23*4882a593Smuzhiyun #define FEA_STATUE_MODE1        0
24*4882a593Smuzhiyun #define FEA_STATUE_MODE2        1
25*4882a593Smuzhiyun #define FEA_4BIT_READ           BIT(2)
26*4882a593Smuzhiyun #define FEA_4BIT_PROG           BIT(3)
27*4882a593Smuzhiyun #define FEA_4BYTE_ADDR          BIT(4)
28*4882a593Smuzhiyun #define FEA_4BYTE_ADDR_MODE	BIT(5)
29*4882a593Smuzhiyun #define FEA_SOFT_QOP_BIT	BIT(6)
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /* Command Set */
32*4882a593Smuzhiyun #define CMD_READ_JEDECID        (0x9F)
33*4882a593Smuzhiyun #define CMD_READ_DATA           (0x03)
34*4882a593Smuzhiyun #define CMD_READ_STATUS         (0x05)
35*4882a593Smuzhiyun #define CMD_WRITE_STATUS        (0x01)
36*4882a593Smuzhiyun #define CMD_PAGE_PROG           (0x02)
37*4882a593Smuzhiyun #define CMD_SECTOR_ERASE        (0x20)
38*4882a593Smuzhiyun #define CMD_BLK64K_ERASE        (0xD8)
39*4882a593Smuzhiyun #define CMD_BLK32K_ERASE        (0x52)
40*4882a593Smuzhiyun #define CMD_CHIP_ERASE          (0xC7)
41*4882a593Smuzhiyun #define CMD_WRITE_EN            (0x06)
42*4882a593Smuzhiyun #define CMD_WRITE_DIS           (0x04)
43*4882a593Smuzhiyun #define CMD_PAGE_READ           (0x13)
44*4882a593Smuzhiyun #define CMD_GET_FEATURE         (0x0F)
45*4882a593Smuzhiyun #define CMD_SET_FEATURE         (0x1F)
46*4882a593Smuzhiyun #define CMD_PROG_LOAD           (0x02)
47*4882a593Smuzhiyun #define CMD_PROG_EXEC           (0x10)
48*4882a593Smuzhiyun #define CMD_BLOCK_ERASE         (0xD8)
49*4882a593Smuzhiyun #define CMD_READ_DATA_X2        (0x3B)
50*4882a593Smuzhiyun #define CMD_READ_DATA_X4        (0x6B)
51*4882a593Smuzhiyun #define CMD_PROG_LOAD_X4        (0x32)
52*4882a593Smuzhiyun #define CMD_READ_STATUS2        (0x35)
53*4882a593Smuzhiyun #define CMD_READ_STATUS3        (0x15)
54*4882a593Smuzhiyun #define CMD_WRITE_STATUS2       (0x31)
55*4882a593Smuzhiyun #define CMD_WRITE_STATUS3       (0x11)
56*4882a593Smuzhiyun #define CMD_FAST_READ_X1        (0x0B)  /* X1 cmd, X1 addr, X1 data */
57*4882a593Smuzhiyun #define CMD_FAST_READ_X2        (0x3B)  /* X1 cmd, X1 addr, X2 data */
58*4882a593Smuzhiyun /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
59*4882a593Smuzhiyun #define CMD_FAST_READ_X4        (0x6B)
60*4882a593Smuzhiyun /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
61*4882a593Smuzhiyun #define CMD_FAST_4READ_X4       (0x6C)
62*4882a593Smuzhiyun /* X1 cmd, X4 addr, X4 data SUPPORT EON GD MARCONIX WINBOND */
63*4882a593Smuzhiyun #define CMD_FAST_READ_A4        (0xEB)
64*4882a593Smuzhiyun /* X1 cmd, X1 addr, X4 data, SUPPORT GD WINBOND */
65*4882a593Smuzhiyun #define CMD_PAGE_PROG_X4        (0x32)
66*4882a593Smuzhiyun /* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */
67*4882a593Smuzhiyun #define CMD_PAGE_PROG_A4        (0x38)
68*4882a593Smuzhiyun #define CMD_RESET_NAND          (0xFF)
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define CMD_ENTER_4BYTE_MODE    (0xB7)
71*4882a593Smuzhiyun #define CMD_EXIT_4BYTE_MODE     (0xE9)
72*4882a593Smuzhiyun #define CMD_ENABLE_RESER	(0x66)
73*4882a593Smuzhiyun #define CMD_RESET_DEVICE	(0x99)
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun struct SFNAND_DEV {
76*4882a593Smuzhiyun 	u32 capacity;
77*4882a593Smuzhiyun 	u32 block_size;
78*4882a593Smuzhiyun 	u16 page_size;
79*4882a593Smuzhiyun 	u8 manufacturer;
80*4882a593Smuzhiyun 	u8 mem_type;
81*4882a593Smuzhiyun 	u8 read_lines;
82*4882a593Smuzhiyun 	u8 prog_lines;
83*4882a593Smuzhiyun 	u8 page_read_cmd;
84*4882a593Smuzhiyun 	u8 page_prog_cmd;
85*4882a593Smuzhiyun 	u8 *recheck_buffer;
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun struct nand_mega_area {
89*4882a593Smuzhiyun 	u8 off0;
90*4882a593Smuzhiyun 	u8 off1;
91*4882a593Smuzhiyun 	u8 off2;
92*4882a593Smuzhiyun 	u8 off3;
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun struct nand_info {
96*4882a593Smuzhiyun 	u8 id0;
97*4882a593Smuzhiyun 	u8 id1;
98*4882a593Smuzhiyun 	u8 id2;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	u16 sec_per_page;
101*4882a593Smuzhiyun 	u16 page_per_blk;
102*4882a593Smuzhiyun 	u16 plane_per_die;
103*4882a593Smuzhiyun 	u16 blk_per_plane;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	u8 feature;
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	u8 density;  /* (1 << density) sectors*/
108*4882a593Smuzhiyun 	u8 max_ecc_bits;
109*4882a593Smuzhiyun 	u8 has_qe_bits;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	struct nand_mega_area meta;
112*4882a593Smuzhiyun 	u32 (*ecc_status)(void);
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun extern struct nand_phy_info	g_nand_phy_info;
116*4882a593Smuzhiyun extern struct nand_ops		g_nand_ops;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun u32 sfc_nand_init(void);
119*4882a593Smuzhiyun void sfc_nand_deinit(void);
120*4882a593Smuzhiyun int sfc_nand_read_id(u8 *buf);
121*4882a593Smuzhiyun u32 sfc_nand_erase_block(u8 cs, u32 addr);
122*4882a593Smuzhiyun u32 sfc_nand_prog_page(u8 cs, u32 addr, u32 *p_data, u32 *p_spare);
123*4882a593Smuzhiyun u32 sfc_nand_read_page(u8 cs, u32 addr, u32 *p_data, u32 *p_spare);
124*4882a593Smuzhiyun u32 sfc_nand_prog_page_raw(u8 cs, u32 addr, u32 *p_page_buf);
125*4882a593Smuzhiyun u32 sfc_nand_read_page_raw(u8 cs, u32 addr, u32 *p_page_buf);
126*4882a593Smuzhiyun u32 sfc_nand_check_bad_block(u8 cs, u32 addr);
127*4882a593Smuzhiyun u32 sfc_nand_mark_bad_block(u8 cs, u32 addr);
128*4882a593Smuzhiyun void sfc_nand_ftl_ops_init(void);
129*4882a593Smuzhiyun struct SFNAND_DEV *sfc_nand_get_private_dev(void);
130*4882a593Smuzhiyun struct nand_info *sfc_nand_get_nand_info(void);
131*4882a593Smuzhiyun u32 sfc_nand_read(u32 row, u32 *p_page_buf, u32 column, u32 len);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #endif
134