xref: /rk3399_rockchip-uboot/drivers/rkflash/sfc.h (revision b27ae02dfdf0e26d23901e9b898629d6ec470a60)
1 /*
2  * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
3  *
4  * SPDX-License-Identifier:	GPL-2.0
5  */
6 
7 #ifndef _SFC_H
8 #define _SFC_H
9 
10 #define SFC_VER_3		0x3 /* ver 3, else ver 1 */
11 
12 #define SFC_MAX_IOSIZE		(1024 * 8)    /* 8K byte */
13 #define SFC_EN_INT		(0)         /* enable interrupt */
14 #define SFC_EN_DMA		(1)         /* enable dma */
15 #define SFC_FIFO_DEPTH		(0x10)      /* 16 words */
16 
17 /* FIFO watermark */
18 #define SFC_RX_WMARK		(SFC_FIFO_DEPTH)	/* RX watermark level */
19 #define SFC_TX_WMARK		(SFC_FIFO_DEPTH)	/* TX watermark level */
20 #define SFC_RX_WMARK_SHIFT	(8)
21 #define SFC_TX_WMARK_SHIFT	(0)
22 
23 /* return value */
24 #define SFC_OK                      (0)
25 #define SFC_ERROR                   (-1)
26 #define SFC_PARAM_ERR               (-2)
27 #define SFC_TX_TIMEOUT              (-3)
28 #define SFC_RX_TIMEOUT              (-4)
29 #define SFC_WAIT_TIMEOUT            (-5)
30 #define SFC_BUSY_TIMEOUT            (-6)
31 #define SFC_ECC_FAIL                (-7)
32 #define SFC_PROG_FAIL               (-8)
33 #define SFC_ERASE_FAIL              (-9)
34 
35 /* SFC_CMD Register */
36 #define SFC_ADDR_0BITS              (0)
37 #define SFC_ADDR_24BITS             (1)
38 #define SFC_ADDR_32BITS             (2)
39 #define SFC_ADDR_XBITS              (3)
40 
41 #define SFC_WRITE                   (1)
42 #define SFC_READ                    (0)
43 
44 /* SFC_CTRL Register */
45 #define SFC_1BITS_LINE              (0)
46 #define SFC_2BITS_LINE              (1)
47 #define SFC_4BITS_LINE              (2)
48 
49 #define SFC_ENABLE_DMA              BIT(14)
50 #define sfc_delay(us)	udelay(us)
51 
52 #define DMA_INT		BIT(7)      /* dma interrupt */
53 #define NSPIERR_INT	BIT(6)      /* Nspi error interrupt */
54 #define AHBERR_INT	BIT(5)      /* Ahb bus error interrupt */
55 #define FINISH_INT	BIT(4)      /* Transfer finish interrupt */
56 #define TXEMPTY_INT	BIT(3)      /* Tx fifo empty interrupt */
57 #define TXOF_INT	BIT(2)      /* Tx fifo overflow interrupt */
58 #define RXUF_INT	BIT(1)      /* Rx fifo underflow interrupt */
59 #define RXFULL_INT	BIT(0)      /* Rx fifo full interrupt */
60 
61 /* SFC_FSR Register*/
62 #define SFC_RXFULL	BIT(3)      /* rx fifo full */
63 #define SFC_RXEMPTY	BIT(2)      /* rx fifo empty */
64 #define SFC_TXEMPTY	BIT(1)      /* tx fifo empty */
65 #define SFC_TXFULL	BIT(0)      /* tx fifo full */
66 
67 /* SFC_RCVR Register */
68 #define SFC_RESET	BIT(0)     /* controller reset */
69 
70 /* SFC_SR Register */
71 /* sfc busy flag. When busy, don't try to set the control register */
72 #define SFC_BUSY	BIT(0)
73 
74 /* SFC_DMA_TRIGGER Register */
75 /* Dma start trigger signal. Auto cleared after write */
76 #define SFC_DMA_START	BIT(0)
77 
78 #define SFC_CTRL	0x00
79 #define SFC_IMR		0x04
80 #define SFC_ICLR	0x08
81 #define SFC_FTLR	0x0C
82 #define SFC_RCVR	0x10
83 #define SFC_AX		0x14
84 #define SFC_ABIT	0x18
85 #define SFC_MASKISR	0x1C
86 #define SFC_FSR		0x20
87 #define SFC_SR		0x24
88 #define SFC_RAWISR	0x28
89 #define SFC_VER		0x2C
90 #define SFC_QOP		0x30
91 #define SFC_DMA_TRIGGER	0x80
92 #define SFC_DMA_ADDR	0x84
93 #define SFC_CMD		0x100
94 #define SFC_ADDR	0x104
95 #define SFC_DATA	0x108
96 
97 union SFCFSR_DATA {
98 	u32 d32;
99 	struct {
100 		unsigned txempty : 1;
101 		unsigned txfull :  1;
102 		unsigned rxempty : 1;
103 		unsigned rxfull :  1;
104 		unsigned reserved7_4 : 4;
105 		unsigned txlevel : 5;
106 		unsigned reserved15_13 : 3;
107 		unsigned rxlevel : 5;
108 		unsigned reserved31_21 : 11;
109 	} b;
110 };
111 
112 /* Manufactory ID */
113 #define MID_WINBOND	0xEF
114 #define MID_GIGADEV	0xC8
115 #define MID_MICRON	0x2C
116 #define MID_MACRONIX	0xC2
117 #define MID_SPANSION	0x01
118 #define MID_EON		0x1C
119 #define MID_ST		0x20
120 #define MID_XTX		0x0B
121 #define MID_PUYA	0x85
122 #define MID_XMC		0x20
123 #define MID_DOSILICON	0xF8
124 #define MID_ZBIT	0x5E
125 
126 /*------------------------------ Global Typedefs -----------------------------*/
127 enum SFC_DATA_LINES {
128 	DATA_LINES_X1 = 0,
129 	DATA_LINES_X2,
130 	DATA_LINES_X4
131 };
132 
133 union SFCCTRL_DATA {
134 	/* raw register data */
135 	u32 d32;
136 	/* register bits */
137 	struct {
138 		/* spi mode select */
139 		unsigned mode : 1;
140 		/*
141 		 * Shift in phase selection
142 		 * 0: shift in the flash data at posedge sclk_out
143 		 * 1: shift in the flash data at negedge sclk_out
144 		 */
145 		unsigned sps : 1;
146 		unsigned reserved3_2 : 2;
147 		/* sclk_idle_level_cycles */
148 		unsigned scic : 4;
149 		/* Cmd bits number */
150 		unsigned cmdlines : 2;
151 		/* Address bits number */
152 		unsigned addrlines : 2;
153 		/* Data bits number */
154 		unsigned datalines : 2;
155 		/* this bit is not exit in regiseter, just use for code param */
156 		unsigned enbledma : 1;
157 		unsigned reserved15 : 1;
158 		unsigned addrbits : 5;
159 		unsigned reserved31_21 : 11;
160 	} b;
161 };
162 
163 union SFCCMD_DATA {
164 	/* raw register data */
165 	u32 d32;
166 	/* register bits */
167 	struct {
168 		/* Command that will send to Serial Flash */
169 		unsigned cmd : 8;
170 		/* Dummy bits number */
171 		unsigned dummybits : 4;
172 		/* 0: read, 1: write */
173 		unsigned rw : 1;
174 		/* Continuous read mode */
175 		unsigned readmode : 1;
176 		/* Address bits number */
177 		unsigned addrbits : 2;
178 		/* Transferred bytes number */
179 		unsigned datasize : 14;
180 		/* Chip select */
181 		unsigned cs : 2;
182 	} b;
183 };
184 
185 int sfc_init(void __iomem *reg_addr);
186 int sfc_request(u32 sfcmd, u32 sfctrl, u32 addr, void *data);
187 u16 sfc_get_version(void);
188 void sfc_clean_irq(void);
189 int rksfc_get_reg_addr(unsigned long *p_sfc_addr);
190 
191 #endif
192