blob: 4219a35c840644e76acbc664554e1ad95fee10c7 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Jagan Teki7fbea8a2015-08-17 18:38:06 +05302/*
3 * (C) Copyright 2013 Xilinx, Inc.
4 * (C) Copyright 2015 Jagan Teki <jteki@openedev.com>
5 *
6 * Xilinx Zynq Quad-SPI(QSPI) controller driver (master mode only)
Jagan Teki7fbea8a2015-08-17 18:38:06 +05307 */
8
T Karthik Reddyb1f0d3d2020-02-04 05:47:45 -07009#include <clk.h>
Jagan Teki7fbea8a2015-08-17 18:38:06 +053010#include <common.h>
11#include <dm.h>
T Karthik Reddyb1f0d3d2020-02-04 05:47:45 -070012#include <dm/device_compat.h>
Simon Glass0f2af882020-05-10 11:40:05 -060013#include <log.h>
Jagan Teki7fbea8a2015-08-17 18:38:06 +053014#include <malloc.h>
15#include <spi.h>
16#include <asm/io.h>
Simon Glass4dcacfc2020-05-10 11:40:13 -060017#include <linux/bitops.h>
Jagan Teki7fbea8a2015-08-17 18:38:06 +053018
19DECLARE_GLOBAL_DATA_PTR;
20
21/* zynq qspi register bit masks ZYNQ_QSPI_<REG>_<BIT>_MASK */
Jagan Tekif94b3f72015-10-22 20:40:16 +053022#define ZYNQ_QSPI_CR_IFMODE_MASK BIT(31) /* Flash intrface mode*/
23#define ZYNQ_QSPI_CR_MSA_MASK BIT(15) /* Manual start enb */
24#define ZYNQ_QSPI_CR_MCS_MASK BIT(14) /* Manual chip select */
25#define ZYNQ_QSPI_CR_PCS_MASK BIT(10) /* Peri chip select */
Jagan Tekie1af6ae2015-10-22 21:06:37 +053026#define ZYNQ_QSPI_CR_FW_MASK GENMASK(7, 6) /* FIFO width */
27#define ZYNQ_QSPI_CR_SS_MASK GENMASK(13, 10) /* Slave Select */
28#define ZYNQ_QSPI_CR_BAUD_MASK GENMASK(5, 3) /* Baud rate div */
Jagan Tekif94b3f72015-10-22 20:40:16 +053029#define ZYNQ_QSPI_CR_CPHA_MASK BIT(2) /* Clock phase */
30#define ZYNQ_QSPI_CR_CPOL_MASK BIT(1) /* Clock polarity */
31#define ZYNQ_QSPI_CR_MSTREN_MASK BIT(0) /* Mode select */
32#define ZYNQ_QSPI_IXR_RXNEMPTY_MASK BIT(4) /* RX_FIFO_not_empty */
33#define ZYNQ_QSPI_IXR_TXOW_MASK BIT(2) /* TX_FIFO_not_full */
Jagan Tekie1af6ae2015-10-22 21:06:37 +053034#define ZYNQ_QSPI_IXR_ALL_MASK GENMASK(6, 0) /* All IXR bits */
Jagan Tekif94b3f72015-10-22 20:40:16 +053035#define ZYNQ_QSPI_ENR_SPI_EN_MASK BIT(0) /* SPI Enable */
Nathan Rossib1150782015-12-09 00:44:40 +100036#define ZYNQ_QSPI_LQSPICFG_LQMODE_MASK BIT(31) /* Linear QSPI Mode */
Jagan Teki7fbea8a2015-08-17 18:38:06 +053037
38/* zynq qspi Transmit Data Register */
39#define ZYNQ_QSPI_TXD_00_00_OFFSET 0x1C /* Transmit 4-byte inst */
40#define ZYNQ_QSPI_TXD_00_01_OFFSET 0x80 /* Transmit 1-byte inst */
41#define ZYNQ_QSPI_TXD_00_10_OFFSET 0x84 /* Transmit 2-byte inst */
42#define ZYNQ_QSPI_TXD_00_11_OFFSET 0x88 /* Transmit 3-byte inst */
43
44#define ZYNQ_QSPI_TXFIFO_THRESHOLD 1 /* Tx FIFO threshold level*/
45#define ZYNQ_QSPI_RXFIFO_THRESHOLD 32 /* Rx FIFO threshold level */
46
47#define ZYNQ_QSPI_CR_BAUD_MAX 8 /* Baud rate divisor max val */
48#define ZYNQ_QSPI_CR_BAUD_SHIFT 3 /* Baud rate divisor shift */
49#define ZYNQ_QSPI_CR_SS_SHIFT 10 /* Slave select shift */
50
51#define ZYNQ_QSPI_FIFO_DEPTH 63
Ashok Reddy Somacaecfe62020-05-18 01:11:00 -060052#define ZYNQ_QSPI_WAIT (CONFIG_SYS_HZ / 100) /* 10 ms */
Jagan Teki7fbea8a2015-08-17 18:38:06 +053053
54/* zynq qspi register set */
55struct zynq_qspi_regs {
56 u32 cr; /* 0x00 */
57 u32 isr; /* 0x04 */
58 u32 ier; /* 0x08 */
59 u32 idr; /* 0x0C */
60 u32 imr; /* 0x10 */
61 u32 enr; /* 0x14 */
62 u32 dr; /* 0x18 */
63 u32 txd0r; /* 0x1C */
64 u32 drxr; /* 0x20 */
65 u32 sicr; /* 0x24 */
66 u32 txftr; /* 0x28 */
67 u32 rxftr; /* 0x2C */
68 u32 gpior; /* 0x30 */
69 u32 reserved0[19];
70 u32 txd1r; /* 0x80 */
71 u32 txd2r; /* 0x84 */
72 u32 txd3r; /* 0x88 */
Nathan Rossib1150782015-12-09 00:44:40 +100073 u32 reserved1[5];
74 u32 lqspicfg; /* 0xA0 */
75 u32 lqspists; /* 0xA4 */
Jagan Teki7fbea8a2015-08-17 18:38:06 +053076};
77
78/* zynq qspi platform data */
79struct zynq_qspi_platdata {
80 struct zynq_qspi_regs *regs;
81 u32 frequency; /* input frequency */
82 u32 speed_hz;
83};
84
85/* zynq qspi priv */
86struct zynq_qspi_priv {
87 struct zynq_qspi_regs *regs;
88 u8 cs;
89 u8 mode;
90 u8 fifo_depth;
91 u32 freq; /* required frequency */
92 const void *tx_buf;
93 void *rx_buf;
94 unsigned len;
95 int bytes_to_transfer;
96 int bytes_to_receive;
97 unsigned int is_inst;
98 unsigned cs_change:1;
99};
100
101static int zynq_qspi_ofdata_to_platdata(struct udevice *bus)
102{
103 struct zynq_qspi_platdata *plat = bus->platdata;
104 const void *blob = gd->fdt_blob;
Simon Glassdd79d6e2017-01-17 16:52:55 -0700105 int node = dev_of_offset(bus);
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530106
107 plat->regs = (struct zynq_qspi_regs *)fdtdec_get_addr(blob,
108 node, "reg");
109
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530110 return 0;
111}
112
113static void zynq_qspi_init_hw(struct zynq_qspi_priv *priv)
114{
115 struct zynq_qspi_regs *regs = priv->regs;
116 u32 confr;
117
118 /* Disable QSPI */
119 writel(~ZYNQ_QSPI_ENR_SPI_EN_MASK, &regs->enr);
120
121 /* Disable Interrupts */
122 writel(ZYNQ_QSPI_IXR_ALL_MASK, &regs->idr);
123
124 /* Clear the TX and RX threshold reg */
125 writel(ZYNQ_QSPI_TXFIFO_THRESHOLD, &regs->txftr);
126 writel(ZYNQ_QSPI_RXFIFO_THRESHOLD, &regs->rxftr);
127
128 /* Clear the RX FIFO */
129 while (readl(&regs->isr) & ZYNQ_QSPI_IXR_RXNEMPTY_MASK)
130 readl(&regs->drxr);
131
132 /* Clear Interrupts */
133 writel(ZYNQ_QSPI_IXR_ALL_MASK, &regs->isr);
134
135 /* Manual slave select and Auto start */
136 confr = readl(&regs->cr);
137 confr &= ~ZYNQ_QSPI_CR_MSA_MASK;
138 confr |= ZYNQ_QSPI_CR_IFMODE_MASK | ZYNQ_QSPI_CR_MCS_MASK |
139 ZYNQ_QSPI_CR_PCS_MASK | ZYNQ_QSPI_CR_FW_MASK |
140 ZYNQ_QSPI_CR_MSTREN_MASK;
141 writel(confr, &regs->cr);
142
Nathan Rossib1150782015-12-09 00:44:40 +1000143 /* Disable the LQSPI feature */
144 confr = readl(&regs->lqspicfg);
145 confr &= ~ZYNQ_QSPI_LQSPICFG_LQMODE_MASK;
146 writel(confr, &regs->lqspicfg);
147
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530148 /* Enable SPI */
149 writel(ZYNQ_QSPI_ENR_SPI_EN_MASK, &regs->enr);
150}
151
152static int zynq_qspi_probe(struct udevice *bus)
153{
154 struct zynq_qspi_platdata *plat = dev_get_platdata(bus);
155 struct zynq_qspi_priv *priv = dev_get_priv(bus);
T Karthik Reddyb1f0d3d2020-02-04 05:47:45 -0700156 struct clk clk;
157 unsigned long clock;
158 int ret;
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530159
160 priv->regs = plat->regs;
161 priv->fifo_depth = ZYNQ_QSPI_FIFO_DEPTH;
162
T Karthik Reddyb1f0d3d2020-02-04 05:47:45 -0700163 ret = clk_get_by_name(bus, "ref_clk", &clk);
164 if (ret < 0) {
165 dev_err(bus, "failed to get clock\n");
166 return ret;
167 }
168
169 clock = clk_get_rate(&clk);
170 if (IS_ERR_VALUE(clock)) {
171 dev_err(bus, "failed to get rate\n");
172 return clock;
173 }
174
175 ret = clk_enable(&clk);
176 if (ret && ret != -ENOSYS) {
177 dev_err(bus, "failed to enable clock\n");
178 return ret;
179 }
180
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530181 /* init the zynq spi hw */
182 zynq_qspi_init_hw(priv);
183
T Karthik Reddyb1f0d3d2020-02-04 05:47:45 -0700184 plat->frequency = clock;
185 plat->speed_hz = plat->frequency / 2;
186
187 debug("%s: max-frequency=%d\n", __func__, plat->speed_hz);
188
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530189 return 0;
190}
191
192/*
193 * zynq_qspi_read_data - Copy data to RX buffer
194 * @zqspi: Pointer to the zynq_qspi structure
195 * @data: The 32 bit variable where data is stored
196 * @size: Number of bytes to be copied from data to RX buffer
197 */
198static void zynq_qspi_read_data(struct zynq_qspi_priv *priv, u32 data, u8 size)
199{
200 u8 byte3;
201
202 debug("%s: data 0x%04x rx_buf addr: 0x%08x size %d\n", __func__ ,
203 data, (unsigned)(priv->rx_buf), size);
204
205 if (priv->rx_buf) {
206 switch (size) {
207 case 1:
208 *((u8 *)priv->rx_buf) = data;
209 priv->rx_buf += 1;
210 break;
211 case 2:
212 *((u16 *)priv->rx_buf) = data;
213 priv->rx_buf += 2;
214 break;
215 case 3:
216 *((u16 *)priv->rx_buf) = data;
217 priv->rx_buf += 2;
218 byte3 = (u8)(data >> 16);
219 *((u8 *)priv->rx_buf) = byte3;
220 priv->rx_buf += 1;
221 break;
222 case 4:
223 /* Can not assume word aligned buffer */
224 memcpy(priv->rx_buf, &data, size);
225 priv->rx_buf += 4;
226 break;
227 default:
228 /* This will never execute */
229 break;
230 }
231 }
232 priv->bytes_to_receive -= size;
233 if (priv->bytes_to_receive < 0)
234 priv->bytes_to_receive = 0;
235}
236
237/*
238 * zynq_qspi_write_data - Copy data from TX buffer
239 * @zqspi: Pointer to the zynq_qspi structure
240 * @data: Pointer to the 32 bit variable where data is to be copied
241 * @size: Number of bytes to be copied from TX buffer to data
242 */
243static void zynq_qspi_write_data(struct zynq_qspi_priv *priv,
244 u32 *data, u8 size)
245{
246 if (priv->tx_buf) {
247 switch (size) {
248 case 1:
249 *data = *((u8 *)priv->tx_buf);
250 priv->tx_buf += 1;
251 *data |= 0xFFFFFF00;
252 break;
253 case 2:
254 *data = *((u16 *)priv->tx_buf);
255 priv->tx_buf += 2;
256 *data |= 0xFFFF0000;
257 break;
258 case 3:
259 *data = *((u16 *)priv->tx_buf);
260 priv->tx_buf += 2;
261 *data |= (*((u8 *)priv->tx_buf) << 16);
262 priv->tx_buf += 1;
263 *data |= 0xFF000000;
264 break;
265 case 4:
266 /* Can not assume word aligned buffer */
267 memcpy(data, priv->tx_buf, size);
268 priv->tx_buf += 4;
269 break;
270 default:
271 /* This will never execute */
272 break;
273 }
274 } else {
275 *data = 0;
276 }
277
278 debug("%s: data 0x%08x tx_buf addr: 0x%08x size %d\n", __func__,
279 *data, (u32)priv->tx_buf, size);
280
281 priv->bytes_to_transfer -= size;
282 if (priv->bytes_to_transfer < 0)
283 priv->bytes_to_transfer = 0;
284}
285
286static void zynq_qspi_chipselect(struct zynq_qspi_priv *priv, int is_on)
287{
288 u32 confr;
289 struct zynq_qspi_regs *regs = priv->regs;
290
291 confr = readl(&regs->cr);
292
293 if (is_on) {
294 /* Select the slave */
295 confr &= ~ZYNQ_QSPI_CR_SS_MASK;
296 confr |= (~(1 << priv->cs) << ZYNQ_QSPI_CR_SS_SHIFT) &
297 ZYNQ_QSPI_CR_SS_MASK;
298 } else
299 /* Deselect the slave */
300 confr |= ZYNQ_QSPI_CR_SS_MASK;
301
302 writel(confr, &regs->cr);
303}
304
305/*
306 * zynq_qspi_fill_tx_fifo - Fills the TX FIFO with as many bytes as possible
307 * @zqspi: Pointer to the zynq_qspi structure
308 */
309static void zynq_qspi_fill_tx_fifo(struct zynq_qspi_priv *priv, u32 size)
310{
311 u32 data = 0;
312 u32 fifocount = 0;
313 unsigned len, offset;
314 struct zynq_qspi_regs *regs = priv->regs;
315 static const unsigned offsets[4] = {
316 ZYNQ_QSPI_TXD_00_00_OFFSET, ZYNQ_QSPI_TXD_00_01_OFFSET,
317 ZYNQ_QSPI_TXD_00_10_OFFSET, ZYNQ_QSPI_TXD_00_11_OFFSET };
318
319 while ((fifocount < size) &&
320 (priv->bytes_to_transfer > 0)) {
321 if (priv->bytes_to_transfer >= 4) {
322 if (priv->tx_buf) {
323 memcpy(&data, priv->tx_buf, 4);
324 priv->tx_buf += 4;
325 } else {
326 data = 0;
327 }
328 writel(data, &regs->txd0r);
329 priv->bytes_to_transfer -= 4;
330 fifocount++;
331 } else {
332 /* Write TXD1, TXD2, TXD3 only if TxFIFO is empty. */
333 if (!(readl(&regs->isr)
334 & ZYNQ_QSPI_IXR_TXOW_MASK) &&
335 !priv->rx_buf)
336 return;
337 len = priv->bytes_to_transfer;
338 zynq_qspi_write_data(priv, &data, len);
339 offset = (priv->rx_buf) ? offsets[0] : offsets[len];
340 writel(data, &regs->cr + (offset / 4));
341 }
342 }
343}
344
345/*
346 * zynq_qspi_irq_poll - Interrupt service routine of the QSPI controller
347 * @zqspi: Pointer to the zynq_qspi structure
348 *
349 * This function handles TX empty and Mode Fault interrupts only.
350 * On TX empty interrupt this function reads the received data from RX FIFO and
351 * fills the TX FIFO if there is any data remaining to be transferred.
352 * On Mode Fault interrupt this function indicates that transfer is completed,
353 * the SPI subsystem will identify the error as the remaining bytes to be
354 * transferred is non-zero.
355 *
356 * returns: 0 for poll timeout
357 * 1 transfer operation complete
358 */
359static int zynq_qspi_irq_poll(struct zynq_qspi_priv *priv)
360{
361 struct zynq_qspi_regs *regs = priv->regs;
362 u32 rxindex = 0;
363 u32 rxcount;
364 u32 status, timeout;
365
366 /* Poll until any of the interrupt status bits are set */
367 timeout = get_timer(0);
368 do {
369 status = readl(&regs->isr);
370 } while ((status == 0) &&
Ashok Reddy Somacaecfe62020-05-18 01:11:00 -0600371 (get_timer(timeout) < ZYNQ_QSPI_WAIT));
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530372
373 if (status == 0) {
374 printf("zynq_qspi_irq_poll: Timeout!\n");
375 return -ETIMEDOUT;
376 }
377
378 writel(status, &regs->isr);
379
380 /* Disable all interrupts */
381 writel(ZYNQ_QSPI_IXR_ALL_MASK, &regs->idr);
382 if ((status & ZYNQ_QSPI_IXR_TXOW_MASK) ||
383 (status & ZYNQ_QSPI_IXR_RXNEMPTY_MASK)) {
384 /*
385 * This bit is set when Tx FIFO has < THRESHOLD entries. We have
386 * the THRESHOLD value set to 1, so this bit indicates Tx FIFO
387 * is empty
388 */
389 rxcount = priv->bytes_to_receive - priv->bytes_to_transfer;
390 rxcount = (rxcount % 4) ? ((rxcount/4)+1) : (rxcount/4);
391 while ((rxindex < rxcount) &&
392 (rxindex < ZYNQ_QSPI_RXFIFO_THRESHOLD)) {
393 /* Read out the data from the RX FIFO */
394 u32 data;
395 data = readl(&regs->drxr);
396
397 if (priv->bytes_to_receive >= 4) {
398 if (priv->rx_buf) {
399 memcpy(priv->rx_buf, &data, 4);
400 priv->rx_buf += 4;
401 }
402 priv->bytes_to_receive -= 4;
403 } else {
404 zynq_qspi_read_data(priv, data,
405 priv->bytes_to_receive);
406 }
407 rxindex++;
408 }
409
410 if (priv->bytes_to_transfer) {
411 /* There is more data to send */
412 zynq_qspi_fill_tx_fifo(priv,
413 ZYNQ_QSPI_RXFIFO_THRESHOLD);
414
415 writel(ZYNQ_QSPI_IXR_ALL_MASK, &regs->ier);
416 } else {
417 /*
418 * If transfer and receive is completed then only send
419 * complete signal
420 */
421 if (!priv->bytes_to_receive) {
422 /* return operation complete */
423 writel(ZYNQ_QSPI_IXR_ALL_MASK,
424 &regs->idr);
425 return 1;
426 }
427 }
428 }
429
430 return 0;
431}
432
433/*
434 * zynq_qspi_start_transfer - Initiates the QSPI transfer
435 * @qspi: Pointer to the spi_device structure
436 * @transfer: Pointer to the spi_transfer structure which provide information
437 * about next transfer parameters
438 *
439 * This function fills the TX FIFO, starts the QSPI transfer, and waits for the
440 * transfer to be completed.
441 *
442 * returns: Number of bytes transferred in the last transfer
443 */
444static int zynq_qspi_start_transfer(struct zynq_qspi_priv *priv)
445{
446 u32 data = 0;
447 struct zynq_qspi_regs *regs = priv->regs;
448
449 debug("%s: qspi: 0x%08x transfer: 0x%08x len: %d\n", __func__,
450 (u32)priv, (u32)priv, priv->len);
451
452 priv->bytes_to_transfer = priv->len;
453 priv->bytes_to_receive = priv->len;
454
455 if (priv->len < 4)
456 zynq_qspi_fill_tx_fifo(priv, priv->len);
457 else
458 zynq_qspi_fill_tx_fifo(priv, priv->fifo_depth);
459
460 writel(ZYNQ_QSPI_IXR_ALL_MASK, &regs->ier);
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530461
462 /* wait for completion */
463 do {
464 data = zynq_qspi_irq_poll(priv);
465 } while (data == 0);
466
467 return (priv->len) - (priv->bytes_to_transfer);
468}
469
470static int zynq_qspi_transfer(struct zynq_qspi_priv *priv)
471{
472 unsigned cs_change = 1;
473 int status = 0;
474
475 while (1) {
476 /* Select the chip if required */
477 if (cs_change)
478 zynq_qspi_chipselect(priv, 1);
479
480 cs_change = priv->cs_change;
481
482 if (!priv->tx_buf && !priv->rx_buf && priv->len) {
483 status = -1;
484 break;
485 }
486
487 /* Request the transfer */
488 if (priv->len) {
489 status = zynq_qspi_start_transfer(priv);
490 priv->is_inst = 0;
491 }
492
493 if (status != priv->len) {
494 if (status > 0)
495 status = -EMSGSIZE;
496 debug("zynq_qspi_transfer:%d len:%d\n",
497 status, priv->len);
498 break;
499 }
500 status = 0;
501
502 if (cs_change)
503 /* Deselect the chip */
504 zynq_qspi_chipselect(priv, 0);
505
506 break;
507 }
508
Vipul Kumar72cf0c92018-06-25 14:13:57 +0530509 return status;
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530510}
511
512static int zynq_qspi_claim_bus(struct udevice *dev)
513{
514 struct udevice *bus = dev->parent;
515 struct zynq_qspi_priv *priv = dev_get_priv(bus);
516 struct zynq_qspi_regs *regs = priv->regs;
517
518 writel(ZYNQ_QSPI_ENR_SPI_EN_MASK, &regs->enr);
519
520 return 0;
521}
522
523static int zynq_qspi_release_bus(struct udevice *dev)
524{
525 struct udevice *bus = dev->parent;
526 struct zynq_qspi_priv *priv = dev_get_priv(bus);
527 struct zynq_qspi_regs *regs = priv->regs;
528
529 writel(~ZYNQ_QSPI_ENR_SPI_EN_MASK, &regs->enr);
530
531 return 0;
532}
533
534static int zynq_qspi_xfer(struct udevice *dev, unsigned int bitlen,
535 const void *dout, void *din, unsigned long flags)
536{
537 struct udevice *bus = dev->parent;
538 struct zynq_qspi_priv *priv = dev_get_priv(bus);
539 struct dm_spi_slave_platdata *slave_plat = dev_get_parent_platdata(dev);
540
541 priv->cs = slave_plat->cs;
542 priv->tx_buf = dout;
543 priv->rx_buf = din;
544 priv->len = bitlen / 8;
545
Jagan Tekicc7ae3d2015-10-25 09:31:54 +0530546 debug("zynq_qspi_xfer: bus:%i cs:%i bitlen:%i len:%i flags:%lx\n",
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530547 bus->seq, slave_plat->cs, bitlen, priv->len, flags);
548
549 /*
550 * Festering sore.
551 * Assume that the beginning of a transfer with bits to
552 * transmit must contain a device command.
553 */
554 if (dout && flags & SPI_XFER_BEGIN)
555 priv->is_inst = 1;
556 else
557 priv->is_inst = 0;
558
559 if (flags & SPI_XFER_END)
560 priv->cs_change = 1;
561 else
562 priv->cs_change = 0;
563
564 zynq_qspi_transfer(priv);
565
566 return 0;
567}
568
569static int zynq_qspi_set_speed(struct udevice *bus, uint speed)
570{
571 struct zynq_qspi_platdata *plat = bus->platdata;
572 struct zynq_qspi_priv *priv = dev_get_priv(bus);
573 struct zynq_qspi_regs *regs = priv->regs;
574 uint32_t confr;
575 u8 baud_rate_val = 0;
576
577 if (speed > plat->frequency)
578 speed = plat->frequency;
579
580 /* Set the clock frequency */
581 confr = readl(&regs->cr);
582 if (speed == 0) {
583 /* Set baudrate x8, if the freq is 0 */
584 baud_rate_val = 0x2;
585 } else if (plat->speed_hz != speed) {
586 while ((baud_rate_val < ZYNQ_QSPI_CR_BAUD_MAX) &&
587 ((plat->frequency /
588 (2 << baud_rate_val)) > speed))
589 baud_rate_val++;
590
591 plat->speed_hz = speed / (2 << baud_rate_val);
592 }
593 confr &= ~ZYNQ_QSPI_CR_BAUD_MASK;
594 confr |= (baud_rate_val << ZYNQ_QSPI_CR_BAUD_SHIFT);
595
596 writel(confr, &regs->cr);
597 priv->freq = speed;
598
Jagan Tekicc7ae3d2015-10-25 09:31:54 +0530599 debug("%s: regs=%p, speed=%d\n", __func__, priv->regs, priv->freq);
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530600
601 return 0;
602}
603
604static int zynq_qspi_set_mode(struct udevice *bus, uint mode)
605{
606 struct zynq_qspi_priv *priv = dev_get_priv(bus);
607 struct zynq_qspi_regs *regs = priv->regs;
608 uint32_t confr;
609
610 /* Set the SPI Clock phase and polarities */
611 confr = readl(&regs->cr);
612 confr &= ~(ZYNQ_QSPI_CR_CPHA_MASK | ZYNQ_QSPI_CR_CPOL_MASK);
613
Jagan Tekic27f1c12015-09-08 01:39:44 +0530614 if (mode & SPI_CPHA)
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530615 confr |= ZYNQ_QSPI_CR_CPHA_MASK;
Jagan Tekic27f1c12015-09-08 01:39:44 +0530616 if (mode & SPI_CPOL)
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530617 confr |= ZYNQ_QSPI_CR_CPOL_MASK;
618
619 writel(confr, &regs->cr);
620 priv->mode = mode;
621
Jagan Tekicc7ae3d2015-10-25 09:31:54 +0530622 debug("%s: regs=%p, mode=%d\n", __func__, priv->regs, priv->mode);
Jagan Teki7fbea8a2015-08-17 18:38:06 +0530623
624 return 0;
625}
626
627static const struct dm_spi_ops zynq_qspi_ops = {
628 .claim_bus = zynq_qspi_claim_bus,
629 .release_bus = zynq_qspi_release_bus,
630 .xfer = zynq_qspi_xfer,
631 .set_speed = zynq_qspi_set_speed,
632 .set_mode = zynq_qspi_set_mode,
633};
634
635static const struct udevice_id zynq_qspi_ids[] = {
636 { .compatible = "xlnx,zynq-qspi-1.0" },
637 { }
638};
639
640U_BOOT_DRIVER(zynq_qspi) = {
641 .name = "zynq_qspi",
642 .id = UCLASS_SPI,
643 .of_match = zynq_qspi_ids,
644 .ops = &zynq_qspi_ops,
645 .ofdata_to_platdata = zynq_qspi_ofdata_to_platdata,
646 .platdata_auto_alloc_size = sizeof(struct zynq_qspi_platdata),
647 .priv_auto_alloc_size = sizeof(struct zynq_qspi_priv),
648 .probe = zynq_qspi_probe,
649};