@@ -206,13 +206,6 @@ enum airoha_snand_cs {
206206 SPI_CHIP_SEL_LOW ,
207207};
208208
209- struct airoha_snand_dev {
210- size_t buf_len ;
211-
212- u8 * txrx_buf ;
213- dma_addr_t dma_addr ;
214- };
215-
216209struct airoha_snand_ctrl {
217210 struct device * dev ;
218211 struct regmap * regmap_ctrl ;
@@ -617,9 +610,9 @@ static bool airoha_snand_supports_op(struct spi_mem *mem,
617610
618611static int airoha_snand_dirmap_create (struct spi_mem_dirmap_desc * desc )
619612{
620- struct airoha_snand_dev * as_dev = spi_get_ctldata (desc -> mem -> spi );
613+ u8 * txrx_buf = spi_get_ctldata (desc -> mem -> spi );
621614
622- if (!as_dev -> txrx_buf )
615+ if (!txrx_buf )
623616 return - EINVAL ;
624617
625618 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)
634627static ssize_t airoha_snand_dirmap_read (struct spi_mem_dirmap_desc * desc ,
635628 u64 offs , size_t len , void * buf )
636629{
637- struct spi_device * spi = desc -> mem -> spi ;
638- struct airoha_snand_dev * as_dev = spi_get_ctldata (spi );
639630 struct spi_mem_op * op = & desc -> info .op_tmpl ;
631+ struct spi_device * spi = desc -> mem -> spi ;
640632 struct airoha_snand_ctrl * as_ctrl ;
633+ u8 * txrx_buf = spi_get_ctldata (spi );
634+ dma_addr_t dma_addr ;
641635 u32 val , rd_mode ;
642636 int err ;
643637
@@ -662,14 +656,17 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
662656 if (err )
663657 return err ;
664658
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 ;
667664
668665 /* set dma addr */
669666 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_STRADDR ,
670- as_dev -> dma_addr );
667+ dma_addr );
671668 if (err )
672- return err ;
669+ goto error_dma_unmap ;
673670
674671 /* set cust sec size */
675672 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,
678675 REG_SPI_NFI_SNF_MISC_CTL2 ,
679676 SPI_NFI_READ_DATA_BYTE_NUM , val );
680677 if (err )
681- return err ;
678+ goto error_dma_unmap ;
682679
683680 /* set read command */
684681 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_RD_CTL2 ,
685682 op -> cmd .opcode );
686683 if (err )
687- return err ;
684+ goto error_dma_unmap ;
688685
689686 /* set read mode */
690687 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_SNF_MISC_CTL ,
691688 FIELD_PREP (SPI_NFI_DATA_READ_WR_MODE , rd_mode ));
692689 if (err )
693- return err ;
690+ goto error_dma_unmap ;
694691
695692 /* set read addr */
696693 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_RD_CTL3 , 0x0 );
697694 if (err )
698- return err ;
695+ goto error_dma_unmap ;
699696
700697 /* set nfi read */
701698 err = regmap_update_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
702699 SPI_NFI_OPMODE ,
703700 FIELD_PREP (SPI_NFI_OPMODE , 6 ));
704701 if (err )
705- return err ;
702+ goto error_dma_unmap ;
706703
707704 err = regmap_set_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
708705 SPI_NFI_READ_MODE | SPI_NFI_DMA_MODE );
709706 if (err )
710- return err ;
707+ goto error_dma_unmap ;
711708
712709 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_CMD , 0x0 );
713710 if (err )
714- return err ;
711+ goto error_dma_unmap ;
715712
716713 /* trigger dma start read */
717714 err = regmap_clear_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CON ,
718715 SPI_NFI_RD_TRIG );
719716 if (err )
720- return err ;
717+ goto error_dma_unmap ;
721718
722719 err = regmap_set_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CON ,
723720 SPI_NFI_RD_TRIG );
724721 if (err )
725- return err ;
722+ goto error_dma_unmap ;
726723
727724 err = regmap_read_poll_timeout (as_ctrl -> regmap_nfi ,
728725 REG_SPI_NFI_SNF_STA_CTL1 , val ,
729726 (val & SPI_NFI_READ_FROM_CACHE_DONE ),
730727 0 , 1 * USEC_PER_SEC );
731728 if (err )
732- return err ;
729+ goto error_dma_unmap ;
733730
734731 /*
735732 * 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,
739736 SPI_NFI_READ_FROM_CACHE_DONE ,
740737 SPI_NFI_READ_FROM_CACHE_DONE );
741738 if (err )
742- return err ;
739+ goto error_dma_unmap ;
743740
744741 err = regmap_read_poll_timeout (as_ctrl -> regmap_nfi , REG_SPI_NFI_INTR ,
745742 val , (val & SPI_NFI_AHB_DONE ), 0 ,
746743 1 * USEC_PER_SEC );
747744 if (err )
748- return err ;
745+ goto error_dma_unmap ;
749746
750747 /* DMA read need delay for data ready from controller to DRAM */
751748 udelay (1 );
752749
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 );
755752 err = airoha_snand_set_mode (as_ctrl , SPI_MODE_MANUAL );
756753 if (err < 0 )
757754 return err ;
758755
759- memcpy (buf , as_dev -> txrx_buf + offs , len );
756+ memcpy (buf , txrx_buf + offs , len );
760757
761758 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 ;
762764}
763765
764766static ssize_t airoha_snand_dirmap_write (struct spi_mem_dirmap_desc * desc ,
765767 u64 offs , size_t len , const void * buf )
766768{
767- struct spi_device * spi = desc -> mem -> spi ;
768- struct airoha_snand_dev * as_dev = spi_get_ctldata (spi );
769769 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 );
770772 struct airoha_snand_ctrl * as_ctrl ;
773+ dma_addr_t dma_addr ;
771774 u32 wr_mode , val ;
772775 int err ;
773776
@@ -776,19 +779,20 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
776779 if (err < 0 )
777780 return err ;
778781
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 ;
784788
785789 err = airoha_snand_set_mode (as_ctrl , SPI_MODE_DMA );
786790 if (err < 0 )
787- return err ;
791+ goto error_dma_unmap ;
788792
789793 err = airoha_snand_nfi_config (as_ctrl );
790794 if (err )
791- return err ;
795+ goto error_dma_unmap ;
792796
793797 if (op -> cmd .opcode == SPI_NAND_OP_PROGRAM_LOAD_QUAD ||
794798 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,
797801 wr_mode = 0 ;
798802
799803 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_STRADDR ,
800- as_dev -> dma_addr );
804+ dma_addr );
801805 if (err )
802- return err ;
806+ goto error_dma_unmap ;
803807
804808 val = FIELD_PREP (SPI_NFI_PROG_LOAD_BYTE_NUM ,
805809 as_ctrl -> nfi_cfg .sec_size * as_ctrl -> nfi_cfg .sec_num );
806810 err = regmap_update_bits (as_ctrl -> regmap_nfi ,
807811 REG_SPI_NFI_SNF_MISC_CTL2 ,
808812 SPI_NFI_PROG_LOAD_BYTE_NUM , val );
809813 if (err )
810- return err ;
814+ goto error_dma_unmap ;
811815
812816 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_PG_CTL1 ,
813817 FIELD_PREP (SPI_NFI_PG_LOAD_CMD ,
814818 op -> cmd .opcode ));
815819 if (err )
816- return err ;
820+ goto error_dma_unmap ;
817821
818822 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_SNF_MISC_CTL ,
819823 FIELD_PREP (SPI_NFI_DATA_READ_WR_MODE , wr_mode ));
820824 if (err )
821- return err ;
825+ goto error_dma_unmap ;
822826
823827 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_PG_CTL2 , 0x0 );
824828 if (err )
825- return err ;
829+ goto error_dma_unmap ;
826830
827831 err = regmap_clear_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
828832 SPI_NFI_READ_MODE );
829833 if (err )
830- return err ;
834+ goto error_dma_unmap ;
831835
832836 err = regmap_update_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
833837 SPI_NFI_OPMODE ,
834838 FIELD_PREP (SPI_NFI_OPMODE , 3 ));
835839 if (err )
836- return err ;
840+ goto error_dma_unmap ;
837841
838842 err = regmap_set_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CNFG ,
839843 SPI_NFI_DMA_MODE );
840844 if (err )
841- return err ;
845+ goto error_dma_unmap ;
842846
843847 err = regmap_write (as_ctrl -> regmap_nfi , REG_SPI_NFI_CMD , 0x80 );
844848 if (err )
845- return err ;
849+ goto error_dma_unmap ;
846850
847851 err = regmap_clear_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CON ,
848852 SPI_NFI_WR_TRIG );
849853 if (err )
850- return err ;
854+ goto error_dma_unmap ;
851855
852856 err = regmap_set_bits (as_ctrl -> regmap_nfi , REG_SPI_NFI_CON ,
853857 SPI_NFI_WR_TRIG );
854858 if (err )
855- return err ;
859+ goto error_dma_unmap ;
856860
857861 err = regmap_read_poll_timeout (as_ctrl -> regmap_nfi , REG_SPI_NFI_INTR ,
858862 val , (val & SPI_NFI_AHB_DONE ), 0 ,
859863 1 * USEC_PER_SEC );
860864 if (err )
861- return err ;
865+ goto error_dma_unmap ;
862866
863867 err = regmap_read_poll_timeout (as_ctrl -> regmap_nfi ,
864868 REG_SPI_NFI_SNF_STA_CTL1 , val ,
865869 (val & SPI_NFI_LOAD_TO_CACHE_DONE ),
866870 0 , 1 * USEC_PER_SEC );
867871 if (err )
868- return err ;
872+ goto error_dma_unmap ;
869873
870874 /*
871875 * 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,
875879 SPI_NFI_LOAD_TO_CACHE_DONE ,
876880 SPI_NFI_LOAD_TO_CACHE_DONE );
877881 if (err )
878- return err ;
882+ goto error_dma_unmap ;
879883
884+ dma_unmap_single (as_ctrl -> dev , dma_addr , SPI_NAND_CACHE_SIZE ,
885+ DMA_TO_DEVICE );
880886 err = airoha_snand_set_mode (as_ctrl , SPI_MODE_MANUAL );
881887 if (err < 0 )
882888 return err ;
883889
884890 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 ;
885896}
886897
887898static int airoha_snand_exec_op (struct spi_mem * mem ,
@@ -956,42 +967,20 @@ static const struct spi_controller_mem_ops airoha_snand_mem_ops = {
956967static int airoha_snand_setup (struct spi_device * spi )
957968{
958969 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 ;
966971
967972 /* 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 )
977977 return - ENOMEM ;
978978
979- spi_set_ctldata (spi , as_dev );
979+ spi_set_ctldata (spi , txrx_buf );
980980
981981 return 0 ;
982982}
983983
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-
995984static int airoha_snand_nfi_setup (struct airoha_snand_ctrl * as_ctrl )
996985{
997986 u32 val , sec_size , sec_num ;
@@ -1093,7 +1082,6 @@ static int airoha_snand_probe(struct platform_device *pdev)
10931082 ctrl -> bits_per_word_mask = SPI_BPW_MASK (8 );
10941083 ctrl -> mode_bits = SPI_RX_DUAL ;
10951084 ctrl -> setup = airoha_snand_setup ;
1096- ctrl -> cleanup = airoha_snand_cleanup ;
10971085 device_set_node (& ctrl -> dev , dev_fwnode (dev ));
10981086
10991087 err = airoha_snand_nfi_setup (as_ctrl );
0 commit comments