xref: /rk3399_rockchip-uboot/drivers/rkflash/sfc_nor.h (revision c84f0ed80a3fa9a7c470bbcb6747b763280506fa)
1ad309a88SDingqiang Lin /*
2ad309a88SDingqiang Lin  * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
3ad309a88SDingqiang Lin  *
4ba0501acSDingqiang Lin  * SPDX-License-Identifier:	GPL-2.0
5ad309a88SDingqiang Lin  */
6ad309a88SDingqiang Lin 
7*c84f0ed8SJon Lin #ifndef _SFC_NOR_H
8*c84f0ed8SJon Lin #define _SFC_NOR_H
9ad309a88SDingqiang Lin 
10ad309a88SDingqiang Lin #include "sfc.h"
11ad309a88SDingqiang Lin 
12ad309a88SDingqiang Lin #define NOR_PAGE_SIZE		256
13ad309a88SDingqiang Lin #define NOR_BLOCK_SIZE		(64 * 1024)
14ad309a88SDingqiang Lin #define NOR_SECS_BLK		(NOR_BLOCK_SIZE / 512)
15ad309a88SDingqiang Lin #define NOR_SECS_PAGE		4
16ad309a88SDingqiang Lin 
17ad309a88SDingqiang Lin #define FEA_READ_STATUE_MASK	(0x3 << 0)
18ad309a88SDingqiang Lin #define FEA_STATUE_MODE1	0
19ad309a88SDingqiang Lin #define FEA_STATUE_MODE2	1
20ad309a88SDingqiang Lin #define FEA_4BIT_READ		BIT(2)
21ad309a88SDingqiang Lin #define FEA_4BIT_PROG		BIT(3)
22ad309a88SDingqiang Lin #define FEA_4BYTE_ADDR		BIT(4)
23ad309a88SDingqiang Lin #define FEA_4BYTE_ADDR_MODE	BIT(5)
24ad309a88SDingqiang Lin 
25ad309a88SDingqiang Lin /*Command Set*/
26ad309a88SDingqiang Lin #define CMD_READ_JEDECID        (0x9F)
27ad309a88SDingqiang Lin #define CMD_READ_DATA           (0x03)
28ad309a88SDingqiang Lin #define CMD_READ_STATUS         (0x05)
29ad309a88SDingqiang Lin #define CMD_WRITE_STATUS        (0x01)
30ad309a88SDingqiang Lin #define CMD_PAGE_PROG           (0x02)
31ad309a88SDingqiang Lin #define CMD_SECTOR_ERASE        (0x20)
32ad309a88SDingqiang Lin #define CMD_BLK64K_ERASE        (0xD8)
33ad309a88SDingqiang Lin #define CMD_BLK32K_ERASE        (0x52)
34ad309a88SDingqiang Lin #define CMD_CHIP_ERASE          (0xC7)
35ad309a88SDingqiang Lin #define CMD_WRITE_EN            (0x06)
36ad309a88SDingqiang Lin #define CMD_WRITE_DIS           (0x04)
37ad309a88SDingqiang Lin #define CMD_PAGE_READ           (0x13)
38ad309a88SDingqiang Lin #define CMD_GET_FEATURE         (0x0F)
39ad309a88SDingqiang Lin #define CMD_SET_FEATURE         (0x1F)
40ad309a88SDingqiang Lin #define CMD_PROG_LOAD           (0x02)
41ad309a88SDingqiang Lin #define CMD_PROG_EXEC           (0x10)
42ad309a88SDingqiang Lin #define CMD_BLOCK_ERASE         (0xD8)
43ad309a88SDingqiang Lin #define CMD_READ_DATA_X2        (0x3B)
44ad309a88SDingqiang Lin #define CMD_READ_DATA_X4        (0x6B)
45ad309a88SDingqiang Lin #define CMD_PROG_LOAD_X4        (0x32)
46ad309a88SDingqiang Lin #define CMD_READ_STATUS2        (0x35)
47ad309a88SDingqiang Lin #define CMD_READ_STATUS3        (0x15)
48ad309a88SDingqiang Lin #define CMD_WRITE_STATUS2       (0x31)
49ad309a88SDingqiang Lin #define CMD_WRITE_STATUS3       (0x11)
50ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X1 data */
51ad309a88SDingqiang Lin #define CMD_FAST_READ_X1        (0x0B)
52ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X2 data */
53ad309a88SDingqiang Lin #define CMD_FAST_READ_X2        (0x3B)
54ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
55ad309a88SDingqiang Lin #define CMD_FAST_READ_X4        (0x6B)
56ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X4 data SUPPORT GD MARCONIX WINBOND */
57ad309a88SDingqiang Lin #define CMD_FAST_4READ_X4       (0x6C)
58ad309a88SDingqiang Lin /* X1 cmd, X4 addr, X4 data SUPPORT EON GD MARCONIX WINBOND */
59ad309a88SDingqiang Lin #define CMD_FAST_READ_A4        (0xEB)
60ad309a88SDingqiang Lin /* X1 cmd, X1 addr, X4 data, SUPPORT GD WINBOND */
61ad309a88SDingqiang Lin #define CMD_PAGE_PROG_X4        (0x32)
62ad309a88SDingqiang Lin /* X1 cmd, X4 addr, X4 data, SUPPORT MARCONIX */
63ad309a88SDingqiang Lin #define CMD_PAGE_PROG_A4        (0x38)
64ad309a88SDingqiang Lin #define CMD_RESET_NAND          (0xFF)
65ad309a88SDingqiang Lin #define CMD_ENTER_4BYTE_MODE    (0xB7)
66ad309a88SDingqiang Lin #define CMD_EXIT_4BYTE_MODE     (0xE9)
67ad309a88SDingqiang Lin #define CMD_ENABLE_RESER	(0x66)
68ad309a88SDingqiang Lin #define CMD_RESET_DEVICE	(0x99)
69ad309a88SDingqiang Lin #define CMD_READ_PARAMETER	(0x5A)
70ad309a88SDingqiang Lin 
71ad309a88SDingqiang Lin enum NOR_ERASE_TYPE {
72ad309a88SDingqiang Lin 	ERASE_SECTOR = 0,
73ad309a88SDingqiang Lin 	ERASE_BLOCK64K,
74ad309a88SDingqiang Lin 	ERASE_CHIP
75ad309a88SDingqiang Lin };
76ad309a88SDingqiang Lin 
77ad309a88SDingqiang Lin enum SNOR_IO_MODE {
78ad309a88SDingqiang Lin 	IO_MODE_SPI = 0,
79ad309a88SDingqiang Lin 	IO_MODE_QPI
80ad309a88SDingqiang Lin };
81ad309a88SDingqiang Lin 
82ad309a88SDingqiang Lin enum SNOR_READ_MODE {
83ad309a88SDingqiang Lin 	READ_MODE_NOMAL = 0,
84ad309a88SDingqiang Lin 	READ_MODE_FAST
85ad309a88SDingqiang Lin };
86ad309a88SDingqiang Lin 
87ad309a88SDingqiang Lin enum SNOR_ADDR_MODE {
88ad309a88SDingqiang Lin 	ADDR_MODE_3BYTE = 0,
89ad309a88SDingqiang Lin 	ADDR_MODE_4BYTE
90ad309a88SDingqiang Lin };
91ad309a88SDingqiang Lin 
92ad309a88SDingqiang Lin typedef int (*SNOR_WRITE_STATUS)(u32 reg_index, u8 status);
93ad309a88SDingqiang Lin 
94ad309a88SDingqiang Lin struct SFNOR_DEV {
95ad309a88SDingqiang Lin 	u32	capacity;
96ad309a88SDingqiang Lin 	u8	manufacturer;
97ad309a88SDingqiang Lin 	u8	mem_type;
98ad309a88SDingqiang Lin 	u16	page_size;
99ad309a88SDingqiang Lin 	u32	blk_size;
100ad309a88SDingqiang Lin 
101ad309a88SDingqiang Lin 	u8	read_cmd;
102ad309a88SDingqiang Lin 	u8	prog_cmd;
103ad309a88SDingqiang Lin 	u8	sec_erase_cmd;
104ad309a88SDingqiang Lin 	u8	blk_erase_cmd;
105ad309a88SDingqiang Lin 	u8	QE_bits;
106ad309a88SDingqiang Lin 
107ad309a88SDingqiang Lin 	enum SNOR_READ_MODE  read_mode;
108ad309a88SDingqiang Lin 	enum SNOR_ADDR_MODE  addr_mode;
109ad309a88SDingqiang Lin 	enum SNOR_IO_MODE    io_mode;
110ad309a88SDingqiang Lin 
111ad309a88SDingqiang Lin 	enum SFC_DATA_LINES read_lines;
112ad309a88SDingqiang Lin 	enum SFC_DATA_LINES prog_lines;
113ad309a88SDingqiang Lin 
114ad309a88SDingqiang Lin 	SNOR_WRITE_STATUS write_status;
115ad309a88SDingqiang Lin };
116ad309a88SDingqiang Lin 
117ad309a88SDingqiang Lin struct flash_info {
118ad309a88SDingqiang Lin 	u32 id;
119ad309a88SDingqiang Lin 
120ad309a88SDingqiang Lin 	u8 block_size;
121ad309a88SDingqiang Lin 	u8 sector_size;
122ad309a88SDingqiang Lin 	u8 read_cmd;
123ad309a88SDingqiang Lin 	u8 prog_cmd;
124ad309a88SDingqiang Lin 
125ad309a88SDingqiang Lin 	u8 read_cmd_4;
126ad309a88SDingqiang Lin 	u8 prog_cmd_4;
127ad309a88SDingqiang Lin 	u8 sector_erase_cmd;
128ad309a88SDingqiang Lin 	u8 block_erase_cmd;
129ad309a88SDingqiang Lin 
130ad309a88SDingqiang Lin 	u8 feature;
131ad309a88SDingqiang Lin 	u8 density;  /* (1 << density) sectors*/
132ad309a88SDingqiang Lin 	u8 QE_bits;
133ad309a88SDingqiang Lin 	u8 reserved2;
134ad309a88SDingqiang Lin };
135ad309a88SDingqiang Lin 
136ad309a88SDingqiang Lin int snor_init(struct SFNOR_DEV *p_dev);
137ad309a88SDingqiang Lin u32 snor_get_capacity(struct SFNOR_DEV *p_dev);
138ad309a88SDingqiang Lin int snor_read(struct SFNOR_DEV *p_dev, u32 sec, u32 n_sec, void *p_data);
139*c84f0ed8SJon Lin int snor_write(struct SFNOR_DEV *p_dev, u32 sec, u32 n_sec, void *p_data);
140*c84f0ed8SJon Lin int snor_erase(struct SFNOR_DEV *p_dev,
141*c84f0ed8SJon Lin 	       u32 addr,
142*c84f0ed8SJon Lin 	       enum NOR_ERASE_TYPE erase_type);
143*c84f0ed8SJon Lin int snor_read_id(u8 *data);
144*c84f0ed8SJon Lin int snor_prog_page(struct SFNOR_DEV *p_dev, u32 addr, void *p_data, u32 size);
145*c84f0ed8SJon Lin int snor_read_data(struct SFNOR_DEV *p_dev, u32 addr, void *p_data, u32 size);
146*c84f0ed8SJon Lin int snor_reset_device(void);
147*c84f0ed8SJon Lin int snor_disable_QE(struct SFNOR_DEV *p_dev);
148ad309a88SDingqiang Lin 
149ad309a88SDingqiang Lin #endif
150