Merge tag 'u-boot-amlogic-20181207' of git://git.denx.de/u-boot-amlogic
[platform/kernel/u-boot.git] / drivers / spi / mtk_qspi.c
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 };