25
25
#include <linux/ioport.h>
26
26
#include <linux/kernel.h>
27
27
#include <linux/module.h>
28
- #include <linux/mtd/spi-nor.h>
29
28
#include <linux/of.h>
30
29
#include <linux/of_irq.h>
31
30
#include <linux/platform_device.h>
@@ -349,76 +348,60 @@ static void bcm_qspi_bspi_set_xfer_params(struct bcm_qspi *qspi, u8 cmd_byte,
349
348
bcm_qspi_write (qspi , BSPI , BSPI_FLEX_MODE_ENABLE , flex_mode );
350
349
}
351
350
352
- static int bcm_qspi_bspi_set_flex_mode (struct bcm_qspi * qspi , int width ,
353
- int addrlen , int hp )
351
+ static int bcm_qspi_bspi_set_flex_mode (struct bcm_qspi * qspi ,
352
+ struct spi_flash_read_message * msg ,
353
+ int hp )
354
354
{
355
355
int bpc = 0 , bpp = 0 ;
356
- u8 command = SPINOR_OP_READ_FAST ;
357
- int flex_mode = 1 , rv = 0 ;
358
- bool spans_4byte = false;
356
+ u8 command = msg -> read_opcode ;
357
+ int width = msg -> data_nbits ? msg -> data_nbits : SPI_NBITS_SINGLE ;
358
+ int addrlen = msg -> addr_width ;
359
+ int addr_nbits = msg -> addr_nbits ? msg -> addr_nbits : SPI_NBITS_SINGLE ;
360
+ int flex_mode = 1 ;
359
361
360
362
dev_dbg (& qspi -> pdev -> dev , "set flex mode w %x addrlen %x hp %d\n" ,
361
363
width , addrlen , hp );
362
364
363
- if (addrlen == BSPI_ADDRLEN_4BYTES ) {
365
+ if (addrlen == BSPI_ADDRLEN_4BYTES )
364
366
bpp = BSPI_BPP_ADDR_SELECT_MASK ;
365
- spans_4byte = true;
366
- }
367
367
368
- bpp |= 8 ;
368
+ bpp |= msg -> dummy_bytes * ( 8 / addr_nbits ) ;
369
369
370
370
switch (width ) {
371
371
case SPI_NBITS_SINGLE :
372
372
if (addrlen == BSPI_ADDRLEN_3BYTES )
373
373
/* default mode, does not need flex_cmd */
374
374
flex_mode = 0 ;
375
- else
376
- command = SPINOR_OP_READ_FAST_4B ;
377
375
break ;
378
376
case SPI_NBITS_DUAL :
379
377
bpc = 0x00000001 ;
380
378
if (hp ) {
381
379
bpc |= 0x00010100 ; /* address and mode are 2-bit */
382
380
bpp = BSPI_BPP_MODE_SELECT_MASK ;
383
- command = OPCODE_DIOR ;
384
- if (spans_4byte )
385
- command = OPCODE_DIOR_4B ;
386
- } else {
387
- command = SPINOR_OP_READ_1_1_2 ;
388
- if (spans_4byte )
389
- command = SPINOR_OP_READ_1_1_2_4B ;
390
381
}
391
382
break ;
392
383
case SPI_NBITS_QUAD :
393
384
bpc = 0x00000002 ;
394
385
if (hp ) {
395
386
bpc |= 0x00020200 ; /* address and mode are 4-bit */
396
- bpp = 4 ; /* dummy cycles */
397
- bpp |= BSPI_BPP_ADDR_SELECT_MASK ;
398
- command = OPCODE_QIOR ;
399
- if (spans_4byte )
400
- command = OPCODE_QIOR_4B ;
401
- } else {
402
- command = SPINOR_OP_READ_1_1_4 ;
403
- if (spans_4byte )
404
- command = SPINOR_OP_READ_1_1_4_4B ;
387
+ bpp |= BSPI_BPP_MODE_SELECT_MASK ;
405
388
}
406
389
break ;
407
390
default :
408
- rv = - EINVAL ;
409
- break ;
391
+ return - EINVAL ;
410
392
}
411
393
412
- if (rv == 0 )
413
- bcm_qspi_bspi_set_xfer_params (qspi , command , bpp , bpc ,
414
- flex_mode );
394
+ bcm_qspi_bspi_set_xfer_params (qspi , command , bpp , bpc , flex_mode );
415
395
416
- return rv ;
396
+ return 0 ;
417
397
}
418
398
419
- static int bcm_qspi_bspi_set_override (struct bcm_qspi * qspi , int width ,
420
- int addrlen , int hp )
399
+ static int bcm_qspi_bspi_set_override (struct bcm_qspi * qspi ,
400
+ struct spi_flash_read_message * msg ,
401
+ int hp )
421
402
{
403
+ int width = msg -> data_nbits ? msg -> data_nbits : SPI_NBITS_SINGLE ;
404
+ int addrlen = msg -> addr_width ;
422
405
u32 data = bcm_qspi_read (qspi , BSPI , BSPI_STRAP_OVERRIDE_CTRL );
423
406
424
407
dev_dbg (& qspi -> pdev -> dev , "set override mode w %x addrlen %x hp %d\n" ,
@@ -430,7 +413,6 @@ static int bcm_qspi_bspi_set_override(struct bcm_qspi *qspi, int width,
430
413
data &= ~(BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD |
431
414
BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL );
432
415
break ;
433
-
434
416
case SPI_NBITS_QUAD :
435
417
/* clear dual mode and set quad mode */
436
418
data &= ~BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL ;
@@ -455,15 +437,17 @@ static int bcm_qspi_bspi_set_override(struct bcm_qspi *qspi, int width,
455
437
/* set the override mode */
456
438
data |= BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE ;
457
439
bcm_qspi_write (qspi , BSPI , BSPI_STRAP_OVERRIDE_CTRL , data );
458
- bcm_qspi_bspi_set_xfer_params (qspi , SPINOR_OP_READ_FAST , 0 , 0 , 0 );
440
+ bcm_qspi_bspi_set_xfer_params (qspi , msg -> read_opcode , 0 , 0 , 0 );
459
441
460
442
return 0 ;
461
443
}
462
444
463
445
static int bcm_qspi_bspi_set_mode (struct bcm_qspi * qspi ,
464
- int width , int addrlen , int hp )
446
+ struct spi_flash_read_message * msg , int hp )
465
447
{
466
448
int error = 0 ;
449
+ int width = msg -> data_nbits ? msg -> data_nbits : SPI_NBITS_SINGLE ;
450
+ int addrlen = msg -> addr_width ;
467
451
468
452
/* default mode */
469
453
qspi -> xfer_mode .flex_mode = true;
@@ -475,23 +459,13 @@ static int bcm_qspi_bspi_set_mode(struct bcm_qspi *qspi,
475
459
mask = BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE ;
476
460
if (val & mask || qspi -> s3_strap_override_ctrl & mask ) {
477
461
qspi -> xfer_mode .flex_mode = false;
478
- bcm_qspi_write (qspi , BSPI , BSPI_FLEX_MODE_ENABLE ,
479
- 0 );
480
-
481
- if ((val | qspi -> s3_strap_override_ctrl ) &
482
- BSPI_STRAP_OVERRIDE_CTRL_DATA_DUAL )
483
- width = SPI_NBITS_DUAL ;
484
- else if ((val | qspi -> s3_strap_override_ctrl ) &
485
- BSPI_STRAP_OVERRIDE_CTRL_DATA_QUAD )
486
- width = SPI_NBITS_QUAD ;
487
-
488
- error = bcm_qspi_bspi_set_override (qspi , width , addrlen ,
489
- hp );
462
+ bcm_qspi_write (qspi , BSPI , BSPI_FLEX_MODE_ENABLE , 0 );
463
+ error = bcm_qspi_bspi_set_override (qspi , msg , hp );
490
464
}
491
465
}
492
466
493
467
if (qspi -> xfer_mode .flex_mode )
494
- error = bcm_qspi_bspi_set_flex_mode (qspi , width , addrlen , hp );
468
+ error = bcm_qspi_bspi_set_flex_mode (qspi , msg , hp );
495
469
496
470
if (error ) {
497
471
dev_warn (& qspi -> pdev -> dev ,
@@ -981,7 +955,7 @@ static int bcm_qspi_flash_read(struct spi_device *spi,
981
955
struct bcm_qspi * qspi = spi_master_get_devdata (spi -> master );
982
956
int ret = 0 ;
983
957
bool mspi_read = false;
984
- u32 io_width , addrlen , addr , len ;
958
+ u32 addr , len ;
985
959
u_char * buf ;
986
960
987
961
buf = msg -> buf ;
@@ -1010,9 +984,7 @@ static int bcm_qspi_flash_read(struct spi_device *spi,
1010
984
if (mspi_read )
1011
985
return bcm_qspi_mspi_flash_read (spi , msg );
1012
986
1013
- io_width = msg -> data_nbits ? msg -> data_nbits : SPI_NBITS_SINGLE ;
1014
- addrlen = msg -> addr_width ;
1015
- ret = bcm_qspi_bspi_set_mode (qspi , io_width , addrlen , -1 );
987
+ ret = bcm_qspi_bspi_set_mode (qspi , msg , -1 );
1016
988
1017
989
if (!ret )
1018
990
ret = bcm_qspi_bspi_flash_read (spi , msg );
@@ -1422,6 +1394,11 @@ static int __maybe_unused bcm_qspi_suspend(struct device *dev)
1422
1394
{
1423
1395
struct bcm_qspi * qspi = dev_get_drvdata (dev );
1424
1396
1397
+ /* store the override strap value */
1398
+ if (!bcm_qspi_bspi_ver_three (qspi ))
1399
+ qspi -> s3_strap_override_ctrl =
1400
+ bcm_qspi_read (qspi , BSPI , BSPI_STRAP_OVERRIDE_CTRL );
1401
+
1425
1402
spi_master_suspend (qspi -> master );
1426
1403
clk_disable (qspi -> clk );
1427
1404
bcm_qspi_hw_uninit (qspi );
0 commit comments