15
15
#include <linux/mutex.h>
16
16
#include <linux/of.h>
17
17
#include <linux/of_device.h>
18
+ #include <linux/of_gpio.h>
18
19
#include <linux/pinctrl/consumer.h>
19
20
#include <linux/pm_runtime.h>
20
21
#include <linux/platform_device.h>
@@ -355,10 +356,10 @@ static int stm32_qspi_get_mode(u8 buswidth)
355
356
return buswidth ;
356
357
}
357
358
358
- static int stm32_qspi_send (struct spi_mem * mem , const struct spi_mem_op * op )
359
+ static int stm32_qspi_send (struct spi_device * spi , const struct spi_mem_op * op )
359
360
{
360
- struct stm32_qspi * qspi = spi_controller_get_devdata (mem -> spi -> master );
361
- struct stm32_qspi_flash * flash = & qspi -> flash [mem -> spi -> chip_select ];
361
+ struct stm32_qspi * qspi = spi_controller_get_devdata (spi -> master );
362
+ struct stm32_qspi_flash * flash = & qspi -> flash [spi -> chip_select ];
362
363
u32 ccr , cr ;
363
364
int timeout , err = 0 , err_poll_status = 0 ;
364
365
@@ -465,7 +466,7 @@ static int stm32_qspi_poll_status(struct spi_mem *mem, const struct spi_mem_op *
465
466
qspi -> fmode = CCR_FMODE_APM ;
466
467
qspi -> status_timeout = timeout_ms ;
467
468
468
- ret = stm32_qspi_send (mem , op );
469
+ ret = stm32_qspi_send (mem -> spi , op );
469
470
mutex_unlock (& qspi -> lock );
470
471
471
472
pm_runtime_mark_last_busy (qspi -> dev );
@@ -489,7 +490,7 @@ static int stm32_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
489
490
else
490
491
qspi -> fmode = CCR_FMODE_INDW ;
491
492
492
- ret = stm32_qspi_send (mem , op );
493
+ ret = stm32_qspi_send (mem -> spi , op );
493
494
mutex_unlock (& qspi -> lock );
494
495
495
496
pm_runtime_mark_last_busy (qspi -> dev );
@@ -545,7 +546,7 @@ static ssize_t stm32_qspi_dirmap_read(struct spi_mem_dirmap_desc *desc,
545
546
else
546
547
qspi -> fmode = CCR_FMODE_INDR ;
547
548
548
- ret = stm32_qspi_send (desc -> mem , & op );
549
+ ret = stm32_qspi_send (desc -> mem -> spi , & op );
549
550
mutex_unlock (& qspi -> lock );
550
551
551
552
pm_runtime_mark_last_busy (qspi -> dev );
@@ -554,12 +555,87 @@ static ssize_t stm32_qspi_dirmap_read(struct spi_mem_dirmap_desc *desc,
554
555
return ret ?: len ;
555
556
}
556
557
558
+ static int stm32_qspi_transfer_one_message (struct spi_controller * ctrl ,
559
+ struct spi_message * msg )
560
+ {
561
+ struct stm32_qspi * qspi = spi_controller_get_devdata (ctrl );
562
+ struct spi_transfer * transfer ;
563
+ struct spi_device * spi = msg -> spi ;
564
+ struct spi_mem_op op ;
565
+ int ret ;
566
+
567
+ if (!spi -> cs_gpiod )
568
+ return - EOPNOTSUPP ;
569
+
570
+ mutex_lock (& qspi -> lock );
571
+
572
+ gpiod_set_value_cansleep (spi -> cs_gpiod , true);
573
+
574
+ list_for_each_entry (transfer , & msg -> transfers , transfer_list ) {
575
+ u8 dummy_bytes = 0 ;
576
+
577
+ memset (& op , 0 , sizeof (op ));
578
+
579
+ dev_dbg (qspi -> dev , "tx_buf:%p tx_nbits:%d rx_buf:%p rx_nbits:%d len:%d dummy_data:%d\n" ,
580
+ transfer -> tx_buf , transfer -> tx_nbits ,
581
+ transfer -> rx_buf , transfer -> rx_nbits ,
582
+ transfer -> len , transfer -> dummy_data );
583
+
584
+ /*
585
+ * QSPI hardware supports dummy bytes transfer.
586
+ * If current transfer is dummy byte, merge it with the next
587
+ * transfer in order to take into account QSPI block constraint
588
+ */
589
+ if (transfer -> dummy_data ) {
590
+ op .dummy .buswidth = transfer -> tx_nbits ;
591
+ op .dummy .nbytes = transfer -> len ;
592
+ dummy_bytes = transfer -> len ;
593
+
594
+ /* if happens, means that message is not correctly built */
595
+ if (list_is_last (& transfer -> transfer_list , & msg -> transfers ))
596
+ goto end_of_transfer ;
597
+
598
+ transfer = list_next_entry (transfer , transfer_list );
599
+ }
600
+
601
+ op .data .nbytes = transfer -> len ;
602
+
603
+ if (transfer -> rx_buf ) {
604
+ qspi -> fmode = CCR_FMODE_INDR ;
605
+ op .data .buswidth = transfer -> rx_nbits ;
606
+ op .data .dir = SPI_MEM_DATA_IN ;
607
+ op .data .buf .in = transfer -> rx_buf ;
608
+ } else {
609
+ qspi -> fmode = CCR_FMODE_INDW ;
610
+ op .data .buswidth = transfer -> tx_nbits ;
611
+ op .data .dir = SPI_MEM_DATA_OUT ;
612
+ op .data .buf .out = transfer -> tx_buf ;
613
+ }
614
+
615
+ ret = stm32_qspi_send (spi , & op );
616
+ if (ret )
617
+ goto end_of_transfer ;
618
+
619
+ msg -> actual_length += transfer -> len + dummy_bytes ;
620
+ }
621
+
622
+ end_of_transfer :
623
+ gpiod_set_value_cansleep (spi -> cs_gpiod , false);
624
+
625
+ mutex_unlock (& qspi -> lock );
626
+
627
+ msg -> status = ret ;
628
+ spi_finalize_current_message (ctrl );
629
+
630
+ return ret ;
631
+ }
632
+
557
633
static int stm32_qspi_setup (struct spi_device * spi )
558
634
{
559
635
struct spi_controller * ctrl = spi -> master ;
560
636
struct stm32_qspi * qspi = spi_controller_get_devdata (ctrl );
561
637
struct stm32_qspi_flash * flash ;
562
- u32 presc ;
638
+ u32 presc , mode ;
563
639
int ret ;
564
640
565
641
if (ctrl -> busy )
@@ -568,6 +644,16 @@ static int stm32_qspi_setup(struct spi_device *spi)
568
644
if (!spi -> max_speed_hz )
569
645
return - EINVAL ;
570
646
647
+ mode = spi -> mode & (SPI_TX_OCTAL | SPI_RX_OCTAL );
648
+ if ((mode == SPI_TX_OCTAL || mode == SPI_RX_OCTAL ) ||
649
+ ((mode == (SPI_TX_OCTAL | SPI_RX_OCTAL )) &&
650
+ of_gpio_named_count (qspi -> dev -> of_node , "cs-gpios" ) == - ENOENT )) {
651
+ dev_err (qspi -> dev , "spi-rx-bus-width\\/spi-tx-bus-width\\/cs-gpios\n" );
652
+ dev_err (qspi -> dev , "configuration not supported\n" );
653
+
654
+ return - EINVAL ;
655
+ }
656
+
571
657
ret = pm_runtime_resume_and_get (qspi -> dev );
572
658
if (ret < 0 )
573
659
return ret ;
@@ -580,6 +666,17 @@ static int stm32_qspi_setup(struct spi_device *spi)
580
666
581
667
mutex_lock (& qspi -> lock );
582
668
qspi -> cr_reg = CR_APMS | 3 << CR_FTHRES_SHIFT | CR_SSHIFT | CR_EN ;
669
+
670
+ /*
671
+ * Dual flash mode is only enable in case SPI_TX_OCTAL and SPI_TX_OCTAL
672
+ * are both set in spi->mode and "cs-gpios" properties is found in DT
673
+ */
674
+ if (((spi -> mode & (SPI_TX_OCTAL | SPI_RX_OCTAL )) == (SPI_TX_OCTAL | SPI_RX_OCTAL )) &&
675
+ of_gpio_named_count (qspi -> dev -> of_node , "cs-gpios" )) {
676
+ qspi -> cr_reg |= CR_DFM ;
677
+ dev_dbg (qspi -> dev , "Dual flash mode enable" );
678
+ }
679
+
583
680
writel_relaxed (qspi -> cr_reg , qspi -> io_base + QSPI_CR );
584
681
585
682
/* set dcr fsize to max address */
@@ -741,11 +838,14 @@ static int stm32_qspi_probe(struct platform_device *pdev)
741
838
742
839
mutex_init (& qspi -> lock );
743
840
744
- ctrl -> mode_bits = SPI_RX_DUAL | SPI_RX_QUAD
745
- | SPI_TX_DUAL | SPI_TX_QUAD ;
841
+ ctrl -> mode_bits = SPI_RX_DUAL | SPI_RX_QUAD | SPI_TX_OCTAL
842
+ | SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_OCTAL ;
746
843
ctrl -> setup = stm32_qspi_setup ;
747
844
ctrl -> bus_num = -1 ;
748
845
ctrl -> mem_ops = & stm32_qspi_mem_ops ;
846
+ ctrl -> use_gpio_descriptors = true;
847
+ ctrl -> transfer_one_message = stm32_qspi_transfer_one_message ;
848
+ ctrl -> auto_runtime_pm = true;
749
849
ctrl -> num_chipselect = STM32_QSPI_MAX_NORCHIP ;
750
850
ctrl -> dev .of_node = dev -> of_node ;
751
851
0 commit comments