@@ -206,13 +206,6 @@ enum airoha_snand_cs {
206
206
SPI_CHIP_SEL_LOW ,
207
207
};
208
208
209
- struct airoha_snand_dev {
210
- size_t buf_len ;
211
-
212
- u8 * txrx_buf ;
213
- dma_addr_t dma_addr ;
214
- };
215
-
216
209
struct airoha_snand_ctrl {
217
210
struct device * dev ;
218
211
struct regmap * regmap_ctrl ;
@@ -617,9 +610,9 @@ static bool airoha_snand_supports_op(struct spi_mem *mem,
617
610
618
611
static int airoha_snand_dirmap_create (struct spi_mem_dirmap_desc * desc )
619
612
{
620
- struct airoha_snand_dev * as_dev = spi_get_ctldata (desc -> mem -> spi );
613
+ u8 * txrx_buf = spi_get_ctldata (desc -> mem -> spi );
621
614
622
- if (!as_dev -> txrx_buf )
615
+ if (!txrx_buf )
623
616
return - EINVAL ;
624
617
625
618
if (desc -> info .offset + desc -> info .length > U32_MAX )
@@ -634,10 +627,11 @@ static int airoha_snand_dirmap_create(struct spi_mem_dirmap_desc *desc)
634
627
static ssize_t airoha_snand_dirmap_read (struct spi_mem_dirmap_desc * desc ,
635
628
u64 offs , size_t len , void * buf )
636
629
{
637
- struct spi_device * spi = desc -> mem -> spi ;
638
- struct airoha_snand_dev * as_dev = spi_get_ctldata (spi );
639
630
struct spi_mem_op * op = & desc -> info .op_tmpl ;
631
+ struct spi_device * spi = desc -> mem -> spi ;
640
632
struct airoha_snand_ctrl * as_ctrl ;
633
+ u8 * txrx_buf = spi_get_ctldata (spi );
634
+ dma_addr_t dma_addr ;
641
635
u32 val , rd_mode ;
642
636
int err ;
643
637
@@ -662,14 +656,17 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
662
656
if (err )
663
657
return err ;
664
658
665
- dma_sync_single_for_device (as_ctrl -> dev , as_dev -> dma_addr ,
666
- as_dev -> buf_len , DMA_BIDIRECTIONAL );
659
+ dma_addr = dma_map_single (as_ctrl -> dev , txrx_buf , SPI_NAND_CACHE_SIZE ,
660
+ DMA_FROM_DEVICE );
661
+ err = dma_mapping_error (as_ctrl -> dev , dma_addr );
662
+ if (err )
663
+ return err ;
667
664
668
665
/* set dma addr */
669
666
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_STRADDR ,
670
- as_dev -> dma_addr );
667
+ dma_addr );
671
668
if (err )
672
- return err ;
669
+ goto error_dma_unmap ;
673
670
674
671
/* set cust sec size */
675
672
val = as_ctrl -> nfi_cfg .sec_size * as_ctrl -> nfi_cfg .sec_num ;
@@ -678,58 +675,58 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
678
675
REG_SPI_NFI_SNF_MISC_CTL2 ,
679
676
SPI_NFI_READ_DATA_BYTE_NUM , val );
680
677
if (err )
681
- return err ;
678
+ goto error_dma_unmap ;
682
679
683
680
/* set read command */
684
681
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_RD_CTL2 ,
685
682
op -> cmd .opcode );
686
683
if (err )
687
- return err ;
684
+ goto error_dma_unmap ;
688
685
689
686
/* set read mode */
690
687
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_SNF_MISC_CTL ,
691
688
FIELD_PREP (SPI_NFI_DATA_READ_WR_MODE , rd_mode ));
692
689
if (err )
693
- return err ;
690
+ goto error_dma_unmap ;
694
691
695
692
/* set read addr */
696
693
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_RD_CTL3 , 0x0 );
697
694
if (err )
698
- return err ;
695
+ goto error_dma_unmap ;
699
696
700
697
/* set nfi read */
701
698
err = regmap_update_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
702
699
SPI_NFI_OPMODE ,
703
700
FIELD_PREP (SPI_NFI_OPMODE , 6 ));
704
701
if (err )
705
- return err ;
702
+ goto error_dma_unmap ;
706
703
707
704
err = regmap_set_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
708
705
SPI_NFI_READ_MODE | SPI_NFI_DMA_MODE );
709
706
if (err )
710
- return err ;
707
+ goto error_dma_unmap ;
711
708
712
709
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_CMD , 0x0 );
713
710
if (err )
714
- return err ;
711
+ goto error_dma_unmap ;
715
712
716
713
/* trigger dma start read */
717
714
err = regmap_clear_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CON ,
718
715
SPI_NFI_RD_TRIG );
719
716
if (err )
720
- return err ;
717
+ goto error_dma_unmap ;
721
718
722
719
err = regmap_set_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CON ,
723
720
SPI_NFI_RD_TRIG );
724
721
if (err )
725
- return err ;
722
+ goto error_dma_unmap ;
726
723
727
724
err = regmap_read_poll_timeout (as_ctrl -> regmap_nfi ,
728
725
REG_SPI_NFI_SNF_STA_CTL1 , val ,
729
726
(val & SPI_NFI_READ_FROM_CACHE_DONE ),
730
727
0 , 1 * USEC_PER_SEC );
731
728
if (err )
732
- return err ;
729
+ goto error_dma_unmap ;
733
730
734
731
/*
735
732
* SPI_NFI_READ_FROM_CACHE_DONE bit must be written at the end
@@ -739,35 +736,41 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
739
736
SPI_NFI_READ_FROM_CACHE_DONE ,
740
737
SPI_NFI_READ_FROM_CACHE_DONE );
741
738
if (err )
742
- return err ;
739
+ goto error_dma_unmap ;
743
740
744
741
err = regmap_read_poll_timeout (as_ctrl -> regmap_nfi , REG_SPI_NFI_INTR ,
745
742
val , (val & SPI_NFI_AHB_DONE ), 0 ,
746
743
1 * USEC_PER_SEC );
747
744
if (err )
748
- return err ;
745
+ goto error_dma_unmap ;
749
746
750
747
/* DMA read need delay for data ready from controller to DRAM */
751
748
udelay (1 );
752
749
753
- dma_sync_single_for_cpu (as_ctrl -> dev , as_dev -> dma_addr ,
754
- as_dev -> buf_len , DMA_BIDIRECTIONAL );
750
+ dma_unmap_single (as_ctrl -> dev , dma_addr , SPI_NAND_CACHE_SIZE ,
751
+ DMA_FROM_DEVICE );
755
752
err = airoha_snand_set_mode (as_ctrl , SPI_MODE_MANUAL );
756
753
if (err < 0 )
757
754
return err ;
758
755
759
- memcpy (buf , as_dev -> txrx_buf + offs , len );
756
+ memcpy (buf , txrx_buf + offs , len );
760
757
761
758
return len ;
759
+
760
+ error_dma_unmap :
761
+ dma_unmap_single (as_ctrl -> dev , dma_addr , SPI_NAND_CACHE_SIZE ,
762
+ DMA_FROM_DEVICE );
763
+ return err ;
762
764
}
763
765
764
766
static ssize_t airoha_snand_dirmap_write (struct spi_mem_dirmap_desc * desc ,
765
767
u64 offs , size_t len , const void * buf )
766
768
{
767
- struct spi_device * spi = desc -> mem -> spi ;
768
- struct airoha_snand_dev * as_dev = spi_get_ctldata (spi );
769
769
struct spi_mem_op * op = & desc -> info .op_tmpl ;
770
+ struct spi_device * spi = desc -> mem -> spi ;
771
+ u8 * txrx_buf = spi_get_ctldata (spi );
770
772
struct airoha_snand_ctrl * as_ctrl ;
773
+ dma_addr_t dma_addr ;
771
774
u32 wr_mode , val ;
772
775
int err ;
773
776
@@ -776,19 +779,20 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
776
779
if (err < 0 )
777
780
return err ;
778
781
779
- dma_sync_single_for_cpu (as_ctrl -> dev , as_dev -> dma_addr ,
780
- as_dev -> buf_len , DMA_BIDIRECTIONAL );
781
- memcpy (as_dev -> txrx_buf + offs , buf , len );
782
- dma_sync_single_for_device (as_ctrl -> dev , as_dev -> dma_addr ,
783
- as_dev -> buf_len , DMA_BIDIRECTIONAL );
782
+ memcpy (txrx_buf + offs , buf , len );
783
+ dma_addr = dma_map_single (as_ctrl -> dev , txrx_buf , SPI_NAND_CACHE_SIZE ,
784
+ DMA_TO_DEVICE );
785
+ err = dma_mapping_error (as_ctrl -> dev , dma_addr );
786
+ if (err )
787
+ return err ;
784
788
785
789
err = airoha_snand_set_mode (as_ctrl , SPI_MODE_DMA );
786
790
if (err < 0 )
787
- return err ;
791
+ goto error_dma_unmap ;
788
792
789
793
err = airoha_snand_nfi_config (as_ctrl );
790
794
if (err )
791
- return err ;
795
+ goto error_dma_unmap ;
792
796
793
797
if (op -> cmd .opcode == SPI_NAND_OP_PROGRAM_LOAD_QUAD ||
794
798
op -> cmd .opcode == SPI_NAND_OP_PROGRAM_LOAD_RAMDON_QUAD )
@@ -797,75 +801,75 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
797
801
wr_mode = 0 ;
798
802
799
803
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_STRADDR ,
800
- as_dev -> dma_addr );
804
+ dma_addr );
801
805
if (err )
802
- return err ;
806
+ goto error_dma_unmap ;
803
807
804
808
val = FIELD_PREP (SPI_NFI_PROG_LOAD_BYTE_NUM ,
805
809
as_ctrl -> nfi_cfg .sec_size * as_ctrl -> nfi_cfg .sec_num );
806
810
err = regmap_update_bits (as_ctrl -> regmap_nfi ,
807
811
REG_SPI_NFI_SNF_MISC_CTL2 ,
808
812
SPI_NFI_PROG_LOAD_BYTE_NUM , val );
809
813
if (err )
810
- return err ;
814
+ goto error_dma_unmap ;
811
815
812
816
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_PG_CTL1 ,
813
817
FIELD_PREP (SPI_NFI_PG_LOAD_CMD ,
814
818
op -> cmd .opcode ));
815
819
if (err )
816
- return err ;
820
+ goto error_dma_unmap ;
817
821
818
822
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_SNF_MISC_CTL ,
819
823
FIELD_PREP (SPI_NFI_DATA_READ_WR_MODE , wr_mode ));
820
824
if (err )
821
- return err ;
825
+ goto error_dma_unmap ;
822
826
823
827
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_PG_CTL2 , 0x0 );
824
828
if (err )
825
- return err ;
829
+ goto error_dma_unmap ;
826
830
827
831
err = regmap_clear_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
828
832
SPI_NFI_READ_MODE );
829
833
if (err )
830
- return err ;
834
+ goto error_dma_unmap ;
831
835
832
836
err = regmap_update_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
833
837
SPI_NFI_OPMODE ,
834
838
FIELD_PREP (SPI_NFI_OPMODE , 3 ));
835
839
if (err )
836
- return err ;
840
+ goto error_dma_unmap ;
837
841
838
842
err = regmap_set_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
839
843
SPI_NFI_DMA_MODE );
840
844
if (err )
841
- return err ;
845
+ goto error_dma_unmap ;
842
846
843
847
err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_CMD , 0x80 );
844
848
if (err )
845
- return err ;
849
+ goto error_dma_unmap ;
846
850
847
851
err = regmap_clear_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CON ,
848
852
SPI_NFI_WR_TRIG );
849
853
if (err )
850
- return err ;
854
+ goto error_dma_unmap ;
851
855
852
856
err = regmap_set_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CON ,
853
857
SPI_NFI_WR_TRIG );
854
858
if (err )
855
- return err ;
859
+ goto error_dma_unmap ;
856
860
857
861
err = regmap_read_poll_timeout (as_ctrl -> regmap_nfi , REG_SPI_NFI_INTR ,
858
862
val , (val & SPI_NFI_AHB_DONE ), 0 ,
859
863
1 * USEC_PER_SEC );
860
864
if (err )
861
- return err ;
865
+ goto error_dma_unmap ;
862
866
863
867
err = regmap_read_poll_timeout (as_ctrl -> regmap_nfi ,
864
868
REG_SPI_NFI_SNF_STA_CTL1 , val ,
865
869
(val & SPI_NFI_LOAD_TO_CACHE_DONE ),
866
870
0 , 1 * USEC_PER_SEC );
867
871
if (err )
868
- return err ;
872
+ goto error_dma_unmap ;
869
873
870
874
/*
871
875
* SPI_NFI_LOAD_TO_CACHE_DONE bit must be written at the end
@@ -875,13 +879,20 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
875
879
SPI_NFI_LOAD_TO_CACHE_DONE ,
876
880
SPI_NFI_LOAD_TO_CACHE_DONE );
877
881
if (err )
878
- return err ;
882
+ goto error_dma_unmap ;
879
883
884
+ dma_unmap_single (as_ctrl -> dev , dma_addr , SPI_NAND_CACHE_SIZE ,
885
+ DMA_TO_DEVICE );
880
886
err = airoha_snand_set_mode (as_ctrl , SPI_MODE_MANUAL );
881
887
if (err < 0 )
882
888
return err ;
883
889
884
890
return len ;
891
+
892
+ error_dma_unmap :
893
+ dma_unmap_single (as_ctrl -> dev , dma_addr , SPI_NAND_CACHE_SIZE ,
894
+ DMA_TO_DEVICE );
895
+ return err ;
885
896
}
886
897
887
898
static int airoha_snand_exec_op (struct spi_mem * mem ,
@@ -956,42 +967,20 @@ static const struct spi_controller_mem_ops airoha_snand_mem_ops = {
956
967
static int airoha_snand_setup (struct spi_device * spi )
957
968
{
958
969
struct airoha_snand_ctrl * as_ctrl ;
959
- struct airoha_snand_dev * as_dev ;
960
-
961
- as_ctrl = spi_controller_get_devdata (spi -> controller );
962
-
963
- as_dev = devm_kzalloc (as_ctrl -> dev , sizeof (* as_dev ), GFP_KERNEL );
964
- if (!as_dev )
965
- return - ENOMEM ;
970
+ u8 * txrx_buf ;
966
971
967
972
/* prepare device buffer */
968
- as_dev -> buf_len = SPI_NAND_CACHE_SIZE ;
969
- as_dev -> txrx_buf = devm_kzalloc (as_ctrl -> dev , as_dev -> buf_len ,
970
- GFP_KERNEL );
971
- if (!as_dev -> txrx_buf )
972
- return - ENOMEM ;
973
-
974
- as_dev -> dma_addr = dma_map_single (as_ctrl -> dev , as_dev -> txrx_buf ,
975
- as_dev -> buf_len , DMA_BIDIRECTIONAL );
976
- if (dma_mapping_error (as_ctrl -> dev , as_dev -> dma_addr ))
973
+ as_ctrl = spi_controller_get_devdata (spi -> controller );
974
+ txrx_buf = devm_kzalloc (as_ctrl -> dev , SPI_NAND_CACHE_SIZE ,
975
+ GFP_KERNEL );
976
+ if (!txrx_buf )
977
977
return - ENOMEM ;
978
978
979
- spi_set_ctldata (spi , as_dev );
979
+ spi_set_ctldata (spi , txrx_buf );
980
980
981
981
return 0 ;
982
982
}
983
983
984
- static void airoha_snand_cleanup (struct spi_device * spi )
985
- {
986
- struct airoha_snand_dev * as_dev = spi_get_ctldata (spi );
987
- struct airoha_snand_ctrl * as_ctrl ;
988
-
989
- as_ctrl = spi_controller_get_devdata (spi -> controller );
990
- dma_unmap_single (as_ctrl -> dev , as_dev -> dma_addr ,
991
- as_dev -> buf_len , DMA_BIDIRECTIONAL );
992
- spi_set_ctldata (spi , NULL );
993
- }
994
-
995
984
static int airoha_snand_nfi_setup (struct airoha_snand_ctrl * as_ctrl )
996
985
{
997
986
u32 val , sec_size , sec_num ;
@@ -1093,7 +1082,6 @@ static int airoha_snand_probe(struct platform_device *pdev)
1093
1082
ctrl -> bits_per_word_mask = SPI_BPW_MASK (8 );
1094
1083
ctrl -> mode_bits = SPI_RX_DUAL ;
1095
1084
ctrl -> setup = airoha_snand_setup ;
1096
- ctrl -> cleanup = airoha_snand_cleanup ;
1097
1085
device_set_node (& ctrl -> dev , dev_fwnode (dev ));
1098
1086
1099
1087
err = airoha_snand_nfi_setup (as_ctrl );
0 commit comments