blob: 2c121ba8f0cbc8cf081e34eb3b26d38a3e9a61d2 [file] [log] [blame]
Kamal Dasufa236a72016-08-24 18:04:23 -04001/*
2 * Driver for Broadcom BRCMSTB, NSP, NS2, Cygnus SPI Controllers
3 *
4 * Copyright 2016 Broadcom
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License, version 2, as
8 * published by the Free Software Foundation (the "GPL").
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 (GPLv2) for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * version 2 (GPLv2) along with this source code.
17 */
18
19#include <linux/clk.h>
20#include <linux/delay.h>
21#include <linux/device.h>
22#include <linux/init.h>
23#include <linux/interrupt.h>
24#include <linux/io.h>
25#include <linux/ioport.h>
26#include <linux/kernel.h>
27#include <linux/module.h>
Kamal Dasufa236a72016-08-24 18:04:23 -040028#include <linux/mtd/spi-nor.h>
29#include <linux/of.h>
30#include <linux/of_irq.h>
31#include <linux/platform_device.h>
32#include <linux/slab.h>
33#include <linux/spi/spi.h>
34#include <linux/sysfs.h>
35#include <linux/types.h>
36#include "spi-bcm-qspi.h"
37
38#define DRIVER_NAME "bcm_qspi"
39
Kamal Dasu4e3b2d22016-08-24 18:04:25 -040040
41/* BSPI register offsets */
42#define BSPI_REVISION_ID 0x000
43#define BSPI_SCRATCH 0x004
44#define BSPI_MAST_N_BOOT_CTRL 0x008
45#define BSPI_BUSY_STATUS 0x00c
46#define BSPI_INTR_STATUS 0x010
47#define BSPI_B0_STATUS 0x014
48#define BSPI_B0_CTRL 0x018
49#define BSPI_B1_STATUS 0x01c
50#define BSPI_B1_CTRL 0x020
51#define BSPI_STRAP_OVERRIDE_CTRL 0x024
52#define BSPI_FLEX_MODE_ENABLE 0x028
53#define BSPI_BITS_PER_CYCLE 0x02c
54#define BSPI_BITS_PER_PHASE 0x030
55#define BSPI_CMD_AND_MODE_BYTE 0x034
56#define BSPI_BSPI_FLASH_UPPER_ADDR_BYTE 0x038
57#define BSPI_BSPI_XOR_VALUE 0x03c
58#define BSPI_BSPI_XOR_ENABLE 0x040
59#define BSPI_BSPI_PIO_MODE_ENABLE 0x044
60#define BSPI_BSPI_PIO_IODIR 0x048
61#define BSPI_BSPI_PIO_DATA 0x04c
62
63/* RAF register offsets */
64#define BSPI_RAF_START_ADDR 0x100
65#define BSPI_RAF_NUM_WORDS 0x104
66#define BSPI_RAF_CTRL 0x108
67#define BSPI_RAF_FULLNESS 0x10c
68#define BSPI_RAF_WATERMARK 0x110
69#define BSPI_RAF_STATUS 0x114
70#define BSPI_RAF_READ_DATA 0x118
71#define BSPI_RAF_WORD_CNT 0x11c
72#define BSPI_RAF_CURR_ADDR 0x120
73
74/* Override mode masks */
75#define BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE BIT(0)
76#define BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL BIT(1)
77#define BSPI_STRAP_OVERRIDE_CTRL_ADDR_4BYTE BIT(2)
78#define BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD BIT(3)
79#define BSPI_STRAP_OVERRIDE_CTRL_ENDAIN_MODE BIT(4)
80
81#define BSPI_ADDRLEN_3BYTES 3
82#define BSPI_ADDRLEN_4BYTES 4
83
84#define BSPI_RAF_STATUS_FIFO_EMPTY_MASK BIT(1)
85
86#define BSPI_RAF_CTRL_START_MASK BIT(0)
87#define BSPI_RAF_CTRL_CLEAR_MASK BIT(1)
88
89#define BSPI_BPP_MODE_SELECT_MASK BIT(8)
90#define BSPI_BPP_ADDR_SELECT_MASK BIT(16)
91
92#define BSPI_READ_LENGTH 256
93
Kamal Dasufa236a72016-08-24 18:04:23 -040094/* MSPI register offsets */
95#define MSPI_SPCR0_LSB 0x000
96#define MSPI_SPCR0_MSB 0x004
97#define MSPI_SPCR1_LSB 0x008
98#define MSPI_SPCR1_MSB 0x00c
99#define MSPI_NEWQP 0x010
100#define MSPI_ENDQP 0x014
101#define MSPI_SPCR2 0x018
102#define MSPI_MSPI_STATUS 0x020
103#define MSPI_CPTQP 0x024
104#define MSPI_SPCR3 0x028
105#define MSPI_TXRAM 0x040
106#define MSPI_RXRAM 0x0c0
107#define MSPI_CDRAM 0x140
108#define MSPI_WRITE_LOCK 0x180
109
110#define MSPI_MASTER_BIT BIT(7)
111
112#define MSPI_NUM_CDRAM 16
113#define MSPI_CDRAM_CONT_BIT BIT(7)
114#define MSPI_CDRAM_BITSE_BIT BIT(6)
115#define MSPI_CDRAM_PCS 0xf
116
117#define MSPI_SPCR2_SPE BIT(6)
118#define MSPI_SPCR2_CONT_AFTER_CMD BIT(7)
119
120#define MSPI_MSPI_STATUS_SPIF BIT(0)
121
122#define INTR_BASE_BIT_SHIFT 0x02
123#define INTR_COUNT 0x07
124
125#define NUM_CHIPSELECT 4
126#define QSPI_SPBR_MIN 8U
127#define QSPI_SPBR_MAX 255U
128
129#define OPCODE_DIOR 0xBB
130#define OPCODE_QIOR 0xEB
131#define OPCODE_DIOR_4B 0xBC
132#define OPCODE_QIOR_4B 0xEC
133
134#define MAX_CMD_SIZE 6
135
136#define ADDR_4MB_MASK GENMASK(22, 0)
137
138/* stop at end of transfer, no other reason */
139#define TRANS_STATUS_BREAK_NONE 0
140/* stop at end of spi_message */
141#define TRANS_STATUS_BREAK_EOM 1
142/* stop at end of spi_transfer if delay */
143#define TRANS_STATUS_BREAK_DELAY 2
144/* stop at end of spi_transfer if cs_change */
145#define TRANS_STATUS_BREAK_CS_CHANGE 4
146/* stop if we run out of bytes */
147#define TRANS_STATUS_BREAK_NO_BYTES 8
148
149/* events that make us stop filling TX slots */
150#define TRANS_STATUS_BREAK_TX (TRANS_STATUS_BREAK_EOM | \
151 TRANS_STATUS_BREAK_DELAY | \
152 TRANS_STATUS_BREAK_CS_CHANGE)
153
154/* events that make us deassert CS */
155#define TRANS_STATUS_BREAK_DESELECT (TRANS_STATUS_BREAK_EOM | \
156 TRANS_STATUS_BREAK_CS_CHANGE)
157
158struct bcm_qspi_parms {
159 u32 speed_hz;
160 u8 mode;
161 u8 bits_per_word;
162};
163
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400164struct bcm_xfer_mode {
165 bool flex_mode;
166 unsigned int width;
167 unsigned int addrlen;
168 unsigned int hp;
169};
170
Kamal Dasufa236a72016-08-24 18:04:23 -0400171enum base_type {
172 MSPI,
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400173 BSPI,
Kamal Dasufa236a72016-08-24 18:04:23 -0400174 CHIP_SELECT,
175 BASEMAX,
176};
177
178struct bcm_qspi_irq {
179 const char *irq_name;
180 const irq_handler_t irq_handler;
181 u32 mask;
182};
183
184struct bcm_qspi_dev_id {
185 const struct bcm_qspi_irq *irqp;
186 void *dev;
187};
188
189struct qspi_trans {
190 struct spi_transfer *trans;
191 int byte;
192};
193
194struct bcm_qspi {
195 struct platform_device *pdev;
196 struct spi_master *master;
197 struct clk *clk;
198 u32 base_clk;
199 u32 max_speed_hz;
200 void __iomem *base[BASEMAX];
201 struct bcm_qspi_parms last_parms;
202 struct qspi_trans trans_pos;
203 int curr_cs;
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400204 int bspi_maj_rev;
205 int bspi_min_rev;
206 int bspi_enabled;
207 struct spi_flash_read_message *bspi_rf_msg;
208 u32 bspi_rf_msg_idx;
209 u32 bspi_rf_msg_len;
210 u32 bspi_rf_msg_status;
211 struct bcm_xfer_mode xfer_mode;
Kamal Dasufa236a72016-08-24 18:04:23 -0400212 u32 s3_strap_override_ctrl;
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400213 bool bspi_mode;
Kamal Dasufa236a72016-08-24 18:04:23 -0400214 bool big_endian;
215 int num_irqs;
216 struct bcm_qspi_dev_id *dev_ids;
217 struct completion mspi_done;
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400218 struct completion bspi_done;
Kamal Dasufa236a72016-08-24 18:04:23 -0400219};
220
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400221static inline bool has_bspi(struct bcm_qspi *qspi)
222{
223 return qspi->bspi_mode;
224}
225
Kamal Dasufa236a72016-08-24 18:04:23 -0400226/* Read qspi controller register*/
227static inline u32 bcm_qspi_read(struct bcm_qspi *qspi, enum base_type type,
228 unsigned int offset)
229{
230 return bcm_qspi_readl(qspi->big_endian, qspi->base[type] + offset);
231}
232
233/* Write qspi controller register*/
234static inline void bcm_qspi_write(struct bcm_qspi *qspi, enum base_type type,
235 unsigned int offset, unsigned int data)
236{
237 bcm_qspi_writel(qspi->big_endian, data, qspi->base[type] + offset);
238}
239
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400240/* BSPI helpers */
241static int bcm_qspi_bspi_busy_poll(struct bcm_qspi *qspi)
242{
243 int i;
244
245 /* this should normally finish within 10us */
246 for (i = 0; i < 1000; i++) {
247 if (!(bcm_qspi_read(qspi, BSPI, BSPI_BUSY_STATUS) & 1))
248 return 0;
249 udelay(1);
250 }
251 dev_warn(&qspi->pdev->dev, "timeout waiting for !busy_status\n");
252 return -EIO;
253}
254
255static inline bool bcm_qspi_bspi_ver_three(struct bcm_qspi *qspi)
256{
257 if (qspi->bspi_maj_rev < 4)
258 return true;
259 return false;
260}
261
262static void bcm_qspi_bspi_flush_prefetch_buffers(struct bcm_qspi *qspi)
263{
264 bcm_qspi_bspi_busy_poll(qspi);
265 /* Force rising edge for the b0/b1 'flush' field */
266 bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 1);
267 bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 1);
268 bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 0);
269 bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 0);
270}
271
272static int bcm_qspi_bspi_lr_is_fifo_empty(struct bcm_qspi *qspi)
273{
274 return (bcm_qspi_read(qspi, BSPI, BSPI_RAF_STATUS) &
275 BSPI_RAF_STATUS_FIFO_EMPTY_MASK);
276}
277
278static inline u32 bcm_qspi_bspi_lr_read_fifo(struct bcm_qspi *qspi)
279{
280 u32 data = bcm_qspi_read(qspi, BSPI, BSPI_RAF_READ_DATA);
281
282 /* BSPI v3 LR is LE only, convert data to host endianness */
283 if (bcm_qspi_bspi_ver_three(qspi))
284 data = le32_to_cpu(data);
285
286 return data;
287}
288
289static inline void bcm_qspi_bspi_lr_start(struct bcm_qspi *qspi)
290{
291 bcm_qspi_bspi_busy_poll(qspi);
292 bcm_qspi_write(qspi, BSPI, BSPI_RAF_CTRL,
293 BSPI_RAF_CTRL_START_MASK);
294}
295
296static inline void bcm_qspi_bspi_lr_clear(struct bcm_qspi *qspi)
297{
298 bcm_qspi_write(qspi, BSPI, BSPI_RAF_CTRL,
299 BSPI_RAF_CTRL_CLEAR_MASK);
300 bcm_qspi_bspi_flush_prefetch_buffers(qspi);
301}
302
303static void bcm_qspi_bspi_lr_data_read(struct bcm_qspi *qspi)
304{
305 u32 *buf = (u32 *)qspi->bspi_rf_msg->buf;
306 u32 data = 0;
307
308 dev_dbg(&qspi->pdev->dev, "xfer %p rx %p rxlen %d\n", qspi->bspi_rf_msg,
309 qspi->bspi_rf_msg->buf, qspi->bspi_rf_msg_len);
310 while (!bcm_qspi_bspi_lr_is_fifo_empty(qspi)) {
311 data = bcm_qspi_bspi_lr_read_fifo(qspi);
312 if (likely(qspi->bspi_rf_msg_len >= 4) &&
313 IS_ALIGNED((uintptr_t)buf, 4)) {
314 buf[qspi->bspi_rf_msg_idx++] = data;
315 qspi->bspi_rf_msg_len -= 4;
316 } else {
317 /* Read out remaining bytes, make sure*/
318 u8 *cbuf = (u8 *)&buf[qspi->bspi_rf_msg_idx];
319
320 data = cpu_to_le32(data);
321 while (qspi->bspi_rf_msg_len) {
322 *cbuf++ = (u8)data;
323 data >>= 8;
324 qspi->bspi_rf_msg_len--;
325 }
326 }
327 }
328}
329
330static void bcm_qspi_bspi_set_xfer_params(struct bcm_qspi *qspi, u8 cmd_byte,
331 int bpp, int bpc, int flex_mode)
332{
333 bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, 0);
334 bcm_qspi_write(qspi, BSPI, BSPI_BITS_PER_CYCLE, bpc);
335 bcm_qspi_write(qspi, BSPI, BSPI_BITS_PER_PHASE, bpp);
336 bcm_qspi_write(qspi, BSPI, BSPI_CMD_AND_MODE_BYTE, cmd_byte);
337 bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, flex_mode);
338}
339
340static int bcm_qspi_bspi_set_flex_mode(struct bcm_qspi *qspi, int width,
341 int addrlen, int hp)
342{
343 int bpc = 0, bpp = 0;
344 u8 command = SPINOR_OP_READ_FAST;
345 int flex_mode = 1, rv = 0;
346 bool spans_4byte = false;
347
348 dev_dbg(&qspi->pdev->dev, "set flex mode w %x addrlen %x hp %d\n",
349 width, addrlen, hp);
350
351 if (addrlen == BSPI_ADDRLEN_4BYTES) {
352 bpp = BSPI_BPP_ADDR_SELECT_MASK;
353 spans_4byte = true;
354 }
355
356 bpp |= 8;
357
358 switch (width) {
359 case SPI_NBITS_SINGLE:
360 if (addrlen == BSPI_ADDRLEN_3BYTES)
361 /* default mode, does not need flex_cmd */
362 flex_mode = 0;
363 else
364 command = SPINOR_OP_READ4_FAST;
365 break;
366 case SPI_NBITS_DUAL:
367 bpc = 0x00000001;
368 if (hp) {
369 bpc |= 0x00010100; /* address and mode are 2-bit */
370 bpp = BSPI_BPP_MODE_SELECT_MASK;
371 command = OPCODE_DIOR;
372 if (spans_4byte)
373 command = OPCODE_DIOR_4B;
374 } else {
375 command = SPINOR_OP_READ_1_1_2;
376 if (spans_4byte)
377 command = SPINOR_OP_READ4_1_1_2;
378 }
379 break;
380 case SPI_NBITS_QUAD:
381 bpc = 0x00000002;
382 if (hp) {
383 bpc |= 0x00020200; /* address and mode are 4-bit */
384 bpp = 4; /* dummy cycles */
385 bpp |= BSPI_BPP_ADDR_SELECT_MASK;
386 command = OPCODE_QIOR;
387 if (spans_4byte)
388 command = OPCODE_QIOR_4B;
389 } else {
390 command = SPINOR_OP_READ_1_1_4;
391 if (spans_4byte)
392 command = SPINOR_OP_READ4_1_1_4;
393 }
394 break;
395 default:
396 rv = -EINVAL;
397 break;
398 }
399
400 if (rv == 0)
401 bcm_qspi_bspi_set_xfer_params(qspi, command, bpp, bpc,
402 flex_mode);
403
404 return rv;
405}
406
407static int bcm_qspi_bspi_set_override(struct bcm_qspi *qspi, int width,
408 int addrlen, int hp)
409{
410 u32 data = bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
411
412 dev_dbg(&qspi->pdev->dev, "set override mode w %x addrlen %x hp %d\n",
413 width, addrlen, hp);
414
415 switch (width) {
416 case SPI_NBITS_SINGLE:
417 /* clear quad/dual mode */
418 data &= ~(BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD |
419 BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL);
420 break;
421
422 case SPI_NBITS_QUAD:
423 /* clear dual mode and set quad mode */
424 data &= ~BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL;
425 data |= BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD;
426 break;
427 case SPI_NBITS_DUAL:
428 /* clear quad mode set dual mode */
429 data &= ~BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD;
430 data |= BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL;
431 break;
432 default:
433 return -EINVAL;
434 }
435
436 if (addrlen == BSPI_ADDRLEN_4BYTES)
437 /* set 4byte mode*/
438 data |= BSPI_STRAP_OVERRIDE_CTRL_ADDR_4BYTE;
439 else
440 /* clear 4 byte mode */
441 data &= ~BSPI_STRAP_OVERRIDE_CTRL_ADDR_4BYTE;
442
443 /* set the override mode */
444 data |= BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE;
445 bcm_qspi_write(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL, data);
446 bcm_qspi_bspi_set_xfer_params(qspi, SPINOR_OP_READ_FAST, 0, 0, 0);
447
448 return 0;
449}
450
451static int bcm_qspi_bspi_set_mode(struct bcm_qspi *qspi,
452 int width, int addrlen, int hp)
453{
454 int error = 0;
455
456 /* default mode */
457 qspi->xfer_mode.flex_mode = true;
458
459 if (!bcm_qspi_bspi_ver_three(qspi)) {
460 u32 val, mask;
461
462 val = bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
463 mask = BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE;
464 if (val & mask || qspi->s3_strap_override_ctrl & mask) {
465 qspi->xfer_mode.flex_mode = false;
466 bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE,
467 0);
468
469 if ((val | qspi->s3_strap_override_ctrl) &
470 BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL)
471 width = SPI_NBITS_DUAL;
472 else if ((val | qspi->s3_strap_override_ctrl) &
473 BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD)
474 width = SPI_NBITS_QUAD;
475
476 error = bcm_qspi_bspi_set_override(qspi, width, addrlen,
477 hp);
478 }
479 }
480
481 if (qspi->xfer_mode.flex_mode)
482 error = bcm_qspi_bspi_set_flex_mode(qspi, width, addrlen, hp);
483
484 if (error) {
485 dev_warn(&qspi->pdev->dev,
486 "INVALID COMBINATION: width=%d addrlen=%d hp=%d\n",
487 width, addrlen, hp);
488 } else if (qspi->xfer_mode.width != width ||
489 qspi->xfer_mode.addrlen != addrlen ||
490 qspi->xfer_mode.hp != hp) {
491 qspi->xfer_mode.width = width;
492 qspi->xfer_mode.addrlen = addrlen;
493 qspi->xfer_mode.hp = hp;
494 dev_dbg(&qspi->pdev->dev,
495 "cs:%d %d-lane output, %d-byte address%s\n",
496 qspi->curr_cs,
497 qspi->xfer_mode.width,
498 qspi->xfer_mode.addrlen,
499 qspi->xfer_mode.hp != -1 ? ", hp mode" : "");
500 }
501
502 return error;
503}
504
505static void bcm_qspi_enable_bspi(struct bcm_qspi *qspi)
506{
507 if (!has_bspi(qspi) || (qspi->bspi_enabled))
508 return;
509
510 qspi->bspi_enabled = 1;
511 if ((bcm_qspi_read(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL) & 1) == 0)
512 return;
513
514 bcm_qspi_bspi_flush_prefetch_buffers(qspi);
515 udelay(1);
516 bcm_qspi_write(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL, 0);
517 udelay(1);
518}
519
520static void bcm_qspi_disable_bspi(struct bcm_qspi *qspi)
521{
522 if (!has_bspi(qspi) || (!qspi->bspi_enabled))
523 return;
524
525 qspi->bspi_enabled = 0;
526 if ((bcm_qspi_read(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL) & 1))
527 return;
528
529 bcm_qspi_bspi_busy_poll(qspi);
530 bcm_qspi_write(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL, 1);
531 udelay(1);
532}
533
Kamal Dasufa236a72016-08-24 18:04:23 -0400534static void bcm_qspi_chip_select(struct bcm_qspi *qspi, int cs)
535{
536 u32 data = 0;
537
538 if (qspi->curr_cs == cs)
539 return;
540 if (qspi->base[CHIP_SELECT]) {
541 data = bcm_qspi_read(qspi, CHIP_SELECT, 0);
542 data = (data & ~0xff) | (1 << cs);
543 bcm_qspi_write(qspi, CHIP_SELECT, 0, data);
544 usleep_range(10, 20);
545 }
546 qspi->curr_cs = cs;
547}
548
549/* MSPI helpers */
550static void bcm_qspi_hw_set_parms(struct bcm_qspi *qspi,
551 const struct bcm_qspi_parms *xp)
552{
553 u32 spcr, spbr = 0;
554
555 if (xp->speed_hz)
556 spbr = qspi->base_clk / (2 * xp->speed_hz);
557
558 spcr = clamp_val(spbr, QSPI_SPBR_MIN, QSPI_SPBR_MAX);
559 bcm_qspi_write(qspi, MSPI, MSPI_SPCR0_LSB, spcr);
560
561 spcr = MSPI_MASTER_BIT;
562 /* for 16 bit the data should be zero */
563 if (xp->bits_per_word != 16)
564 spcr |= xp->bits_per_word << 2;
565 spcr |= xp->mode & 3;
566 bcm_qspi_write(qspi, MSPI, MSPI_SPCR0_MSB, spcr);
567
568 qspi->last_parms = *xp;
569}
570
571static void bcm_qspi_update_parms(struct bcm_qspi *qspi,
572 struct spi_device *spi,
573 struct spi_transfer *trans)
574{
575 struct bcm_qspi_parms xp;
576
577 xp.speed_hz = trans->speed_hz;
578 xp.bits_per_word = trans->bits_per_word;
579 xp.mode = spi->mode;
580
581 bcm_qspi_hw_set_parms(qspi, &xp);
582}
583
584static int bcm_qspi_setup(struct spi_device *spi)
585{
586 struct bcm_qspi_parms *xp;
587
588 if (spi->bits_per_word > 16)
589 return -EINVAL;
590
591 xp = spi_get_ctldata(spi);
592 if (!xp) {
593 xp = kzalloc(sizeof(*xp), GFP_KERNEL);
594 if (!xp)
595 return -ENOMEM;
596 spi_set_ctldata(spi, xp);
597 }
598 xp->speed_hz = spi->max_speed_hz;
599 xp->mode = spi->mode;
600
601 if (spi->bits_per_word)
602 xp->bits_per_word = spi->bits_per_word;
603 else
604 xp->bits_per_word = 8;
605
606 return 0;
607}
608
609static int update_qspi_trans_byte_count(struct bcm_qspi *qspi,
610 struct qspi_trans *qt, int flags)
611{
612 int ret = TRANS_STATUS_BREAK_NONE;
613
614 /* count the last transferred bytes */
615 if (qt->trans->bits_per_word <= 8)
616 qt->byte++;
617 else
618 qt->byte += 2;
619
620 if (qt->byte >= qt->trans->len) {
621 /* we're at the end of the spi_transfer */
622
623 /* in TX mode, need to pause for a delay or CS change */
624 if (qt->trans->delay_usecs &&
625 (flags & TRANS_STATUS_BREAK_DELAY))
626 ret |= TRANS_STATUS_BREAK_DELAY;
627 if (qt->trans->cs_change &&
628 (flags & TRANS_STATUS_BREAK_CS_CHANGE))
629 ret |= TRANS_STATUS_BREAK_CS_CHANGE;
630 if (ret)
631 goto done;
632
633 dev_dbg(&qspi->pdev->dev, "advance msg exit\n");
634 if (spi_transfer_is_last(qspi->master, qt->trans))
635 ret = TRANS_STATUS_BREAK_EOM;
636 else
637 ret = TRANS_STATUS_BREAK_NO_BYTES;
638
639 qt->trans = NULL;
640 }
641
642done:
643 dev_dbg(&qspi->pdev->dev, "trans %p len %d byte %d ret %x\n",
644 qt->trans, qt->trans ? qt->trans->len : 0, qt->byte, ret);
645 return ret;
646}
647
648static inline u8 read_rxram_slot_u8(struct bcm_qspi *qspi, int slot)
649{
650 u32 slot_offset = MSPI_RXRAM + (slot << 3) + 0x4;
651
652 /* mask out reserved bits */
653 return bcm_qspi_read(qspi, MSPI, slot_offset) & 0xff;
654}
655
656static inline u16 read_rxram_slot_u16(struct bcm_qspi *qspi, int slot)
657{
658 u32 reg_offset = MSPI_RXRAM;
659 u32 lsb_offset = reg_offset + (slot << 3) + 0x4;
660 u32 msb_offset = reg_offset + (slot << 3);
661
662 return (bcm_qspi_read(qspi, MSPI, lsb_offset) & 0xff) |
663 ((bcm_qspi_read(qspi, MSPI, msb_offset) & 0xff) << 8);
664}
665
666static void read_from_hw(struct bcm_qspi *qspi, int slots)
667{
668 struct qspi_trans tp;
669 int slot;
670
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400671 bcm_qspi_disable_bspi(qspi);
672
Kamal Dasufa236a72016-08-24 18:04:23 -0400673 if (slots > MSPI_NUM_CDRAM) {
674 /* should never happen */
675 dev_err(&qspi->pdev->dev, "%s: too many slots!\n", __func__);
676 return;
677 }
678
679 tp = qspi->trans_pos;
680
681 for (slot = 0; slot < slots; slot++) {
682 if (tp.trans->bits_per_word <= 8) {
683 u8 *buf = tp.trans->rx_buf;
684
685 if (buf)
686 buf[tp.byte] = read_rxram_slot_u8(qspi, slot);
687 dev_dbg(&qspi->pdev->dev, "RD %02x\n",
688 buf ? buf[tp.byte] : 0xff);
689 } else {
690 u16 *buf = tp.trans->rx_buf;
691
692 if (buf)
693 buf[tp.byte / 2] = read_rxram_slot_u16(qspi,
694 slot);
695 dev_dbg(&qspi->pdev->dev, "RD %04x\n",
696 buf ? buf[tp.byte] : 0xffff);
697 }
698
699 update_qspi_trans_byte_count(qspi, &tp,
700 TRANS_STATUS_BREAK_NONE);
701 }
702
703 qspi->trans_pos = tp;
704}
705
706static inline void write_txram_slot_u8(struct bcm_qspi *qspi, int slot,
707 u8 val)
708{
709 u32 reg_offset = MSPI_TXRAM + (slot << 3);
710
711 /* mask out reserved bits */
712 bcm_qspi_write(qspi, MSPI, reg_offset, val);
713}
714
715static inline void write_txram_slot_u16(struct bcm_qspi *qspi, int slot,
716 u16 val)
717{
718 u32 reg_offset = MSPI_TXRAM;
719 u32 msb_offset = reg_offset + (slot << 3);
720 u32 lsb_offset = reg_offset + (slot << 3) + 0x4;
721
722 bcm_qspi_write(qspi, MSPI, msb_offset, (val >> 8));
723 bcm_qspi_write(qspi, MSPI, lsb_offset, (val & 0xff));
724}
725
726static inline u32 read_cdram_slot(struct bcm_qspi *qspi, int slot)
727{
728 return bcm_qspi_read(qspi, MSPI, MSPI_CDRAM + (slot << 2));
729}
730
731static inline void write_cdram_slot(struct bcm_qspi *qspi, int slot, u32 val)
732{
733 bcm_qspi_write(qspi, MSPI, (MSPI_CDRAM + (slot << 2)), val);
734}
735
736/* Return number of slots written */
737static int write_to_hw(struct bcm_qspi *qspi, struct spi_device *spi)
738{
739 struct qspi_trans tp;
740 int slot = 0, tstatus = 0;
741 u32 mspi_cdram = 0;
742
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400743 bcm_qspi_disable_bspi(qspi);
Kamal Dasufa236a72016-08-24 18:04:23 -0400744 tp = qspi->trans_pos;
745 bcm_qspi_update_parms(qspi, spi, tp.trans);
746
747 /* Run until end of transfer or reached the max data */
748 while (!tstatus && slot < MSPI_NUM_CDRAM) {
749 if (tp.trans->bits_per_word <= 8) {
750 const u8 *buf = tp.trans->tx_buf;
751 u8 val = buf ? buf[tp.byte] : 0xff;
752
753 write_txram_slot_u8(qspi, slot, val);
754 dev_dbg(&qspi->pdev->dev, "WR %02x\n", val);
755 } else {
756 const u16 *buf = tp.trans->tx_buf;
757 u16 val = buf ? buf[tp.byte / 2] : 0xffff;
758
759 write_txram_slot_u16(qspi, slot, val);
760 dev_dbg(&qspi->pdev->dev, "WR %04x\n", val);
761 }
762 mspi_cdram = MSPI_CDRAM_CONT_BIT;
763 mspi_cdram |= (~(1 << spi->chip_select) &
764 MSPI_CDRAM_PCS);
765 mspi_cdram |= ((tp.trans->bits_per_word <= 8) ? 0 :
766 MSPI_CDRAM_BITSE_BIT);
767
768 write_cdram_slot(qspi, slot, mspi_cdram);
769
770 tstatus = update_qspi_trans_byte_count(qspi, &tp,
771 TRANS_STATUS_BREAK_TX);
772 slot++;
773 }
774
775 if (!slot) {
776 dev_err(&qspi->pdev->dev, "%s: no data to send?", __func__);
777 goto done;
778 }
779
780 dev_dbg(&qspi->pdev->dev, "submitting %d slots\n", slot);
781 bcm_qspi_write(qspi, MSPI, MSPI_NEWQP, 0);
782 bcm_qspi_write(qspi, MSPI, MSPI_ENDQP, slot - 1);
783
784 if (tstatus & TRANS_STATUS_BREAK_DESELECT) {
785 mspi_cdram = read_cdram_slot(qspi, slot - 1) &
786 ~MSPI_CDRAM_CONT_BIT;
787 write_cdram_slot(qspi, slot - 1, mspi_cdram);
788 }
789
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400790 if (has_bspi(qspi))
791 bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 1);
792
Kamal Dasufa236a72016-08-24 18:04:23 -0400793 /* Must flush previous writes before starting MSPI operation */
794 mb();
795 /* Set cont | spe | spifie */
796 bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0xe0);
797
798done:
799 return slot;
800}
801
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400802static int bcm_qspi_bspi_flash_read(struct spi_device *spi,
803 struct spi_flash_read_message *msg)
804{
805 struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
806 u32 addr = 0, len, len_words;
807 int ret = 0;
808 unsigned long timeo = msecs_to_jiffies(100);
809
810 if (bcm_qspi_bspi_ver_three(qspi))
811 if (msg->addr_width == BSPI_ADDRLEN_4BYTES)
812 return -EIO;
813
814 bcm_qspi_chip_select(qspi, spi->chip_select);
815 bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0);
816
817 /*
818 * when using flex mode mode we need to send
819 * the upper address byte to bspi
820 */
821 if (bcm_qspi_bspi_ver_three(qspi) == false) {
822 addr = msg->from & 0xff000000;
823 bcm_qspi_write(qspi, BSPI,
824 BSPI_BSPI_FLASH_UPPER_ADDR_BYTE, addr);
825 }
826
827 if (!qspi->xfer_mode.flex_mode)
828 addr = msg->from;
829 else
830 addr = msg->from & 0x00ffffff;
831
832 /* set BSPI RAF buffer max read length */
833 len = msg->len;
834 if (len > BSPI_READ_LENGTH)
835 len = BSPI_READ_LENGTH;
836
837 if (bcm_qspi_bspi_ver_three(qspi) == true)
838 addr = (addr + 0xc00000) & 0xffffff;
839
840 reinit_completion(&qspi->bspi_done);
841 bcm_qspi_enable_bspi(qspi);
842 len_words = (len + 3) >> 2;
843 qspi->bspi_rf_msg = msg;
844 qspi->bspi_rf_msg_status = 0;
845 qspi->bspi_rf_msg_idx = 0;
846 qspi->bspi_rf_msg_len = len;
847 dev_dbg(&qspi->pdev->dev, "bspi xfr addr 0x%x len 0x%x", addr, len);
848
849 bcm_qspi_write(qspi, BSPI, BSPI_RAF_START_ADDR, addr);
850 bcm_qspi_write(qspi, BSPI, BSPI_RAF_NUM_WORDS, len_words);
851 bcm_qspi_write(qspi, BSPI, BSPI_RAF_WATERMARK, 0);
852
853 /* Must flush previous writes before starting BSPI operation */
854 mb();
855
856 bcm_qspi_bspi_lr_start(qspi);
857 if (!wait_for_completion_timeout(&qspi->bspi_done, timeo)) {
858 dev_err(&qspi->pdev->dev, "timeout waiting for BSPI\n");
859 ret = -ETIMEDOUT;
860 } else {
861 /* set the return length for the caller */
862 msg->retlen = len;
863 }
864
865 return ret;
866}
867
868static int bcm_qspi_flash_read(struct spi_device *spi,
869 struct spi_flash_read_message *msg)
870{
871 struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
872 int ret = 0;
873 bool mspi_read = false;
874 u32 io_width, addrlen, addr, len;
875 u_char *buf;
876
877 buf = msg->buf;
878 addr = msg->from;
879 len = msg->len;
880
881 if (bcm_qspi_bspi_ver_three(qspi) == true) {
882 /*
883 * The address coming into this function is a raw flash offset.
884 * But for BSPI <= V3, we need to convert it to a remapped BSPI
885 * address. If it crosses a 4MB boundary, just revert back to
886 * using MSPI.
887 */
888 addr = (addr + 0xc00000) & 0xffffff;
889
890 if ((~ADDR_4MB_MASK & addr) ^
891 (~ADDR_4MB_MASK & (addr + len - 1)))
892 mspi_read = true;
893 }
894
895 /* non-aligned and very short transfers are handled by MSPI */
896 if (!IS_ALIGNED((uintptr_t)addr, 4) || !IS_ALIGNED((uintptr_t)buf, 4) ||
897 len < 4)
898 mspi_read = true;
899
900 if (mspi_read)
901 /* this will make the m25p80 read to fallback to mspi read */
902 return -EAGAIN;
903
904 io_width = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE;
905 addrlen = msg->addr_width;
906 ret = bcm_qspi_bspi_set_mode(qspi, io_width, addrlen, -1);
907
908 if (!ret)
909 ret = bcm_qspi_bspi_flash_read(spi, msg);
910
911 return ret;
912}
913
Kamal Dasufa236a72016-08-24 18:04:23 -0400914static int bcm_qspi_transfer_one(struct spi_master *master,
915 struct spi_device *spi,
916 struct spi_transfer *trans)
917{
918 struct bcm_qspi *qspi = spi_master_get_devdata(master);
919 int slots;
920 unsigned long timeo = msecs_to_jiffies(100);
921
922 bcm_qspi_chip_select(qspi, spi->chip_select);
923 qspi->trans_pos.trans = trans;
924 qspi->trans_pos.byte = 0;
925
926 while (qspi->trans_pos.byte < trans->len) {
927 reinit_completion(&qspi->mspi_done);
928
929 slots = write_to_hw(qspi, spi);
930 if (!wait_for_completion_timeout(&qspi->mspi_done, timeo)) {
931 dev_err(&qspi->pdev->dev, "timeout waiting for MSPI\n");
932 return -ETIMEDOUT;
933 }
934
935 read_from_hw(qspi, slots);
936 }
937
938 return 0;
939}
940
941static void bcm_qspi_cleanup(struct spi_device *spi)
942{
943 struct bcm_qspi_parms *xp = spi_get_ctldata(spi);
944
945 kfree(xp);
946}
947
948static irqreturn_t bcm_qspi_mspi_l2_isr(int irq, void *dev_id)
949{
950 struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
951 struct bcm_qspi *qspi = qspi_dev_id->dev;
952 u32 status = bcm_qspi_read(qspi, MSPI, MSPI_MSPI_STATUS);
953
954 if (status & MSPI_MSPI_STATUS_SPIF) {
955 /* clear interrupt */
956 status &= ~MSPI_MSPI_STATUS_SPIF;
957 bcm_qspi_write(qspi, MSPI, MSPI_MSPI_STATUS, status);
958 complete(&qspi->mspi_done);
959 return IRQ_HANDLED;
Kamal Dasufa236a72016-08-24 18:04:23 -0400960 }
Kamal Dasu4e3b2d22016-08-24 18:04:25 -0400961
962 return IRQ_NONE;
963}
964
965static irqreturn_t bcm_qspi_bspi_lr_l2_isr(int irq, void *dev_id)
966{
967 struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
968 struct bcm_qspi *qspi = qspi_dev_id->dev;
969 u32 status;
970
971 if (qspi->bspi_enabled && qspi->bspi_rf_msg) {
972 bcm_qspi_bspi_lr_data_read(qspi);
973 if (qspi->bspi_rf_msg_len == 0) {
974 qspi->bspi_rf_msg = NULL;
975 if (qspi->bspi_rf_msg_status)
976 bcm_qspi_bspi_lr_clear(qspi);
977 else
978 bcm_qspi_bspi_flush_prefetch_buffers(qspi);
979 }
980 }
981
982 status = (qspi_dev_id->irqp->mask & INTR_BSPI_LR_SESSION_DONE_MASK);
983 if (qspi->bspi_enabled && status && qspi->bspi_rf_msg_len == 0)
984 complete(&qspi->bspi_done);
985
986 return IRQ_HANDLED;
987}
988
989static irqreturn_t bcm_qspi_bspi_lr_err_l2_isr(int irq, void *dev_id)
990{
991 struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
992 struct bcm_qspi *qspi = qspi_dev_id->dev;
993
994 dev_err(&qspi->pdev->dev, "BSPI INT error\n");
995 qspi->bspi_rf_msg_status = -EIO;
996 complete(&qspi->bspi_done);
997 return IRQ_HANDLED;
Kamal Dasufa236a72016-08-24 18:04:23 -0400998}
999
1000static const struct bcm_qspi_irq qspi_irq_tab[] = {
1001 {
Kamal Dasu4e3b2d22016-08-24 18:04:25 -04001002 .irq_name = "spi_lr_fullness_reached",
1003 .irq_handler = bcm_qspi_bspi_lr_l2_isr,
1004 .mask = INTR_BSPI_LR_FULLNESS_REACHED_MASK,
1005 },
1006 {
1007 .irq_name = "spi_lr_session_aborted",
1008 .irq_handler = bcm_qspi_bspi_lr_err_l2_isr,
1009 .mask = INTR_BSPI_LR_SESSION_ABORTED_MASK,
1010 },
1011 {
1012 .irq_name = "spi_lr_impatient",
1013 .irq_handler = bcm_qspi_bspi_lr_err_l2_isr,
1014 .mask = INTR_BSPI_LR_IMPATIENT_MASK,
1015 },
1016 {
1017 .irq_name = "spi_lr_session_done",
1018 .irq_handler = bcm_qspi_bspi_lr_l2_isr,
1019 .mask = INTR_BSPI_LR_SESSION_DONE_MASK,
1020 },
1021#ifdef QSPI_INT_DEBUG
1022 /* this interrupt is for debug purposes only, dont request irq */
1023 {
1024 .irq_name = "spi_lr_overread",
1025 .irq_handler = bcm_qspi_bspi_lr_err_l2_isr,
1026 .mask = INTR_BSPI_LR_OVERREAD_MASK,
1027 },
1028#endif
1029 {
Kamal Dasufa236a72016-08-24 18:04:23 -04001030 .irq_name = "mspi_done",
1031 .irq_handler = bcm_qspi_mspi_l2_isr,
1032 .mask = INTR_MSPI_DONE_MASK,
1033 },
1034 {
1035 .irq_name = "mspi_halted",
1036 .irq_handler = bcm_qspi_mspi_l2_isr,
1037 .mask = INTR_MSPI_HALTED_MASK,
1038 },
1039};
1040
Kamal Dasu4e3b2d22016-08-24 18:04:25 -04001041static void bcm_qspi_bspi_init(struct bcm_qspi *qspi)
1042{
1043 u32 val = 0;
1044
1045 val = bcm_qspi_read(qspi, BSPI, BSPI_REVISION_ID);
1046 qspi->bspi_maj_rev = (val >> 8) & 0xff;
1047 qspi->bspi_min_rev = val & 0xff;
1048 if (!(bcm_qspi_bspi_ver_three(qspi))) {
1049 /* Force mapping of BSPI address -> flash offset */
1050 bcm_qspi_write(qspi, BSPI, BSPI_BSPI_XOR_VALUE, 0);
1051 bcm_qspi_write(qspi, BSPI, BSPI_BSPI_XOR_ENABLE, 1);
1052 }
1053 qspi->bspi_enabled = 1;
1054 bcm_qspi_disable_bspi(qspi);
1055 bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 0);
1056 bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 0);
1057}
1058
Kamal Dasufa236a72016-08-24 18:04:23 -04001059static void bcm_qspi_hw_init(struct bcm_qspi *qspi)
1060{
1061 struct bcm_qspi_parms parms;
1062
1063 bcm_qspi_write(qspi, MSPI, MSPI_SPCR1_LSB, 0);
1064 bcm_qspi_write(qspi, MSPI, MSPI_SPCR1_MSB, 0);
1065 bcm_qspi_write(qspi, MSPI, MSPI_NEWQP, 0);
1066 bcm_qspi_write(qspi, MSPI, MSPI_ENDQP, 0);
1067 bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0x20);
1068
1069 parms.mode = SPI_MODE_3;
1070 parms.bits_per_word = 8;
1071 parms.speed_hz = qspi->max_speed_hz;
1072 bcm_qspi_hw_set_parms(qspi, &parms);
Kamal Dasu4e3b2d22016-08-24 18:04:25 -04001073
1074 if (has_bspi(qspi))
1075 bcm_qspi_bspi_init(qspi);
Kamal Dasufa236a72016-08-24 18:04:23 -04001076}
1077
1078static void bcm_qspi_hw_uninit(struct bcm_qspi *qspi)
1079{
1080 bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0);
Kamal Dasu4e3b2d22016-08-24 18:04:25 -04001081 if (has_bspi(qspi))
1082 bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0);
1083
Kamal Dasufa236a72016-08-24 18:04:23 -04001084}
1085
1086static const struct of_device_id bcm_qspi_of_match[] = {
1087 { .compatible = "brcm,spi-bcm-qspi" },
1088 {},
1089};
1090MODULE_DEVICE_TABLE(of, bcm_qspi_of_match);
1091
1092int bcm_qspi_probe(struct platform_device *pdev,
Kamal Dasu4e3b2d22016-08-24 18:04:25 -04001093 struct bcm_qspi_soc_intc *soc_intc)
Kamal Dasufa236a72016-08-24 18:04:23 -04001094{
1095 struct device *dev = &pdev->dev;
1096 struct bcm_qspi *qspi;
1097 struct spi_master *master;
1098 struct resource *res;
1099 int irq, ret = 0, num_ints = 0;
1100 u32 val;
1101 const char *name = NULL;
1102 int num_irqs = ARRAY_SIZE(qspi_irq_tab);
1103
1104 /* We only support device-tree instantiation */
1105 if (!dev->of_node)
1106 return -ENODEV;
1107
1108 if (!of_match_node(bcm_qspi_of_match, dev->of_node))
1109 return -ENODEV;
1110
1111 master = spi_alloc_master(dev, sizeof(struct bcm_qspi));
1112 if (!master) {
1113 dev_err(dev, "error allocating spi_master\n");
1114 return -ENOMEM;
1115 }
1116
1117 qspi = spi_master_get_devdata(master);
1118 qspi->pdev = pdev;
1119 qspi->trans_pos.trans = NULL;
1120 qspi->trans_pos.byte = 0;
1121 qspi->master = master;
1122
1123 master->bus_num = -1;
1124 master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_RX_DUAL | SPI_RX_QUAD;
1125 master->setup = bcm_qspi_setup;
1126 master->transfer_one = bcm_qspi_transfer_one;
Kamal Dasu4e3b2d22016-08-24 18:04:25 -04001127 master->spi_flash_read = bcm_qspi_flash_read;
Kamal Dasufa236a72016-08-24 18:04:23 -04001128 master->cleanup = bcm_qspi_cleanup;
1129 master->dev.of_node = dev->of_node;
1130 master->num_chipselect = NUM_CHIPSELECT;
1131
1132 qspi->big_endian = of_device_is_big_endian(dev->of_node);
1133
1134 if (!of_property_read_u32(dev->of_node, "num-cs", &val))
1135 master->num_chipselect = val;
1136
1137 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hif_mspi");
1138 if (!res)
1139 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1140 "mspi");
1141
1142 if (res) {
1143 qspi->base[MSPI] = devm_ioremap_resource(dev, res);
1144 if (IS_ERR(qspi->base[MSPI])) {
1145 ret = PTR_ERR(qspi->base[MSPI]);
1146 goto qspi_probe_err;
1147 }
1148 } else {
1149 goto qspi_probe_err;
1150 }
1151
Kamal Dasu4e3b2d22016-08-24 18:04:25 -04001152 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "bspi");
1153 if (res) {
1154 qspi->base[BSPI] = devm_ioremap_resource(dev, res);
1155 if (IS_ERR(qspi->base[BSPI])) {
1156 ret = PTR_ERR(qspi->base[BSPI]);
1157 goto qspi_probe_err;
1158 }
1159 qspi->bspi_mode = true;
1160 } else {
1161 qspi->bspi_mode = false;
1162 }
1163
1164 dev_info(dev, "using %smspi mode\n", qspi->bspi_mode ? "bspi-" : "");
1165
Kamal Dasufa236a72016-08-24 18:04:23 -04001166 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cs_reg");
1167 if (res) {
1168 qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res);
1169 if (IS_ERR(qspi->base[CHIP_SELECT])) {
1170 ret = PTR_ERR(qspi->base[CHIP_SELECT]);
1171 goto qspi_probe_err;
1172 }
1173 }
1174
1175 qspi->dev_ids = kcalloc(num_irqs, sizeof(struct bcm_qspi_dev_id),
1176 GFP_KERNEL);
Wei Yongjun3bf3eb22016-09-16 13:45:17 +00001177 if (!qspi->dev_ids) {
1178 ret = -ENOMEM;
Kamal Dasufa236a72016-08-24 18:04:23 -04001179 goto qspi_probe_err;
1180 }
1181
1182 for (val = 0; val < num_irqs; val++) {
1183 irq = -1;
1184 name = qspi_irq_tab[val].irq_name;
1185 irq = platform_get_irq_byname(pdev, name);
1186
1187 if (irq >= 0) {
1188 ret = devm_request_irq(&pdev->dev, irq,
1189 qspi_irq_tab[val].irq_handler, 0,
1190 name,
1191 &qspi->dev_ids[val]);
1192 if (ret < 0) {
1193 dev_err(&pdev->dev, "IRQ %s not found\n", name);
1194 goto qspi_probe_err;
1195 }
1196
1197 qspi->dev_ids[val].dev = qspi;
1198 qspi->dev_ids[val].irqp = &qspi_irq_tab[val];
1199 num_ints++;
1200 dev_dbg(&pdev->dev, "registered IRQ %s %d\n",
1201 qspi_irq_tab[val].irq_name,
1202 irq);
1203 }
1204 }
1205
1206 if (!num_ints) {
1207 dev_err(&pdev->dev, "no IRQs registered, cannot init driver\n");
Wei Yongjun71b8f352016-09-16 14:00:19 +00001208 ret = -EINVAL;
Kamal Dasufa236a72016-08-24 18:04:23 -04001209 goto qspi_probe_err;
1210 }
1211
1212 qspi->clk = devm_clk_get(&pdev->dev, NULL);
1213 if (IS_ERR(qspi->clk)) {
1214 dev_warn(dev, "unable to get clock\n");
Wei Yongjun71b8f352016-09-16 14:00:19 +00001215 ret = PTR_ERR(qspi->clk);
Kamal Dasufa236a72016-08-24 18:04:23 -04001216 goto qspi_probe_err;
1217 }
1218
1219 ret = clk_prepare_enable(qspi->clk);
1220 if (ret) {
1221 dev_err(dev, "failed to prepare clock\n");
1222 goto qspi_probe_err;
1223 }
1224
1225 qspi->base_clk = clk_get_rate(qspi->clk);
1226 qspi->max_speed_hz = qspi->base_clk / (QSPI_SPBR_MIN * 2);
1227
1228 bcm_qspi_hw_init(qspi);
1229 init_completion(&qspi->mspi_done);
Kamal Dasu4e3b2d22016-08-24 18:04:25 -04001230 init_completion(&qspi->bspi_done);
Kamal Dasufa236a72016-08-24 18:04:23 -04001231 qspi->curr_cs = -1;
1232
1233 platform_set_drvdata(pdev, qspi);
Kamal Dasu4e3b2d22016-08-24 18:04:25 -04001234
1235 qspi->xfer_mode.width = -1;
1236 qspi->xfer_mode.addrlen = -1;
1237 qspi->xfer_mode.hp = -1;
1238
Kamal Dasufa236a72016-08-24 18:04:23 -04001239 ret = devm_spi_register_master(&pdev->dev, master);
1240 if (ret < 0) {
1241 dev_err(dev, "can't register master\n");
1242 goto qspi_reg_err;
1243 }
1244
1245 return 0;
1246
1247qspi_reg_err:
1248 bcm_qspi_hw_uninit(qspi);
1249 clk_disable_unprepare(qspi->clk);
1250qspi_probe_err:
1251 spi_master_put(master);
1252 kfree(qspi->dev_ids);
1253 return ret;
1254}
1255/* probe function to be called by SoC specific platform driver probe */
1256EXPORT_SYMBOL_GPL(bcm_qspi_probe);
1257
1258int bcm_qspi_remove(struct platform_device *pdev)
1259{
1260 struct bcm_qspi *qspi = platform_get_drvdata(pdev);
1261
1262 platform_set_drvdata(pdev, NULL);
1263 bcm_qspi_hw_uninit(qspi);
1264 clk_disable_unprepare(qspi->clk);
1265 kfree(qspi->dev_ids);
1266 spi_unregister_master(qspi->master);
1267
1268 return 0;
1269}
1270/* function to be called by SoC specific platform driver remove() */
1271EXPORT_SYMBOL_GPL(bcm_qspi_remove);
1272
Arnd Bergmanna0319f82016-09-15 17:46:53 +02001273static int __maybe_unused bcm_qspi_suspend(struct device *dev)
Kamal Dasufa236a72016-08-24 18:04:23 -04001274{
1275 struct bcm_qspi *qspi = dev_get_drvdata(dev);
1276
1277 spi_master_suspend(qspi->master);
1278 clk_disable(qspi->clk);
1279 bcm_qspi_hw_uninit(qspi);
1280
1281 return 0;
1282};
1283
Arnd Bergmanna0319f82016-09-15 17:46:53 +02001284static int __maybe_unused bcm_qspi_resume(struct device *dev)
Kamal Dasufa236a72016-08-24 18:04:23 -04001285{
1286 struct bcm_qspi *qspi = dev_get_drvdata(dev);
1287 int ret = 0;
1288
1289 bcm_qspi_hw_init(qspi);
1290 bcm_qspi_chip_select(qspi, qspi->curr_cs);
1291 ret = clk_enable(qspi->clk);
1292 if (!ret)
1293 spi_master_resume(qspi->master);
1294
1295 return ret;
1296}
Kamal Dasufa236a72016-08-24 18:04:23 -04001297
Arnd Bergmanna0319f82016-09-15 17:46:53 +02001298SIMPLE_DEV_PM_OPS(bcm_qspi_pm_ops, bcm_qspi_suspend, bcm_qspi_resume);
1299
Kamal Dasufa236a72016-08-24 18:04:23 -04001300/* pm_ops to be called by SoC specific platform driver */
1301EXPORT_SYMBOL_GPL(bcm_qspi_pm_ops);
1302
1303MODULE_AUTHOR("Kamal Dasu");
1304MODULE_DESCRIPTION("Broadcom QSPI driver");
1305MODULE_LICENSE("GPL v2");
1306MODULE_ALIAS("platform:" DRIVER_NAME);