aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKamal Dasu <kdasu.kdev@gmail.com>2016-08-24 18:04:25 -0400
committerMark Brown <broonie@kernel.org>2016-09-14 13:03:32 -0400
commit4e3b2d236fe00f0e0b6c45dcb3cc7d84c2316424 (patch)
tree8402ac49002fc0b100bcf0b5d6e3cf2a14820293
parent44f95d87a6187f5027568bbcdce491713d7de5e5 (diff)
spi: bcm-qspi: Add BSPI spi-nor flash controller driver
This change implements BSPI driver for Broadcom BRCMSTB, NS2, NSP SoCs works in combination with the MSPI controller driver and implements flash read acceleration and implements the spi_flash_read() method. Both MSPI and BSPI controllers are needed to access spi-nor flash. Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com> Signed-off-by: Yendapally Reddy Dhananjaya Reddy <yendapally.reddy@broadcom.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-bcm-qspi.c603
-rw-r--r--drivers/spi/spi-bcm-qspi.h20
2 files changed, 620 insertions, 3 deletions
diff --git a/drivers/spi/spi-bcm-qspi.c b/drivers/spi/spi-bcm-qspi.c
index 4c1b9baeab00..8fff43e12242 100644
--- a/drivers/spi/spi-bcm-qspi.c
+++ b/drivers/spi/spi-bcm-qspi.c
@@ -38,6 +38,60 @@
38 38
39#define DRIVER_NAME "bcm_qspi" 39#define DRIVER_NAME "bcm_qspi"
40 40
41
42/* BSPI register offsets */
43#define BSPI_REVISION_ID 0x000
44#define BSPI_SCRATCH 0x004
45#define BSPI_MAST_N_BOOT_CTRL 0x008
46#define BSPI_BUSY_STATUS 0x00c
47#define BSPI_INTR_STATUS 0x010
48#define BSPI_B0_STATUS 0x014
49#define BSPI_B0_CTRL 0x018
50#define BSPI_B1_STATUS 0x01c
51#define BSPI_B1_CTRL 0x020
52#define BSPI_STRAP_OVERRIDE_CTRL 0x024
53#define BSPI_FLEX_MODE_ENABLE 0x028
54#define BSPI_BITS_PER_CYCLE 0x02c
55#define BSPI_BITS_PER_PHASE 0x030
56#define BSPI_CMD_AND_MODE_BYTE 0x034
57#define BSPI_BSPI_FLASH_UPPER_ADDR_BYTE 0x038
58#define BSPI_BSPI_XOR_VALUE 0x03c
59#define BSPI_BSPI_XOR_ENABLE 0x040
60#define BSPI_BSPI_PIO_MODE_ENABLE 0x044
61#define BSPI_BSPI_PIO_IODIR 0x048
62#define BSPI_BSPI_PIO_DATA 0x04c
63
64/* RAF register offsets */
65#define BSPI_RAF_START_ADDR 0x100
66#define BSPI_RAF_NUM_WORDS 0x104
67#define BSPI_RAF_CTRL 0x108
68#define BSPI_RAF_FULLNESS 0x10c
69#define BSPI_RAF_WATERMARK 0x110
70#define BSPI_RAF_STATUS 0x114
71#define BSPI_RAF_READ_DATA 0x118
72#define BSPI_RAF_WORD_CNT 0x11c
73#define BSPI_RAF_CURR_ADDR 0x120
74
75/* Override mode masks */
76#define BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE BIT(0)
77#define BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL BIT(1)
78#define BSPI_STRAP_OVERRIDE_CTRL_ADDR_4BYTE BIT(2)
79#define BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD BIT(3)
80#define BSPI_STRAP_OVERRIDE_CTRL_ENDAIN_MODE BIT(4)
81
82#define BSPI_ADDRLEN_3BYTES 3
83#define BSPI_ADDRLEN_4BYTES 4
84
85#define BSPI_RAF_STATUS_FIFO_EMPTY_MASK BIT(1)
86
87#define BSPI_RAF_CTRL_START_MASK BIT(0)
88#define BSPI_RAF_CTRL_CLEAR_MASK BIT(1)
89
90#define BSPI_BPP_MODE_SELECT_MASK BIT(8)
91#define BSPI_BPP_ADDR_SELECT_MASK BIT(16)
92
93#define BSPI_READ_LENGTH 256
94
41/* MSPI register offsets */ 95/* MSPI register offsets */
42#define MSPI_SPCR0_LSB 0x000 96#define MSPI_SPCR0_LSB 0x000
43#define MSPI_SPCR0_MSB 0x004 97#define MSPI_SPCR0_MSB 0x004
@@ -108,8 +162,16 @@ struct bcm_qspi_parms {
108 u8 bits_per_word; 162 u8 bits_per_word;
109}; 163};
110 164
165struct bcm_xfer_mode {
166 bool flex_mode;
167 unsigned int width;
168 unsigned int addrlen;
169 unsigned int hp;
170};
171
111enum base_type { 172enum base_type {
112 MSPI, 173 MSPI,
174 BSPI,
113 CHIP_SELECT, 175 CHIP_SELECT,
114 BASEMAX, 176 BASEMAX,
115}; 177};
@@ -140,13 +202,28 @@ struct bcm_qspi {
140 struct bcm_qspi_parms last_parms; 202 struct bcm_qspi_parms last_parms;
141 struct qspi_trans trans_pos; 203 struct qspi_trans trans_pos;
142 int curr_cs; 204 int curr_cs;
205 int bspi_maj_rev;
206 int bspi_min_rev;
207 int bspi_enabled;
208 struct spi_flash_read_message *bspi_rf_msg;
209 u32 bspi_rf_msg_idx;
210 u32 bspi_rf_msg_len;
211 u32 bspi_rf_msg_status;
212 struct bcm_xfer_mode xfer_mode;
143 u32 s3_strap_override_ctrl; 213 u32 s3_strap_override_ctrl;
214 bool bspi_mode;
144 bool big_endian; 215 bool big_endian;
145 int num_irqs; 216 int num_irqs;
146 struct bcm_qspi_dev_id *dev_ids; 217 struct bcm_qspi_dev_id *dev_ids;
147 struct completion mspi_done; 218 struct completion mspi_done;
219 struct completion bspi_done;
148}; 220};
149 221
222static inline bool has_bspi(struct bcm_qspi *qspi)
223{
224 return qspi->bspi_mode;
225}
226
150/* Read qspi controller register*/ 227/* Read qspi controller register*/
151static inline u32 bcm_qspi_read(struct bcm_qspi *qspi, enum base_type type, 228static inline u32 bcm_qspi_read(struct bcm_qspi *qspi, enum base_type type,
152 unsigned int offset) 229 unsigned int offset)
@@ -161,6 +238,300 @@ static inline void bcm_qspi_write(struct bcm_qspi *qspi, enum base_type type,
161 bcm_qspi_writel(qspi->big_endian, data, qspi->base[type] + offset); 238 bcm_qspi_writel(qspi->big_endian, data, qspi->base[type] + offset);
162} 239}
163 240
241/* BSPI helpers */
242static int bcm_qspi_bspi_busy_poll(struct bcm_qspi *qspi)
243{
244 int i;
245
246 /* this should normally finish within 10us */
247 for (i = 0; i < 1000; i++) {
248 if (!(bcm_qspi_read(qspi, BSPI, BSPI_BUSY_STATUS) & 1))
249 return 0;
250 udelay(1);
251 }
252 dev_warn(&qspi->pdev->dev, "timeout waiting for !busy_status\n");
253 return -EIO;
254}
255
256static inline bool bcm_qspi_bspi_ver_three(struct bcm_qspi *qspi)
257{
258 if (qspi->bspi_maj_rev < 4)
259 return true;
260 return false;
261}
262
263static void bcm_qspi_bspi_flush_prefetch_buffers(struct bcm_qspi *qspi)
264{
265 bcm_qspi_bspi_busy_poll(qspi);
266 /* Force rising edge for the b0/b1 'flush' field */
267 bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 1);
268 bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 1);
269 bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 0);
270 bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 0);
271}
272
273static int bcm_qspi_bspi_lr_is_fifo_empty(struct bcm_qspi *qspi)
274{
275 return (bcm_qspi_read(qspi, BSPI, BSPI_RAF_STATUS) &
276 BSPI_RAF_STATUS_FIFO_EMPTY_MASK);
277}
278
279static inline u32 bcm_qspi_bspi_lr_read_fifo(struct bcm_qspi *qspi)
280{
281 u32 data = bcm_qspi_read(qspi, BSPI, BSPI_RAF_READ_DATA);
282
283 /* BSPI v3 LR is LE only, convert data to host endianness */
284 if (bcm_qspi_bspi_ver_three(qspi))
285 data = le32_to_cpu(data);
286
287 return data;
288}
289
290static inline void bcm_qspi_bspi_lr_start(struct bcm_qspi *qspi)
291{
292 bcm_qspi_bspi_busy_poll(qspi);
293 bcm_qspi_write(qspi, BSPI, BSPI_RAF_CTRL,
294 BSPI_RAF_CTRL_START_MASK);
295}
296
297static inline void bcm_qspi_bspi_lr_clear(struct bcm_qspi *qspi)
298{
299 bcm_qspi_write(qspi, BSPI, BSPI_RAF_CTRL,
300 BSPI_RAF_CTRL_CLEAR_MASK);
301 bcm_qspi_bspi_flush_prefetch_buffers(qspi);
302}
303
304static void bcm_qspi_bspi_lr_data_read(struct bcm_qspi *qspi)
305{
306 u32 *buf = (u32 *)qspi->bspi_rf_msg->buf;
307 u32 data = 0;
308
309 dev_dbg(&qspi->pdev->dev, "xfer %p rx %p rxlen %d\n", qspi->bspi_rf_msg,
310 qspi->bspi_rf_msg->buf, qspi->bspi_rf_msg_len);
311 while (!bcm_qspi_bspi_lr_is_fifo_empty(qspi)) {
312 data = bcm_qspi_bspi_lr_read_fifo(qspi);
313 if (likely(qspi->bspi_rf_msg_len >= 4) &&
314 IS_ALIGNED((uintptr_t)buf, 4)) {
315 buf[qspi->bspi_rf_msg_idx++] = data;
316 qspi->bspi_rf_msg_len -= 4;
317 } else {
318 /* Read out remaining bytes, make sure*/
319 u8 *cbuf = (u8 *)&buf[qspi->bspi_rf_msg_idx];
320
321 data = cpu_to_le32(data);
322 while (qspi->bspi_rf_msg_len) {
323 *cbuf++ = (u8)data;
324 data >>= 8;
325 qspi->bspi_rf_msg_len--;
326 }
327 }
328 }
329}
330
331static void bcm_qspi_bspi_set_xfer_params(struct bcm_qspi *qspi, u8 cmd_byte,
332 int bpp, int bpc, int flex_mode)
333{
334 bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, 0);
335 bcm_qspi_write(qspi, BSPI, BSPI_BITS_PER_CYCLE, bpc);
336 bcm_qspi_write(qspi, BSPI, BSPI_BITS_PER_PHASE, bpp);
337 bcm_qspi_write(qspi, BSPI, BSPI_CMD_AND_MODE_BYTE, cmd_byte);
338 bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, flex_mode);
339}
340
341static int bcm_qspi_bspi_set_flex_mode(struct bcm_qspi *qspi, int width,
342 int addrlen, int hp)
343{
344 int bpc = 0, bpp = 0;
345 u8 command = SPINOR_OP_READ_FAST;
346 int flex_mode = 1, rv = 0;
347 bool spans_4byte = false;
348
349 dev_dbg(&qspi->pdev->dev, "set flex mode w %x addrlen %x hp %d\n",
350 width, addrlen, hp);
351
352 if (addrlen == BSPI_ADDRLEN_4BYTES) {
353 bpp = BSPI_BPP_ADDR_SELECT_MASK;
354 spans_4byte = true;
355 }
356
357 bpp |= 8;
358
359 switch (width) {
360 case SPI_NBITS_SINGLE:
361 if (addrlen == BSPI_ADDRLEN_3BYTES)
362 /* default mode, does not need flex_cmd */
363 flex_mode = 0;
364 else
365 command = SPINOR_OP_READ4_FAST;
366 break;
367 case SPI_NBITS_DUAL:
368 bpc = 0x00000001;
369 if (hp) {
370 bpc |= 0x00010100; /* address and mode are 2-bit */
371 bpp = BSPI_BPP_MODE_SELECT_MASK;
372 command = OPCODE_DIOR;
373 if (spans_4byte)
374 command = OPCODE_DIOR_4B;
375 } else {
376 command = SPINOR_OP_READ_1_1_2;
377 if (spans_4byte)
378 command = SPINOR_OP_READ4_1_1_2;
379 }
380 break;
381 case SPI_NBITS_QUAD:
382 bpc = 0x00000002;
383 if (hp) {
384 bpc |= 0x00020200; /* address and mode are 4-bit */
385 bpp = 4; /* dummy cycles */
386 bpp |= BSPI_BPP_ADDR_SELECT_MASK;
387 command = OPCODE_QIOR;
388 if (spans_4byte)
389 command = OPCODE_QIOR_4B;
390 } else {
391 command = SPINOR_OP_READ_1_1_4;
392 if (spans_4byte)
393 command = SPINOR_OP_READ4_1_1_4;
394 }
395 break;
396 default:
397 rv = -EINVAL;
398 break;
399 }
400
401 if (rv == 0)
402 bcm_qspi_bspi_set_xfer_params(qspi, command, bpp, bpc,
403 flex_mode);
404
405 return rv;
406}
407
408static int bcm_qspi_bspi_set_override(struct bcm_qspi *qspi, int width,
409 int addrlen, int hp)
410{
411 u32 data = bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
412
413 dev_dbg(&qspi->pdev->dev, "set override mode w %x addrlen %x hp %d\n",
414 width, addrlen, hp);
415
416 switch (width) {
417 case SPI_NBITS_SINGLE:
418 /* clear quad/dual mode */
419 data &= ~(BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD |
420 BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL);
421 break;
422
423 case SPI_NBITS_QUAD:
424 /* clear dual mode and set quad mode */
425 data &= ~BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL;
426 data |= BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD;
427 break;
428 case SPI_NBITS_DUAL:
429 /* clear quad mode set dual mode */
430 data &= ~BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD;
431 data |= BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL;
432 break;
433 default:
434 return -EINVAL;
435 }
436
437 if (addrlen == BSPI_ADDRLEN_4BYTES)
438 /* set 4byte mode*/
439 data |= BSPI_STRAP_OVERRIDE_CTRL_ADDR_4BYTE;
440 else
441 /* clear 4 byte mode */
442 data &= ~BSPI_STRAP_OVERRIDE_CTRL_ADDR_4BYTE;
443
444 /* set the override mode */
445 data |= BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE;
446 bcm_qspi_write(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL, data);
447 bcm_qspi_bspi_set_xfer_params(qspi, SPINOR_OP_READ_FAST, 0, 0, 0);
448
449 return 0;
450}
451
452static int bcm_qspi_bspi_set_mode(struct bcm_qspi *qspi,
453 int width, int addrlen, int hp)
454{
455 int error = 0;
456
457 /* default mode */
458 qspi->xfer_mode.flex_mode = true;
459
460 if (!bcm_qspi_bspi_ver_three(qspi)) {
461 u32 val, mask;
462
463 val = bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
464 mask = BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE;
465 if (val & mask || qspi->s3_strap_override_ctrl & mask) {
466 qspi->xfer_mode.flex_mode = false;
467 bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE,
468 0);
469
470 if ((val | qspi->s3_strap_override_ctrl) &
471 BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL)
472 width = SPI_NBITS_DUAL;
473 else if ((val | qspi->s3_strap_override_ctrl) &
474 BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD)
475 width = SPI_NBITS_QUAD;
476
477 error = bcm_qspi_bspi_set_override(qspi, width, addrlen,
478 hp);
479 }
480 }
481
482 if (qspi->xfer_mode.flex_mode)
483 error = bcm_qspi_bspi_set_flex_mode(qspi, width, addrlen, hp);
484
485 if (error) {
486 dev_warn(&qspi->pdev->dev,
487 "INVALID COMBINATION: width=%d addrlen=%d hp=%d\n",
488 width, addrlen, hp);
489 } else if (qspi->xfer_mode.width != width ||
490 qspi->xfer_mode.addrlen != addrlen ||
491 qspi->xfer_mode.hp != hp) {
492 qspi->xfer_mode.width = width;
493 qspi->xfer_mode.addrlen = addrlen;
494 qspi->xfer_mode.hp = hp;
495 dev_dbg(&qspi->pdev->dev,
496 "cs:%d %d-lane output, %d-byte address%s\n",
497 qspi->curr_cs,
498 qspi->xfer_mode.width,
499 qspi->xfer_mode.addrlen,
500 qspi->xfer_mode.hp != -1 ? ", hp mode" : "");
501 }
502
503 return error;
504}
505
506static void bcm_qspi_enable_bspi(struct bcm_qspi *qspi)
507{
508 if (!has_bspi(qspi) || (qspi->bspi_enabled))
509 return;
510
511 qspi->bspi_enabled = 1;
512 if ((bcm_qspi_read(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL) & 1) == 0)
513 return;
514
515 bcm_qspi_bspi_flush_prefetch_buffers(qspi);
516 udelay(1);
517 bcm_qspi_write(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL, 0);
518 udelay(1);
519}
520
521static void bcm_qspi_disable_bspi(struct bcm_qspi *qspi)
522{
523 if (!has_bspi(qspi) || (!qspi->bspi_enabled))
524 return;
525
526 qspi->bspi_enabled = 0;
527 if ((bcm_qspi_read(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL) & 1))
528 return;
529
530 bcm_qspi_bspi_busy_poll(qspi);
531 bcm_qspi_write(qspi, BSPI, BSPI_MAST_N_BOOT_CTRL, 1);
532 udelay(1);
533}
534
164static void bcm_qspi_chip_select(struct bcm_qspi *qspi, int cs) 535static void bcm_qspi_chip_select(struct bcm_qspi *qspi, int cs)
165{ 536{
166 u32 data = 0; 537 u32 data = 0;
@@ -298,6 +669,8 @@ static void read_from_hw(struct bcm_qspi *qspi, int slots)
298 struct qspi_trans tp; 669 struct qspi_trans tp;
299 int slot; 670 int slot;
300 671
672 bcm_qspi_disable_bspi(qspi);
673
301 if (slots > MSPI_NUM_CDRAM) { 674 if (slots > MSPI_NUM_CDRAM) {
302 /* should never happen */ 675 /* should never happen */
303 dev_err(&qspi->pdev->dev, "%s: too many slots!\n", __func__); 676 dev_err(&qspi->pdev->dev, "%s: too many slots!\n", __func__);
@@ -368,6 +741,7 @@ static int write_to_hw(struct bcm_qspi *qspi, struct spi_device *spi)
368 int slot = 0, tstatus = 0; 741 int slot = 0, tstatus = 0;
369 u32 mspi_cdram = 0; 742 u32 mspi_cdram = 0;
370 743
744 bcm_qspi_disable_bspi(qspi);
371 tp = qspi->trans_pos; 745 tp = qspi->trans_pos;
372 bcm_qspi_update_parms(qspi, spi, tp.trans); 746 bcm_qspi_update_parms(qspi, spi, tp.trans);
373 747
@@ -414,6 +788,9 @@ static int write_to_hw(struct bcm_qspi *qspi, struct spi_device *spi)
414 write_cdram_slot(qspi, slot - 1, mspi_cdram); 788 write_cdram_slot(qspi, slot - 1, mspi_cdram);
415 } 789 }
416 790
791 if (has_bspi(qspi))
792 bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 1);
793
417 /* Must flush previous writes before starting MSPI operation */ 794 /* Must flush previous writes before starting MSPI operation */
418 mb(); 795 mb();
419 /* Set cont | spe | spifie */ 796 /* Set cont | spe | spifie */
@@ -423,6 +800,118 @@ done:
423 return slot; 800 return slot;
424} 801}
425 802
803static int bcm_qspi_bspi_flash_read(struct spi_device *spi,
804 struct spi_flash_read_message *msg)
805{
806 struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
807 u32 addr = 0, len, len_words;
808 int ret = 0;
809 unsigned long timeo = msecs_to_jiffies(100);
810
811 if (bcm_qspi_bspi_ver_three(qspi))
812 if (msg->addr_width == BSPI_ADDRLEN_4BYTES)
813 return -EIO;
814
815 bcm_qspi_chip_select(qspi, spi->chip_select);
816 bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0);
817
818 /*
819 * when using flex mode mode we need to send
820 * the upper address byte to bspi
821 */
822 if (bcm_qspi_bspi_ver_three(qspi) == false) {
823 addr = msg->from & 0xff000000;
824 bcm_qspi_write(qspi, BSPI,
825 BSPI_BSPI_FLASH_UPPER_ADDR_BYTE, addr);
826 }
827
828 if (!qspi->xfer_mode.flex_mode)
829 addr = msg->from;
830 else
831 addr = msg->from & 0x00ffffff;
832
833 /* set BSPI RAF buffer max read length */
834 len = msg->len;
835 if (len > BSPI_READ_LENGTH)
836 len = BSPI_READ_LENGTH;
837
838 if (bcm_qspi_bspi_ver_three(qspi) == true)
839 addr = (addr + 0xc00000) & 0xffffff;
840
841 reinit_completion(&qspi->bspi_done);
842 bcm_qspi_enable_bspi(qspi);
843 len_words = (len + 3) >> 2;
844 qspi->bspi_rf_msg = msg;
845 qspi->bspi_rf_msg_status = 0;
846 qspi->bspi_rf_msg_idx = 0;
847 qspi->bspi_rf_msg_len = len;
848 dev_dbg(&qspi->pdev->dev, "bspi xfr addr 0x%x len 0x%x", addr, len);
849
850 bcm_qspi_write(qspi, BSPI, BSPI_RAF_START_ADDR, addr);
851 bcm_qspi_write(qspi, BSPI, BSPI_RAF_NUM_WORDS, len_words);
852 bcm_qspi_write(qspi, BSPI, BSPI_RAF_WATERMARK, 0);
853
854 /* Must flush previous writes before starting BSPI operation */
855 mb();
856
857 bcm_qspi_bspi_lr_start(qspi);
858 if (!wait_for_completion_timeout(&qspi->bspi_done, timeo)) {
859 dev_err(&qspi->pdev->dev, "timeout waiting for BSPI\n");
860 ret = -ETIMEDOUT;
861 } else {
862 /* set the return length for the caller */
863 msg->retlen = len;
864 }
865
866 return ret;
867}
868
869static int bcm_qspi_flash_read(struct spi_device *spi,
870 struct spi_flash_read_message *msg)
871{
872 struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
873 int ret = 0;
874 bool mspi_read = false;
875 u32 io_width, addrlen, addr, len;
876 u_char *buf;
877
878 buf = msg->buf;
879 addr = msg->from;
880 len = msg->len;
881
882 if (bcm_qspi_bspi_ver_three(qspi) == true) {
883 /*
884 * The address coming into this function is a raw flash offset.
885 * But for BSPI <= V3, we need to convert it to a remapped BSPI
886 * address. If it crosses a 4MB boundary, just revert back to
887 * using MSPI.
888 */
889 addr = (addr + 0xc00000) & 0xffffff;
890
891 if ((~ADDR_4MB_MASK & addr) ^
892 (~ADDR_4MB_MASK & (addr + len - 1)))
893 mspi_read = true;
894 }
895
896 /* non-aligned and very short transfers are handled by MSPI */
897 if (!IS_ALIGNED((uintptr_t)addr, 4) || !IS_ALIGNED((uintptr_t)buf, 4) ||
898 len < 4)
899 mspi_read = true;
900
901 if (mspi_read)
902 /* this will make the m25p80 read to fallback to mspi read */
903 return -EAGAIN;
904
905 io_width = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE;
906 addrlen = msg->addr_width;
907 ret = bcm_qspi_bspi_set_mode(qspi, io_width, addrlen, -1);
908
909 if (!ret)
910 ret = bcm_qspi_bspi_flash_read(spi, msg);
911
912 return ret;
913}
914
426static int bcm_qspi_transfer_one(struct spi_master *master, 915static int bcm_qspi_transfer_one(struct spi_master *master,
427 struct spi_device *spi, 916 struct spi_device *spi,
428 struct spi_transfer *trans) 917 struct spi_transfer *trans)
@@ -469,13 +958,76 @@ static irqreturn_t bcm_qspi_mspi_l2_isr(int irq, void *dev_id)
469 bcm_qspi_write(qspi, MSPI, MSPI_MSPI_STATUS, status); 958 bcm_qspi_write(qspi, MSPI, MSPI_MSPI_STATUS, status);
470 complete(&qspi->mspi_done); 959 complete(&qspi->mspi_done);
471 return IRQ_HANDLED; 960 return IRQ_HANDLED;
472 } else {
473 return IRQ_NONE;
474 } 961 }
962
963 return IRQ_NONE;
964}
965
966static irqreturn_t bcm_qspi_bspi_lr_l2_isr(int irq, void *dev_id)
967{
968 struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
969 struct bcm_qspi *qspi = qspi_dev_id->dev;
970 u32 status;
971
972 if (qspi->bspi_enabled && qspi->bspi_rf_msg) {
973 bcm_qspi_bspi_lr_data_read(qspi);
974 if (qspi->bspi_rf_msg_len == 0) {
975 qspi->bspi_rf_msg = NULL;
976 if (qspi->bspi_rf_msg_status)
977 bcm_qspi_bspi_lr_clear(qspi);
978 else
979 bcm_qspi_bspi_flush_prefetch_buffers(qspi);
980 }
981 }
982
983 status = (qspi_dev_id->irqp->mask & INTR_BSPI_LR_SESSION_DONE_MASK);
984 if (qspi->bspi_enabled && status && qspi->bspi_rf_msg_len == 0)
985 complete(&qspi->bspi_done);
986
987 return IRQ_HANDLED;
988}
989
990static irqreturn_t bcm_qspi_bspi_lr_err_l2_isr(int irq, void *dev_id)
991{
992 struct bcm_qspi_dev_id *qspi_dev_id = dev_id;
993 struct bcm_qspi *qspi = qspi_dev_id->dev;
994
995 dev_err(&qspi->pdev->dev, "BSPI INT error\n");
996 qspi->bspi_rf_msg_status = -EIO;
997 complete(&qspi->bspi_done);
998 return IRQ_HANDLED;
475} 999}
476 1000
477static const struct bcm_qspi_irq qspi_irq_tab[] = { 1001static const struct bcm_qspi_irq qspi_irq_tab[] = {
478 { 1002 {
1003 .irq_name = "spi_lr_fullness_reached",
1004 .irq_handler = bcm_qspi_bspi_lr_l2_isr,
1005 .mask = INTR_BSPI_LR_FULLNESS_REACHED_MASK,
1006 },
1007 {
1008 .irq_name = "spi_lr_session_aborted",
1009 .irq_handler = bcm_qspi_bspi_lr_err_l2_isr,
1010 .mask = INTR_BSPI_LR_SESSION_ABORTED_MASK,
1011 },
1012 {
1013 .irq_name = "spi_lr_impatient",
1014 .irq_handler = bcm_qspi_bspi_lr_err_l2_isr,
1015 .mask = INTR_BSPI_LR_IMPATIENT_MASK,
1016 },
1017 {
1018 .irq_name = "spi_lr_session_done",
1019 .irq_handler = bcm_qspi_bspi_lr_l2_isr,
1020 .mask = INTR_BSPI_LR_SESSION_DONE_MASK,
1021 },
1022#ifdef QSPI_INT_DEBUG
1023 /* this interrupt is for debug purposes only, dont request irq */
1024 {
1025 .irq_name = "spi_lr_overread",
1026 .irq_handler = bcm_qspi_bspi_lr_err_l2_isr,
1027 .mask = INTR_BSPI_LR_OVERREAD_MASK,
1028 },
1029#endif
1030 {
479 .irq_name = "mspi_done", 1031 .irq_name = "mspi_done",
480 .irq_handler = bcm_qspi_mspi_l2_isr, 1032 .irq_handler = bcm_qspi_mspi_l2_isr,
481 .mask = INTR_MSPI_DONE_MASK, 1033 .mask = INTR_MSPI_DONE_MASK,
@@ -487,6 +1039,24 @@ static const struct bcm_qspi_irq qspi_irq_tab[] = {
487 }, 1039 },
488}; 1040};
489 1041
1042static void bcm_qspi_bspi_init(struct bcm_qspi *qspi)
1043{
1044 u32 val = 0;
1045
1046 val = bcm_qspi_read(qspi, BSPI, BSPI_REVISION_ID);
1047 qspi->bspi_maj_rev = (val >> 8) & 0xff;
1048 qspi->bspi_min_rev = val & 0xff;
1049 if (!(bcm_qspi_bspi_ver_three(qspi))) {
1050 /* Force mapping of BSPI address -> flash offset */
1051 bcm_qspi_write(qspi, BSPI, BSPI_BSPI_XOR_VALUE, 0);
1052 bcm_qspi_write(qspi, BSPI, BSPI_BSPI_XOR_ENABLE, 1);
1053 }
1054 qspi->bspi_enabled = 1;
1055 bcm_qspi_disable_bspi(qspi);
1056 bcm_qspi_write(qspi, BSPI, BSPI_B0_CTRL, 0);
1057 bcm_qspi_write(qspi, BSPI, BSPI_B1_CTRL, 0);
1058}
1059
490static void bcm_qspi_hw_init(struct bcm_qspi *qspi) 1060static void bcm_qspi_hw_init(struct bcm_qspi *qspi)
491{ 1061{
492 struct bcm_qspi_parms parms; 1062 struct bcm_qspi_parms parms;
@@ -501,11 +1071,17 @@ static void bcm_qspi_hw_init(struct bcm_qspi *qspi)
501 parms.bits_per_word = 8; 1071 parms.bits_per_word = 8;
502 parms.speed_hz = qspi->max_speed_hz; 1072 parms.speed_hz = qspi->max_speed_hz;
503 bcm_qspi_hw_set_parms(qspi, &parms); 1073 bcm_qspi_hw_set_parms(qspi, &parms);
1074
1075 if (has_bspi(qspi))
1076 bcm_qspi_bspi_init(qspi);
504} 1077}
505 1078
506static void bcm_qspi_hw_uninit(struct bcm_qspi *qspi) 1079static void bcm_qspi_hw_uninit(struct bcm_qspi *qspi)
507{ 1080{
508 bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0); 1081 bcm_qspi_write(qspi, MSPI, MSPI_SPCR2, 0);
1082 if (has_bspi(qspi))
1083 bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0);
1084
509} 1085}
510 1086
511static const struct of_device_id bcm_qspi_of_match[] = { 1087static const struct of_device_id bcm_qspi_of_match[] = {
@@ -515,7 +1091,7 @@ static const struct of_device_id bcm_qspi_of_match[] = {
515MODULE_DEVICE_TABLE(of, bcm_qspi_of_match); 1091MODULE_DEVICE_TABLE(of, bcm_qspi_of_match);
516 1092
517int bcm_qspi_probe(struct platform_device *pdev, 1093int bcm_qspi_probe(struct platform_device *pdev,
518 struct bcm_qspi_soc_intc *soc) 1094 struct bcm_qspi_soc_intc *soc_intc)
519{ 1095{
520 struct device *dev = &pdev->dev; 1096 struct device *dev = &pdev->dev;
521 struct bcm_qspi *qspi; 1097 struct bcm_qspi *qspi;
@@ -549,6 +1125,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
549 master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_RX_DUAL | SPI_RX_QUAD; 1125 master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_RX_DUAL | SPI_RX_QUAD;
550 master->setup = bcm_qspi_setup; 1126 master->setup = bcm_qspi_setup;
551 master->transfer_one = bcm_qspi_transfer_one; 1127 master->transfer_one = bcm_qspi_transfer_one;
1128 master->spi_flash_read = bcm_qspi_flash_read;
552 master->cleanup = bcm_qspi_cleanup; 1129 master->cleanup = bcm_qspi_cleanup;
553 master->dev.of_node = dev->of_node; 1130 master->dev.of_node = dev->of_node;
554 master->num_chipselect = NUM_CHIPSELECT; 1131 master->num_chipselect = NUM_CHIPSELECT;
@@ -573,6 +1150,20 @@ int bcm_qspi_probe(struct platform_device *pdev,
573 goto qspi_probe_err; 1150 goto qspi_probe_err;
574 } 1151 }
575 1152
1153 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "bspi");
1154 if (res) {
1155 qspi->base[BSPI] = devm_ioremap_resource(dev, res);
1156 if (IS_ERR(qspi->base[BSPI])) {
1157 ret = PTR_ERR(qspi->base[BSPI]);
1158 goto qspi_probe_err;
1159 }
1160 qspi->bspi_mode = true;
1161 } else {
1162 qspi->bspi_mode = false;
1163 }
1164
1165 dev_info(dev, "using %smspi mode\n", qspi->bspi_mode ? "bspi-" : "");
1166
576 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cs_reg"); 1167 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cs_reg");
577 if (res) { 1168 if (res) {
578 qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res); 1169 qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res);
@@ -635,9 +1226,15 @@ int bcm_qspi_probe(struct platform_device *pdev,
635 1226
636 bcm_qspi_hw_init(qspi); 1227 bcm_qspi_hw_init(qspi);
637 init_completion(&qspi->mspi_done); 1228 init_completion(&qspi->mspi_done);
1229 init_completion(&qspi->bspi_done);
638 qspi->curr_cs = -1; 1230 qspi->curr_cs = -1;
639 1231
640 platform_set_drvdata(pdev, qspi); 1232 platform_set_drvdata(pdev, qspi);
1233
1234 qspi->xfer_mode.width = -1;
1235 qspi->xfer_mode.addrlen = -1;
1236 qspi->xfer_mode.hp = -1;
1237
641 ret = devm_spi_register_master(&pdev->dev, master); 1238 ret = devm_spi_register_master(&pdev->dev, master);
642 if (ret < 0) { 1239 if (ret < 0) {
643 dev_err(dev, "can't register master\n"); 1240 dev_err(dev, "can't register master\n");
diff --git a/drivers/spi/spi-bcm-qspi.h b/drivers/spi/spi-bcm-qspi.h
index 8d4d385c444c..65c363b6b7b7 100644
--- a/drivers/spi/spi-bcm-qspi.h
+++ b/drivers/spi/spi-bcm-qspi.h
@@ -20,6 +20,26 @@
20#include <linux/types.h> 20#include <linux/types.h>
21#include <linux/io.h> 21#include <linux/io.h>
22 22
23/* BSPI interrupt masks */
24#define INTR_BSPI_LR_OVERREAD_MASK BIT(4)
25#define INTR_BSPI_LR_SESSION_DONE_MASK BIT(3)
26#define INTR_BSPI_LR_IMPATIENT_MASK BIT(2)
27#define INTR_BSPI_LR_SESSION_ABORTED_MASK BIT(1)
28#define INTR_BSPI_LR_FULLNESS_REACHED_MASK BIT(0)
29
30#define BSPI_LR_INTERRUPTS_DATA \
31 (INTR_BSPI_LR_SESSION_DONE_MASK | \
32 INTR_BSPI_LR_FULLNESS_REACHED_MASK)
33
34#define BSPI_LR_INTERRUPTS_ERROR \
35 (INTR_BSPI_LR_OVERREAD_MASK | \
36 INTR_BSPI_LR_IMPATIENT_MASK | \
37 INTR_BSPI_LR_SESSION_ABORTED_MASK)
38
39#define BSPI_LR_INTERRUPTS_ALL \
40 (BSPI_LR_INTERRUPTS_ERROR | \
41 BSPI_LR_INTERRUPTS_DATA)
42
23/* MSPI Interrupt masks */ 43/* MSPI Interrupt masks */
24#define INTR_MSPI_HALTED_MASK BIT(6) 44#define INTR_MSPI_HALTED_MASK BIT(6)
25#define INTR_MSPI_DONE_MASK BIT(5) 45#define INTR_MSPI_DONE_MASK BIT(5)