xref: /OK3568_Linux_fs/kernel/drivers/rkflash/sfc.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_H
6*4882a593Smuzhiyun #define _SFC_H
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #define SFC_VER_3		0x3
9*4882a593Smuzhiyun #define SFC_VER_4		0x4
10*4882a593Smuzhiyun #define SFC_VER_5		0x5
11*4882a593Smuzhiyun #define SFC_VER_6		0x6
12*4882a593Smuzhiyun #define SFC_VER_8		0x8
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define SFC_EN_INT		(0)         /* enable interrupt */
15*4882a593Smuzhiyun #define SFC_EN_DMA		(1)         /* enable dma */
16*4882a593Smuzhiyun #define SFC_FIFO_DEPTH		(0x10)      /* 16 words */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /* FIFO watermark */
19*4882a593Smuzhiyun #define SFC_RX_WMARK		(SFC_FIFO_DEPTH)	/* RX watermark level */
20*4882a593Smuzhiyun #define SFC_TX_WMARK		(SFC_FIFO_DEPTH)	/* TX watermark level */
21*4882a593Smuzhiyun #define SFC_RX_WMARK_SHIFT	(8)
22*4882a593Smuzhiyun #define SFC_TX_WMARK_SHIFT	(0)
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun /* return value */
25*4882a593Smuzhiyun #define SFC_OK                      (0)
26*4882a593Smuzhiyun #define SFC_ERROR                   (-1)
27*4882a593Smuzhiyun #define SFC_PARAM_ERR               (-2)
28*4882a593Smuzhiyun #define SFC_TX_TIMEOUT              (-3)
29*4882a593Smuzhiyun #define SFC_RX_TIMEOUT              (-4)
30*4882a593Smuzhiyun #define SFC_WAIT_TIMEOUT            (-5)
31*4882a593Smuzhiyun #define SFC_BUSY_TIMEOUT            (-6)
32*4882a593Smuzhiyun #define SFC_ECC_FAIL                (-7)
33*4882a593Smuzhiyun #define SFC_PROG_FAIL               (-8)
34*4882a593Smuzhiyun #define SFC_ERASE_FAIL              (-9)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* SFC_CMD Register */
37*4882a593Smuzhiyun #define SFC_ADDR_0BITS              (0)
38*4882a593Smuzhiyun #define SFC_ADDR_24BITS             (1)
39*4882a593Smuzhiyun #define SFC_ADDR_32BITS             (2)
40*4882a593Smuzhiyun #define SFC_ADDR_XBITS              (3)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define SFC_WRITE                   (1)
43*4882a593Smuzhiyun #define SFC_READ                    (0)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* SFC_CTRL Register */
46*4882a593Smuzhiyun #define SFC_1BITS_LINE              (0)
47*4882a593Smuzhiyun #define SFC_2BITS_LINE              (1)
48*4882a593Smuzhiyun #define SFC_4BITS_LINE              (2)
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define SFC_ENABLE_DMA              BIT(14)
51*4882a593Smuzhiyun #define sfc_delay(us)	udelay(us)
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define DMA_INT		BIT(7)      /* dma interrupt */
54*4882a593Smuzhiyun #define NSPIERR_INT	BIT(6)      /* Nspi error interrupt */
55*4882a593Smuzhiyun #define AHBERR_INT	BIT(5)      /* Ahb bus error interrupt */
56*4882a593Smuzhiyun #define FINISH_INT	BIT(4)      /* Transfer finish interrupt */
57*4882a593Smuzhiyun #define TXEMPTY_INT	BIT(3)      /* Tx fifo empty interrupt */
58*4882a593Smuzhiyun #define TXOF_INT	BIT(2)      /* Tx fifo overflow interrupt */
59*4882a593Smuzhiyun #define RXUF_INT	BIT(1)      /* Rx fifo underflow interrupt */
60*4882a593Smuzhiyun #define RXFULL_INT	BIT(0)      /* Rx fifo full interrupt */
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /* SFC_FSR Register*/
63*4882a593Smuzhiyun #define SFC_RXFULL	BIT(3)      /* rx fifo full */
64*4882a593Smuzhiyun #define SFC_RXEMPTY	BIT(2)      /* rx fifo empty */
65*4882a593Smuzhiyun #define SFC_TXEMPTY	BIT(1)      /* tx fifo empty */
66*4882a593Smuzhiyun #define SFC_TXFULL	BIT(0)      /* tx fifo full */
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* SFC_RCVR Register */
69*4882a593Smuzhiyun #define SFC_RESET	BIT(0)     /* controller reset */
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* SFC_DLL_CTRL Register */
72*4882a593Smuzhiyun #define SCLK_SMP_SEL_EN		BIT(15)	/* SCLK Sampling Selection */
73*4882a593Smuzhiyun #define SCLK_SMP_SEL_MAX_V4	0xFF
74*4882a593Smuzhiyun #define SCLK_SMP_SEL_MAX_V5	0x1FF
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun #define SFC_DLL_TRANING_STEP		10	/* Training step */
77*4882a593Smuzhiyun #define SFC_DLL_TRANING_VALID_WINDOW	80	/* Valid DLL winbow */
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun /* SFC_SR Register */
80*4882a593Smuzhiyun /* sfc busy flag. When busy, don't try to set the control register */
81*4882a593Smuzhiyun #define SFC_BUSY	BIT(0)
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun /* SFC_DMA_TRIGGER Register */
84*4882a593Smuzhiyun /* Dma start trigger signal. Auto cleared after write */
85*4882a593Smuzhiyun #define SFC_DMA_START	BIT(0)
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #define SFC_CTRL	0x00
88*4882a593Smuzhiyun #define SFC_IMR		0x04
89*4882a593Smuzhiyun #define SFC_ICLR	0x08
90*4882a593Smuzhiyun #define SFC_FTLR	0x0C
91*4882a593Smuzhiyun #define SFC_RCVR	0x10
92*4882a593Smuzhiyun #define SFC_AX		0x14
93*4882a593Smuzhiyun #define SFC_ABIT	0x18
94*4882a593Smuzhiyun #define SFC_MASKISR	0x1C
95*4882a593Smuzhiyun #define SFC_FSR		0x20
96*4882a593Smuzhiyun #define SFC_SR		0x24
97*4882a593Smuzhiyun #define SFC_RAWISR	0x28
98*4882a593Smuzhiyun #define SFC_VER		0x2C
99*4882a593Smuzhiyun #define SFC_QOP		0x30
100*4882a593Smuzhiyun #define SFC_DLL_CTRL0	0x3C
101*4882a593Smuzhiyun #define SFC_DMA_TRIGGER	0x80
102*4882a593Smuzhiyun #define SFC_DMA_ADDR	0x84
103*4882a593Smuzhiyun #define SFC_LEN_CTRL	0x88
104*4882a593Smuzhiyun #define SFC_LEN_EXT	0x8C
105*4882a593Smuzhiyun #define SFC_CMD		0x100
106*4882a593Smuzhiyun #define SFC_ADDR	0x104
107*4882a593Smuzhiyun #define SFC_DATA	0x108
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun union SFCFSR_DATA {
110*4882a593Smuzhiyun 	u32 d32;
111*4882a593Smuzhiyun 	struct {
112*4882a593Smuzhiyun 		unsigned txempty : 1;
113*4882a593Smuzhiyun 		unsigned txfull :  1;
114*4882a593Smuzhiyun 		unsigned rxempty : 1;
115*4882a593Smuzhiyun 		unsigned rxfull :  1;
116*4882a593Smuzhiyun 		unsigned reserved7_4 : 4;
117*4882a593Smuzhiyun 		unsigned txlevel : 5;
118*4882a593Smuzhiyun 		unsigned reserved15_13 : 3;
119*4882a593Smuzhiyun 		unsigned rxlevel : 5;
120*4882a593Smuzhiyun 		unsigned reserved31_21 : 11;
121*4882a593Smuzhiyun 	} b;
122*4882a593Smuzhiyun };
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /* Manufactory ID */
125*4882a593Smuzhiyun #define MID_WINBOND	0xEF
126*4882a593Smuzhiyun #define MID_GIGADEV	0xC8
127*4882a593Smuzhiyun #define MID_MICRON	0x2C
128*4882a593Smuzhiyun #define MID_MACRONIX	0xC2
129*4882a593Smuzhiyun #define MID_SPANSION	0x01
130*4882a593Smuzhiyun #define MID_EON		0x1C
131*4882a593Smuzhiyun #define MID_ST		0x20
132*4882a593Smuzhiyun #define MID_XTX		0x0B
133*4882a593Smuzhiyun #define MID_PUYA	0x85
134*4882a593Smuzhiyun #define MID_XMC		0x20
135*4882a593Smuzhiyun #define MID_DOSILICON	0xF8
136*4882a593Smuzhiyun #define MID_ZBIT	0x5E
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /*------------------------------ Global Typedefs -----------------------------*/
139*4882a593Smuzhiyun enum SFC_DATA_LINES {
140*4882a593Smuzhiyun 	DATA_LINES_X1 = 0,
141*4882a593Smuzhiyun 	DATA_LINES_X2,
142*4882a593Smuzhiyun 	DATA_LINES_X4
143*4882a593Smuzhiyun };
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun union SFCCTRL_DATA {
146*4882a593Smuzhiyun 	/* raw register data */
147*4882a593Smuzhiyun 	u32 d32;
148*4882a593Smuzhiyun 	/* register bits */
149*4882a593Smuzhiyun 	struct {
150*4882a593Smuzhiyun 		/* spi mode select */
151*4882a593Smuzhiyun 		unsigned mode : 1;
152*4882a593Smuzhiyun 		/*
153*4882a593Smuzhiyun 		 * Shift in phase selection
154*4882a593Smuzhiyun 		 * 0: shift in the flash data at posedge sclk_out
155*4882a593Smuzhiyun 		 * 1: shift in the flash data at negedge sclk_out
156*4882a593Smuzhiyun 		 */
157*4882a593Smuzhiyun 		unsigned sps : 1;
158*4882a593Smuzhiyun 		unsigned reserved3_2 : 2;
159*4882a593Smuzhiyun 		/* sclk_idle_level_cycles */
160*4882a593Smuzhiyun 		unsigned scic : 4;
161*4882a593Smuzhiyun 		/* Cmd bits number */
162*4882a593Smuzhiyun 		unsigned cmdlines : 2;
163*4882a593Smuzhiyun 		/* Address bits number */
164*4882a593Smuzhiyun 		unsigned addrlines : 2;
165*4882a593Smuzhiyun 		/* Data bits number */
166*4882a593Smuzhiyun 		unsigned datalines : 2;
167*4882a593Smuzhiyun 		/* this bit is not exit in regiseter, just use for code param */
168*4882a593Smuzhiyun 		unsigned enbledma : 1;
169*4882a593Smuzhiyun 		unsigned reserved15 : 1;
170*4882a593Smuzhiyun 		unsigned addrbits : 5;
171*4882a593Smuzhiyun 		unsigned reserved31_21 : 11;
172*4882a593Smuzhiyun 	} b;
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun union SFCCMD_DATA {
176*4882a593Smuzhiyun 	/* raw register data */
177*4882a593Smuzhiyun 	u32 d32;
178*4882a593Smuzhiyun 	/* register bits */
179*4882a593Smuzhiyun 	struct {
180*4882a593Smuzhiyun 		/* Command that will send to Serial Flash */
181*4882a593Smuzhiyun 		unsigned cmd : 8;
182*4882a593Smuzhiyun 		/* Dummy bits number */
183*4882a593Smuzhiyun 		unsigned dummybits : 4;
184*4882a593Smuzhiyun 		/* 0: read, 1: write */
185*4882a593Smuzhiyun 		unsigned rw : 1;
186*4882a593Smuzhiyun 		/* Continuous read mode */
187*4882a593Smuzhiyun 		unsigned readmode : 1;
188*4882a593Smuzhiyun 		/* Address bits number */
189*4882a593Smuzhiyun 		unsigned addrbits : 2;
190*4882a593Smuzhiyun 		/* Transferred bytes number */
191*4882a593Smuzhiyun 		unsigned datasize : 14;
192*4882a593Smuzhiyun 		/* Chip select */
193*4882a593Smuzhiyun 		unsigned cs : 2;
194*4882a593Smuzhiyun 	} b;
195*4882a593Smuzhiyun };
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun struct rk_sfc_op {
198*4882a593Smuzhiyun 	union SFCCMD_DATA sfcmd;
199*4882a593Smuzhiyun 	union SFCCTRL_DATA sfctrl;
200*4882a593Smuzhiyun };
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun #define IDB_BLOCK_TAG_ID	0xFCDC8C3B
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun struct id_block_tag {
205*4882a593Smuzhiyun 	u32 id;
206*4882a593Smuzhiyun 	u32 version;
207*4882a593Smuzhiyun 	u32 flags;
208*4882a593Smuzhiyun 	u16 boot_img_offset;
209*4882a593Smuzhiyun 	u8  reserved1[10];
210*4882a593Smuzhiyun 	u32 dev_param[8];
211*4882a593Smuzhiyun 	u8  reserved2[506 - 56];
212*4882a593Smuzhiyun 	u16 data_img_len;
213*4882a593Smuzhiyun 	u16 boot_img_len;
214*4882a593Smuzhiyun 	u8  reserved3[512 - 510];
215*4882a593Smuzhiyun } __packed;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun int sfc_init(void __iomem *reg_addr);
218*4882a593Smuzhiyun int sfc_request(struct rk_sfc_op *op, u32 addr, void *data, u32 size);
219*4882a593Smuzhiyun u16 sfc_get_version(void);
220*4882a593Smuzhiyun void sfc_clean_irq(void);
221*4882a593Smuzhiyun u32 sfc_get_max_iosize(void);
222*4882a593Smuzhiyun void sfc_set_delay_lines(u16 cells);
223*4882a593Smuzhiyun void sfc_handle_irq(void);
224*4882a593Smuzhiyun unsigned long rksfc_dma_map_single(unsigned long ptr, int size, int dir);
225*4882a593Smuzhiyun void rksfc_dma_unmap_single(unsigned long ptr, int size, int dir);
226*4882a593Smuzhiyun void rksfc_irq_flag_init(void);
227*4882a593Smuzhiyun void rksfc_wait_for_irq_completed(void);
228*4882a593Smuzhiyun u32 sfc_get_max_dll_cells(void);
229*4882a593Smuzhiyun #endif
230