xref: /openbmc/u-boot/drivers/spi/mtk_qspi.c (revision 280fafff)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2018  MediaTek, Inc.
4  * Author : Guochun.Mao@mediatek.com
5  */
6 
7 #include <common.h>
8 #include <dm.h>
9 #include <malloc.h>
10 #include <spi.h>
11 #include <asm/io.h>
12 #include <linux/iopoll.h>
13 #include <linux/ioport.h>
14 
15 /* Register Offset */
16 struct mtk_qspi_regs {
17 	u32 cmd;
18 	u32 cnt;
19 	u32 rdsr;
20 	u32 rdata;
21 	u32 radr[3];
22 	u32 wdata;
23 	u32 prgdata[6];
24 	u32 shreg[10];
25 	u32 cfg[2];
26 	u32 shreg10;
27 	u32 mode_mon;
28 	u32 status[4];
29 	u32 flash_time;
30 	u32 flash_cfg;
31 	u32 reserved_0[3];
32 	u32 sf_time;
33 	u32 pp_dw_data;
34 	u32 reserved_1;
35 	u32 delsel_0[2];
36 	u32 intrstus;
37 	u32 intren;
38 	u32 reserved_2;
39 	u32 cfg3;
40 	u32 reserved_3;
41 	u32 chksum;
42 	u32 aaicmd;
43 	u32 wrprot;
44 	u32 radr3;
45 	u32 dual;
46 	u32 delsel_1[3];
47 };
48 
49 struct mtk_qspi_platdata {
50 	fdt_addr_t reg_base;
51 	fdt_addr_t mem_base;
52 };
53 
54 struct mtk_qspi_priv {
55 	struct mtk_qspi_regs *regs;
56 	unsigned long *mem_base;
57 	u8 op;
58 	u8 tx[3]; /* only record max 3 bytes paras, when it's address. */
59 	u32 txlen; /* dout buffer length  - op code length */
60 	u8 *rx;
61 	u32 rxlen;
62 };
63 
64 #define MTK_QSPI_CMD_POLLINGREG_US 500000
65 #define MTK_QSPI_WRBUF_SIZE        256
66 #define MTK_QSPI_COMMAND_ENABLE    0x30
67 
68 /* NOR flash controller commands */
69 #define MTK_QSPI_RD_TRIGGER        BIT(0)
70 #define MTK_QSPI_READSTATUS        BIT(1)
71 #define MTK_QSPI_PRG_CMD           BIT(2)
72 #define MTK_QSPI_WR_TRIGGER        BIT(4)
73 #define MTK_QSPI_WRITESTATUS       BIT(5)
74 #define MTK_QSPI_AUTOINC           BIT(7)
75 
76 #define MTK_QSPI_MAX_RX_TX_SHIFT   0x6
77 #define MTK_QSPI_MAX_SHIFT         0x8
78 
79 #define MTK_QSPI_WR_BUF_ENABLE     0x1
80 #define MTK_QSPI_WR_BUF_DISABLE    0x0
81 
82 static int mtk_qspi_execute_cmd(struct mtk_qspi_priv *priv, u8 cmd)
83 {
84 	u8 tmp;
85 	u8 val = cmd & ~MTK_QSPI_AUTOINC;
86 
87 	writeb(cmd, &priv->regs->cmd);
88 
89 	return readb_poll_timeout(&priv->regs->cmd, tmp, !(val & tmp),
90 				  MTK_QSPI_CMD_POLLINGREG_US);
91 }
92 
93 static int mtk_qspi_tx_rx(struct mtk_qspi_priv *priv)
94 {
95 	int len = 1 + priv->txlen + priv->rxlen;
96 	int i, ret, idx;
97 
98 	if (len > MTK_QSPI_MAX_SHIFT)
99 		return -ERR_INVAL;
100 
101 	writeb(len * 8, &priv->regs->cnt);
102 
103 	/* start at PRGDATA5, go down to PRGDATA0 */
104 	idx = MTK_QSPI_MAX_RX_TX_SHIFT - 1;
105 
106 	/* opcode */
107 	writeb(priv->op, &priv->regs->prgdata[idx]);
108 	idx--;
109 
110 	/* program TX data */
111 	for (i = 0; i < priv->txlen; i++, idx--)
112 		writeb(priv->tx[i], &priv->regs->prgdata[idx]);
113 
114 	/* clear out rest of TX registers */
115 	while (idx >= 0) {
116 		writeb(0, &priv->regs->prgdata[idx]);
117 		idx--;
118 	}
119 
120 	ret = mtk_qspi_execute_cmd(priv, MTK_QSPI_PRG_CMD);
121 	if (ret)
122 		return ret;
123 
124 	/* restart at first RX byte */
125 	idx = priv->rxlen - 1;
126 
127 	/* read out RX data */
128 	for (i = 0; i < priv->rxlen; i++, idx--)
129 		priv->rx[i] = readb(&priv->regs->shreg[idx]);
130 
131 	return 0;
132 }
133 
134 static int mtk_qspi_read(struct mtk_qspi_priv *priv,
135 			 u32 addr, u8 *buf, u32 len)
136 {
137 	memcpy(buf, (u8 *)priv->mem_base + addr, len);
138 	return 0;
139 }
140 
141 static void mtk_qspi_set_addr(struct mtk_qspi_priv *priv, u32 addr)
142 {
143 	int i;
144 
145 	for (i = 0; i < 3; i++) {
146 		writeb(addr & 0xff, &priv->regs->radr[i]);
147 		addr >>= 8;
148 	}
149 }
150 
151 static int mtk_qspi_write_single_byte(struct mtk_qspi_priv *priv,
152 				      u32 addr, u32 length, const u8 *data)
153 {
154 	int i, ret;
155 
156 	mtk_qspi_set_addr(priv, addr);
157 
158 	for (i = 0; i < length; i++) {
159 		writeb(*data++, &priv->regs->wdata);
160 		ret = mtk_qspi_execute_cmd(priv, MTK_QSPI_WR_TRIGGER);
161 		if (ret < 0)
162 			return ret;
163 	}
164 	return 0;
165 }
166 
167 static int mtk_qspi_write_buffer(struct mtk_qspi_priv *priv, u32 addr,
168 				 const u8 *buf)
169 {
170 	int i, data;
171 
172 	mtk_qspi_set_addr(priv, addr);
173 
174 	for (i = 0; i < MTK_QSPI_WRBUF_SIZE; i += 4) {
175 		data = buf[i + 3] << 24 | buf[i + 2] << 16 |
176 		       buf[i + 1] << 8 | buf[i];
177 		writel(data, &priv->regs->pp_dw_data);
178 	}
179 
180 	return mtk_qspi_execute_cmd(priv, MTK_QSPI_WR_TRIGGER);
181 }
182 
183 static int mtk_qspi_write(struct mtk_qspi_priv *priv,
184 			  u32 addr, const u8 *buf, u32 len)
185 {
186 	int ret;
187 
188 	/* setting pre-fetch buffer for page program */
189 	writel(MTK_QSPI_WR_BUF_ENABLE, &priv->regs->cfg[1]);
190 	while (len >= MTK_QSPI_WRBUF_SIZE) {
191 		ret = mtk_qspi_write_buffer(priv, addr, buf);
192 		if (ret < 0)
193 			return ret;
194 
195 		len -= MTK_QSPI_WRBUF_SIZE;
196 		addr += MTK_QSPI_WRBUF_SIZE;
197 		buf += MTK_QSPI_WRBUF_SIZE;
198 	}
199 	/* disable pre-fetch buffer for page program */
200 	writel(MTK_QSPI_WR_BUF_DISABLE, &priv->regs->cfg[1]);
201 
202 	if (len)
203 		return mtk_qspi_write_single_byte(priv, addr, len, buf);
204 
205 	return 0;
206 }
207 
208 static int mtk_qspi_claim_bus(struct udevice *dev)
209 {
210 	/* nothing to do */
211 	return 0;
212 }
213 
214 static int mtk_qspi_release_bus(struct udevice *dev)
215 {
216 	/* nothing to do */
217 	return 0;
218 }
219 
220 static int mtk_qspi_transfer(struct mtk_qspi_priv *priv, unsigned int bitlen,
221 			     const void *dout, void *din, unsigned long flags)
222 {
223 	u32 bytes = DIV_ROUND_UP(bitlen, 8);
224 	u32 addr;
225 
226 	if (!bytes)
227 		return -ERR_INVAL;
228 
229 	if (dout) {
230 		if (flags & SPI_XFER_BEGIN) {
231 			/* parse op code and potential paras first */
232 			priv->op = *(u8 *)dout;
233 			if (bytes > 1)
234 				memcpy(priv->tx, (u8 *)dout + 1,
235 				       bytes <= 4 ? bytes - 1 : 3);
236 			priv->txlen = bytes - 1;
237 		}
238 
239 		if (flags == SPI_XFER_ONCE) {
240 			/* operations without receiving or sending data.
241 			 * for example: erase, write flash register or write
242 			 * enable...
243 			 */
244 			priv->rx = NULL;
245 			priv->rxlen = 0;
246 			return mtk_qspi_tx_rx(priv);
247 		}
248 
249 		if (flags & SPI_XFER_END) {
250 			/* here, dout should be data to be written.
251 			 * and priv->tx should be filled 3Bytes address.
252 			 */
253 			addr = priv->tx[0] << 16 | priv->tx[1] << 8 |
254 			       priv->tx[2];
255 			return mtk_qspi_write(priv, addr, (u8 *)dout, bytes);
256 		}
257 	}
258 
259 	if (din) {
260 		if (priv->txlen >= 3) {
261 			/* if run to here, priv->tx[] should be the address
262 			 * where read data from,
263 			 * and, din is the buf to receive data.
264 			 */
265 			addr = priv->tx[0] << 16 | priv->tx[1] << 8 |
266 			       priv->tx[2];
267 			return mtk_qspi_read(priv, addr, (u8 *)din, bytes);
268 		}
269 
270 		/* should be reading flash's register */
271 		priv->rx = (u8 *)din;
272 		priv->rxlen = bytes;
273 		return mtk_qspi_tx_rx(priv);
274 	}
275 
276 	return 0;
277 }
278 
279 static int mtk_qspi_xfer(struct udevice *dev, unsigned int bitlen,
280 			 const void *dout, void *din, unsigned long flags)
281 {
282 	struct udevice *bus = dev->parent;
283 	struct mtk_qspi_priv *priv = dev_get_priv(bus);
284 
285 	return  mtk_qspi_transfer(priv, bitlen, dout, din, flags);
286 }
287 
288 static int mtk_qspi_set_speed(struct udevice *bus, uint speed)
289 {
290 	/* nothing to do */
291 	return 0;
292 }
293 
294 static int mtk_qspi_set_mode(struct udevice *bus, uint mode)
295 {
296 	/* nothing to do */
297 	return 0;
298 }
299 
300 static int mtk_qspi_ofdata_to_platdata(struct udevice *bus)
301 {
302 	struct resource res_reg, res_mem;
303 	struct mtk_qspi_platdata *plat = bus->platdata;
304 	int ret;
305 
306 	ret = dev_read_resource_byname(bus, "reg_base", &res_reg);
307 	if (ret) {
308 		debug("can't get reg_base resource(ret = %d)\n", ret);
309 		return -ENOMEM;
310 	}
311 
312 	ret = dev_read_resource_byname(bus, "mem_base", &res_mem);
313 	if (ret) {
314 		debug("can't get map_base resource(ret = %d)\n", ret);
315 		return -ENOMEM;
316 	}
317 
318 	plat->mem_base = res_mem.start;
319 	plat->reg_base = res_reg.start;
320 
321 	return 0;
322 }
323 
324 static int mtk_qspi_probe(struct udevice *bus)
325 {
326 	struct mtk_qspi_platdata *plat = dev_get_platdata(bus);
327 	struct mtk_qspi_priv *priv = dev_get_priv(bus);
328 
329 	priv->regs = (struct mtk_qspi_regs *)plat->reg_base;
330 	priv->mem_base = (unsigned long *)plat->mem_base;
331 
332 	writel(MTK_QSPI_COMMAND_ENABLE, &priv->regs->wrprot);
333 
334 	return 0;
335 }
336 
337 static const struct dm_spi_ops mtk_qspi_ops = {
338 	.claim_bus      = mtk_qspi_claim_bus,
339 	.release_bus    = mtk_qspi_release_bus,
340 	.xfer           = mtk_qspi_xfer,
341 	.set_speed      = mtk_qspi_set_speed,
342 	.set_mode       = mtk_qspi_set_mode,
343 };
344 
345 static const struct udevice_id mtk_qspi_ids[] = {
346 	{ .compatible = "mediatek,mt7629-qspi" },
347 	{ }
348 };
349 
350 U_BOOT_DRIVER(mtk_qspi) = {
351 	.name     = "mtk_qspi",
352 	.id       = UCLASS_SPI,
353 	.of_match = mtk_qspi_ids,
354 	.ops      = &mtk_qspi_ops,
355 	.ofdata_to_platdata       = mtk_qspi_ofdata_to_platdata,
356 	.platdata_auto_alloc_size = sizeof(struct mtk_qspi_platdata),
357 	.priv_auto_alloc_size     = sizeof(struct mtk_qspi_priv),
358 	.probe    = mtk_qspi_probe,
359 };
360