]> Git Repo - u-boot.git/blob - drivers/spi/xilinx_spi.c
Restore patch series "arm: dts: am62-beagleplay: Fix Beagleplay Ethernet"
[u-boot.git] / drivers / spi / xilinx_spi.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Xilinx SPI driver
4  *
5  * Supports 8 bit SPI transfers only, with or w/o FIFO
6  *
7  * Based on bfin_spi.c, by way of altera_spi.c
8  * Copyright (c) 2015 Jagan Teki <[email protected]>
9  * Copyright (c) 2012 Stephan Linz <[email protected]>
10  * Copyright (c) 2010 Graeme Smecher <[email protected]>
11  * Copyright (c) 2010 Thomas Chou <[email protected]>
12  * Copyright (c) 2005-2008 Analog Devices Inc.
13  */
14
15 #include <config.h>
16 #include <dm.h>
17 #include <errno.h>
18 #include <log.h>
19 #include <malloc.h>
20 #include <spi.h>
21 #include <spi-mem.h>
22 #include <asm/io.h>
23 #include <wait_bit.h>
24 #include <linux/bitops.h>
25
26 /*
27  * [0]: http://www.xilinx.com/support/documentation
28  *
29  * Xilinx SPI Register Definitions
30  * [1]: [0]/ip_documentation/xps_spi.pdf
31  *      page 8, Register Descriptions
32  * [2]: [0]/ip_documentation/axi_spi_ds742.pdf
33  *      page 7, Register Overview Table
34  */
35
36 /* SPI Control Register (spicr), [1] p9, [2] p8 */
37 #define SPICR_LSB_FIRST         BIT(9)
38 #define SPICR_MASTER_INHIBIT    BIT(8)
39 #define SPICR_MANUAL_SS         BIT(7)
40 #define SPICR_RXFIFO_RESEST     BIT(6)
41 #define SPICR_TXFIFO_RESEST     BIT(5)
42 #define SPICR_CPHA              BIT(4)
43 #define SPICR_CPOL              BIT(3)
44 #define SPICR_MASTER_MODE       BIT(2)
45 #define SPICR_SPE               BIT(1)
46 #define SPICR_LOOP              BIT(0)
47
48 /* SPI Status Register (spisr), [1] p11, [2] p10 */
49 #define SPISR_SLAVE_MODE_SELECT BIT(5)
50 #define SPISR_MODF              BIT(4)
51 #define SPISR_TX_FULL           BIT(3)
52 #define SPISR_TX_EMPTY          BIT(2)
53 #define SPISR_RX_FULL           BIT(1)
54 #define SPISR_RX_EMPTY          BIT(0)
55
56 /* SPI Data Transmit Register (spidtr), [1] p12, [2] p12 */
57 #define SPIDTR_8BIT_MASK        GENMASK(7, 0)
58 #define SPIDTR_16BIT_MASK       GENMASK(15, 0)
59 #define SPIDTR_32BIT_MASK       GENMASK(31, 0)
60
61 /* SPI Data Receive Register (spidrr), [1] p12, [2] p12 */
62 #define SPIDRR_8BIT_MASK        GENMASK(7, 0)
63 #define SPIDRR_16BIT_MASK       GENMASK(15, 0)
64 #define SPIDRR_32BIT_MASK       GENMASK(31, 0)
65
66 /* SPI Slave Select Register (spissr), [1] p13, [2] p13 */
67 #define SPISSR_MASK(cs)         (1 << (cs))
68 #define SPISSR_ACT(cs)          ~SPISSR_MASK(cs)
69 #define SPISSR_OFF              (~0U)
70
71 /* SPI Software Reset Register (ssr) */
72 #define SPISSR_RESET_VALUE      0x0a
73
74 #define XILSPI_MAX_XFER_BITS    8
75 #define XILSPI_SPICR_DFLT_ON    (SPICR_MANUAL_SS | SPICR_MASTER_MODE | \
76                                 SPICR_SPE | SPICR_MASTER_INHIBIT)
77 #define XILSPI_SPICR_DFLT_OFF   (SPICR_MASTER_INHIBIT | SPICR_MANUAL_SS)
78
79 #define XILINX_SPI_IDLE_VAL     GENMASK(7, 0)
80
81 #define XILINX_SPISR_TIMEOUT    10000 /* in milliseconds */
82
83 /* xilinx spi register set */
84 struct xilinx_spi_regs {
85         u32 __space0__[7];
86         u32 dgier;      /* Device Global Interrupt Enable Register (DGIER) */
87         u32 ipisr;      /* IP Interrupt Status Register (IPISR) */
88         u32 __space1__;
89         u32 ipier;      /* IP Interrupt Enable Register (IPIER) */
90         u32 __space2__[5];
91         u32 srr;        /* Softare Reset Register (SRR) */
92         u32 __space3__[7];
93         u32 spicr;      /* SPI Control Register (SPICR) */
94         u32 spisr;      /* SPI Status Register (SPISR) */
95         u32 spidtr;     /* SPI Data Transmit Register (SPIDTR) */
96         u32 spidrr;     /* SPI Data Receive Register (SPIDRR) */
97         u32 spissr;     /* SPI Slave Select Register (SPISSR) */
98         u32 spitfor;    /* SPI Transmit FIFO Occupancy Register (SPITFOR) */
99         u32 spirfor;    /* SPI Receive FIFO Occupancy Register (SPIRFOR) */
100 };
101
102 /* xilinx spi priv */
103 struct xilinx_spi_priv {
104         struct xilinx_spi_regs *regs;
105         unsigned int freq;
106         unsigned int mode;
107         unsigned int fifo_depth;
108         u8 startup;
109 };
110
111 static int xilinx_spi_find_buffer_size(struct xilinx_spi_regs *regs)
112 {
113         u8 sr;
114         int n_words = 0;
115
116         /*
117          * Before the buffer_size detection reset the core
118          * to make sure to start with a clean state.
119          */
120         writel(SPISSR_RESET_VALUE, &regs->srr);
121
122         /* Fill the Tx FIFO with as many words as possible */
123         do {
124                 writel(0, &regs->spidtr);
125                 sr = readl(&regs->spisr);
126                 n_words++;
127         } while (!(sr & SPISR_TX_FULL));
128
129         return n_words;
130 }
131
132 static int xilinx_spi_probe(struct udevice *bus)
133 {
134         struct xilinx_spi_priv *priv = dev_get_priv(bus);
135         struct xilinx_spi_regs *regs;
136
137         regs = priv->regs = dev_read_addr_ptr(bus);
138         priv->fifo_depth = dev_read_u32_default(bus, "fifo-size", 0);
139         if (!priv->fifo_depth)
140                 priv->fifo_depth = xilinx_spi_find_buffer_size(regs);
141
142         writel(SPISSR_RESET_VALUE, &regs->srr);
143
144         /*
145          * Reset RX & TX FIFO
146          * Enable Manual Slave Select Assertion,
147          * Set SPI controller into master mode, and enable it
148          */
149         writel(SPICR_RXFIFO_RESEST | SPICR_TXFIFO_RESEST |
150                SPICR_MANUAL_SS | SPICR_MASTER_MODE | SPICR_SPE,
151                &regs->spicr);
152
153         return 0;
154 }
155
156 static void spi_cs_activate(struct udevice *dev, uint cs)
157 {
158         struct udevice *bus = dev_get_parent(dev);
159         struct xilinx_spi_priv *priv = dev_get_priv(bus);
160         struct xilinx_spi_regs *regs = priv->regs;
161
162         writel(SPISSR_ACT(cs), &regs->spissr);
163 }
164
165 static void spi_cs_deactivate(struct udevice *dev)
166 {
167         struct udevice *bus = dev_get_parent(dev);
168         struct xilinx_spi_priv *priv = dev_get_priv(bus);
169         struct xilinx_spi_regs *regs = priv->regs;
170         u32 reg;
171
172         reg = readl(&regs->spicr) | SPICR_RXFIFO_RESEST | SPICR_TXFIFO_RESEST;
173         writel(reg, &regs->spicr);
174         writel(SPISSR_OFF, &regs->spissr);
175 }
176
177 static int xilinx_spi_claim_bus(struct udevice *dev)
178 {
179         struct udevice *bus = dev_get_parent(dev);
180         struct xilinx_spi_priv *priv = dev_get_priv(bus);
181         struct xilinx_spi_regs *regs = priv->regs;
182
183         writel(SPISSR_OFF, &regs->spissr);
184         writel(XILSPI_SPICR_DFLT_ON, &regs->spicr);
185
186         return 0;
187 }
188
189 static int xilinx_spi_release_bus(struct udevice *dev)
190 {
191         struct udevice *bus = dev_get_parent(dev);
192         struct xilinx_spi_priv *priv = dev_get_priv(bus);
193         struct xilinx_spi_regs *regs = priv->regs;
194
195         writel(SPISSR_OFF, &regs->spissr);
196         writel(XILSPI_SPICR_DFLT_OFF, &regs->spicr);
197
198         return 0;
199 }
200
201 static u32 xilinx_spi_fill_txfifo(struct udevice *bus, const u8 *txp,
202                                   u32 txbytes)
203 {
204         struct xilinx_spi_priv *priv = dev_get_priv(bus);
205         struct xilinx_spi_regs *regs = priv->regs;
206         unsigned char d;
207         u32 i = 0;
208
209         while (txbytes && !(readl(&regs->spisr) & SPISR_TX_FULL) &&
210                i < priv->fifo_depth) {
211                 d = txp ? *txp++ : XILINX_SPI_IDLE_VAL;
212                 debug("spi_xfer: tx:%x ", d);
213                 /* write out and wait for processing (receive data) */
214                 writel(d & SPIDTR_8BIT_MASK, &regs->spidtr);
215                 txbytes--;
216                 i++;
217         }
218
219         return i;
220 }
221
222 static u32 xilinx_spi_read_rxfifo(struct udevice *bus, u8 *rxp, u32 rxbytes)
223 {
224         struct xilinx_spi_priv *priv = dev_get_priv(bus);
225         struct xilinx_spi_regs *regs = priv->regs;
226         unsigned char d;
227         unsigned int i = 0;
228
229         while (rxbytes && !(readl(&regs->spisr) & SPISR_RX_EMPTY)) {
230                 d = readl(&regs->spidrr) & SPIDRR_8BIT_MASK;
231                 if (rxp)
232                         *rxp++ = d;
233                 debug("spi_xfer: rx:%x\n", d);
234                 rxbytes--;
235                 i++;
236         }
237         debug("Rx_done\n");
238
239         return i;
240 }
241
242 static int start_transfer(struct udevice *dev, const void *dout, void *din, u32 len)
243 {
244         struct udevice *bus = dev->parent;
245         struct xilinx_spi_priv *priv = dev_get_priv(bus);
246         struct xilinx_spi_regs *regs = priv->regs;
247         u32 count, txbytes, rxbytes;
248         int reg, ret;
249         const unsigned char *txp = (const unsigned char *)dout;
250         unsigned char *rxp = (unsigned char *)din;
251
252         txbytes = len;
253         rxbytes = len;
254         while (txbytes || rxbytes) {
255                 /* Disable master transaction */
256                 reg = readl(&regs->spicr) | SPICR_MASTER_INHIBIT;
257                 writel(reg, &regs->spicr);
258                 count = xilinx_spi_fill_txfifo(bus, txp, txbytes);
259                 /* Enable master transaction */
260                 reg = readl(&regs->spicr) & ~SPICR_MASTER_INHIBIT;
261                 writel(reg, &regs->spicr);
262                 txbytes -= count;
263                 if (txp)
264                         txp += count;
265
266                 ret = wait_for_bit_le32(&regs->spisr, SPISR_TX_EMPTY, true,
267                                         XILINX_SPISR_TIMEOUT, false);
268                 if (ret < 0) {
269                         printf("XILSPI error: Xfer timeout\n");
270                         return ret;
271                 }
272
273                 reg = readl(&regs->spicr) | SPICR_MASTER_INHIBIT;
274                 writel(reg, &regs->spicr);
275                 count = xilinx_spi_read_rxfifo(bus, rxp, rxbytes);
276                 rxbytes -= count;
277                 if (rxp)
278                         rxp += count;
279         }
280
281         return 0;
282 }
283
284 static void xilinx_spi_startup_block(struct udevice *dev)
285 {
286         struct dm_spi_slave_plat *slave_plat = dev_get_parent_plat(dev);
287         unsigned char txp;
288         unsigned char rxp[8];
289
290         /*
291          * Perform a dummy read as a work around for
292          * the startup block issue.
293          */
294         spi_cs_activate(dev, slave_plat->cs);
295         txp = 0x9f;
296         start_transfer(dev, (void *)&txp, NULL, 1);
297
298         start_transfer(dev, NULL, (void *)rxp, 6);
299
300         spi_cs_deactivate(dev);
301 }
302
303 static int xilinx_spi_xfer(struct udevice *dev, unsigned int bitlen,
304                            const void *dout, void *din, unsigned long flags)
305 {
306         struct dm_spi_slave_plat *slave_plat = dev_get_parent_plat(dev);
307         int ret;
308
309         spi_cs_activate(dev, slave_plat->cs);
310         ret = start_transfer(dev, dout, din, bitlen / 8);
311         spi_cs_deactivate(dev);
312         return ret;
313 }
314
315 static int xilinx_spi_mem_exec_op(struct spi_slave *spi,
316                                   const struct spi_mem_op *op)
317 {
318         struct dm_spi_slave_plat *slave_plat =
319                                 dev_get_parent_plat(spi->dev);
320         static u32 startup;
321         u32 dummy_len, ret;
322
323         /*
324          * This is the work around for the startup block issue in
325          * the spi controller. SPI clock is passing through STARTUP
326          * block to FLASH. STARTUP block don't provide clock as soon
327          * as QSPI provides command. So first command fails.
328          */
329         if (!startup) {
330                 xilinx_spi_startup_block(spi->dev);
331                 startup++;
332         }
333
334         spi_cs_activate(spi->dev, slave_plat->cs);
335
336         if (op->cmd.opcode) {
337                 ret = start_transfer(spi->dev, (void *)&op->cmd.opcode,
338                                      NULL, 1);
339                 if (ret)
340                         goto done;
341         }
342         if (op->addr.nbytes) {
343                 int i;
344                 u8 addr_buf[4];
345
346                 for (i = 0; i < op->addr.nbytes; i++)
347                         addr_buf[i] = op->addr.val >>
348                         (8 * (op->addr.nbytes - i - 1));
349
350                 ret = start_transfer(spi->dev, (void *)addr_buf, NULL,
351                                      op->addr.nbytes);
352                 if (ret)
353                         goto done;
354         }
355         if (op->dummy.nbytes) {
356                 dummy_len = (op->dummy.nbytes * op->data.buswidth) /
357                              op->dummy.buswidth;
358
359                 ret = start_transfer(spi->dev, NULL, NULL, dummy_len);
360                 if (ret)
361                         goto done;
362         }
363         if (op->data.nbytes) {
364                 if (op->data.dir == SPI_MEM_DATA_IN) {
365                         ret = start_transfer(spi->dev, NULL,
366                                              op->data.buf.in, op->data.nbytes);
367                 } else {
368                         ret = start_transfer(spi->dev, op->data.buf.out,
369                                              NULL, op->data.nbytes);
370                 }
371                 if (ret)
372                         goto done;
373         }
374 done:
375         spi_cs_deactivate(spi->dev);
376
377         return ret;
378 }
379
380 static int xilinx_qspi_check_buswidth(struct spi_slave *slave, u8 width)
381 {
382         u32 mode = slave->mode;
383
384         switch (width) {
385         case 1:
386                 return 0;
387         case 2:
388                 if (mode & SPI_RX_DUAL)
389                         return 0;
390                 break;
391         case 4:
392                 if (mode & SPI_RX_QUAD)
393                         return 0;
394                 break;
395         }
396
397         return -EOPNOTSUPP;
398 }
399
400 static bool xilinx_qspi_mem_exec_op(struct spi_slave *slave,
401                                     const struct spi_mem_op *op)
402 {
403         if (xilinx_qspi_check_buswidth(slave, op->cmd.buswidth))
404                 return false;
405
406         if (op->addr.nbytes &&
407             xilinx_qspi_check_buswidth(slave, op->addr.buswidth))
408                 return false;
409
410         if (op->dummy.nbytes &&
411             xilinx_qspi_check_buswidth(slave, op->dummy.buswidth))
412                 return false;
413
414         if (op->data.dir != SPI_MEM_NO_DATA &&
415             xilinx_qspi_check_buswidth(slave, op->data.buswidth))
416                 return false;
417
418         return true;
419 }
420
421 static int xilinx_spi_set_speed(struct udevice *bus, uint speed)
422 {
423         struct xilinx_spi_priv *priv = dev_get_priv(bus);
424
425         priv->freq = speed;
426
427         debug("%s: regs=%p, speed=%d\n", __func__, priv->regs, priv->freq);
428
429         return 0;
430 }
431
432 static int xilinx_spi_set_mode(struct udevice *bus, uint mode)
433 {
434         struct xilinx_spi_priv *priv = dev_get_priv(bus);
435         struct xilinx_spi_regs *regs = priv->regs;
436         u32 spicr;
437
438         spicr = readl(&regs->spicr);
439         if (mode & SPI_LSB_FIRST)
440                 spicr |= SPICR_LSB_FIRST;
441         if (mode & SPI_CPHA)
442                 spicr |= SPICR_CPHA;
443         if (mode & SPI_CPOL)
444                 spicr |= SPICR_CPOL;
445         if (mode & SPI_LOOP)
446                 spicr |= SPICR_LOOP;
447
448         writel(spicr, &regs->spicr);
449         priv->mode = mode;
450
451         debug("%s: regs=%p, mode=%d\n", __func__, priv->regs, priv->mode);
452
453         return 0;
454 }
455
456 static const struct spi_controller_mem_ops xilinx_spi_mem_ops = {
457         .exec_op = xilinx_spi_mem_exec_op,
458         .supports_op = xilinx_qspi_mem_exec_op,
459 };
460
461 static const struct dm_spi_ops xilinx_spi_ops = {
462         .claim_bus      = xilinx_spi_claim_bus,
463         .release_bus    = xilinx_spi_release_bus,
464         .xfer           = xilinx_spi_xfer,
465         .set_speed      = xilinx_spi_set_speed,
466         .set_mode       = xilinx_spi_set_mode,
467         .mem_ops        = &xilinx_spi_mem_ops,
468 };
469
470 static const struct udevice_id xilinx_spi_ids[] = {
471         { .compatible = "xlnx,xps-spi-2.00.a" },
472         { .compatible = "xlnx,xps-spi-2.00.b" },
473         { }
474 };
475
476 U_BOOT_DRIVER(xilinx_spi) = {
477         .name   = "xilinx_spi",
478         .id     = UCLASS_SPI,
479         .of_match = xilinx_spi_ids,
480         .ops    = &xilinx_spi_ops,
481         .priv_auto      = sizeof(struct xilinx_spi_priv),
482         .probe  = xilinx_spi_probe,
483 };
This page took 0.056164 seconds and 4 git commands to generate.