@@ -591,11 +591,10 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)
591591
592592static void dspi_setup_accel (struct fsl_dspi * dspi );
593593
594- static int dspi_dma_xfer (struct fsl_dspi * dspi )
594+ static void dspi_dma_xfer (struct fsl_dspi * dspi )
595595{
596596 struct spi_message * message = dspi -> cur_msg ;
597597 struct device * dev = & dspi -> pdev -> dev ;
598- int ret = 0 ;
599598
600599 /*
601600 * dspi->len gets decremented by dspi_pop_tx_pushr in
@@ -612,14 +611,12 @@ static int dspi_dma_xfer(struct fsl_dspi *dspi)
612611 message -> actual_length += dspi -> words_in_flight *
613612 dspi -> oper_word_size ;
614613
615- ret = dspi_next_xfer_dma_submit (dspi );
616- if (ret ) {
614+ message -> status = dspi_next_xfer_dma_submit (dspi );
615+ if (message -> status ) {
617616 dev_err (dev , "DMA transfer failed\n" );
618617 break ;
619618 }
620619 }
621-
622- return ret ;
623620}
624621
625622static int dspi_request_dma (struct fsl_dspi * dspi , phys_addr_t phy_addr )
@@ -1005,7 +1002,7 @@ static bool dspi_rxtx(struct fsl_dspi *dspi)
10051002 return true;
10061003}
10071004
1008- static int dspi_poll (struct fsl_dspi * dspi )
1005+ static void dspi_poll (struct fsl_dspi * dspi )
10091006{
10101007 int tries ;
10111008 int err = 0 ;
@@ -1024,7 +1021,7 @@ static int dspi_poll(struct fsl_dspi *dspi)
10241021 }
10251022 } while (dspi_rxtx (dspi ));
10261023
1027- return err ;
1024+ dspi -> cur_msg -> status = err ;
10281025}
10291026
10301027static irqreturn_t dspi_interrupt (int irq , void * dev_id )
@@ -1038,8 +1035,11 @@ static irqreturn_t dspi_interrupt(int irq, void *dev_id)
10381035 if (!(spi_sr & SPI_SR_CMDTCF ))
10391036 return IRQ_NONE ;
10401037
1041- if (dspi_rxtx (dspi ) == false)
1038+ if (dspi_rxtx (dspi ) == false) {
1039+ if (dspi -> cur_msg )
1040+ WRITE_ONCE (dspi -> cur_msg -> status , 0 );
10421041 complete (& dspi -> xfer_done );
1042+ }
10431043
10441044 return IRQ_HANDLED ;
10451045}
@@ -1069,7 +1069,6 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
10691069 struct spi_device * spi = message -> spi ;
10701070 struct spi_transfer * transfer ;
10711071 bool cs = false;
1072- int status = 0 ;
10731072 u32 val = 0 ;
10741073 bool cs_change = false;
10751074
@@ -1129,7 +1128,7 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
11291128 dspi -> progress , !dspi -> irq );
11301129
11311130 if (dspi -> devtype_data -> trans_mode == DSPI_DMA_MODE ) {
1132- status = dspi_dma_xfer (dspi );
1131+ dspi_dma_xfer (dspi );
11331132 } else {
11341133 /*
11351134 * Reinitialize the completion before transferring data
@@ -1143,13 +1142,12 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
11431142
11441143 dspi_fifo_write (dspi );
11451144
1146- if (dspi -> irq ) {
1145+ if (dspi -> irq )
11471146 wait_for_completion (& dspi -> xfer_done );
1148- } else {
1149- status = dspi_poll (dspi );
1150- }
1147+ else
1148+ dspi_poll (dspi );
11511149 }
1152- if (status )
1150+ if (READ_ONCE ( message -> status ) )
11531151 break ;
11541152
11551153 spi_transfer_delay_exec (transfer );
@@ -1158,7 +1156,8 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
11581156 dspi_deassert_cs (spi , & cs );
11591157 }
11601158
1161- if (status || !cs_change ) {
1159+ dspi -> cur_msg = NULL ;
1160+ if (message -> status || !cs_change ) {
11621161 /* Put DSPI in stop mode */
11631162 regmap_update_bits (dspi -> regmap , SPI_MCR ,
11641163 SPI_MCR_HALT , SPI_MCR_HALT );
@@ -1167,10 +1166,9 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
11671166 ;
11681167 }
11691168
1170- message -> status = status ;
11711169 spi_finalize_current_message (ctlr );
11721170
1173- return status ;
1171+ return message -> status ;
11741172}
11751173
11761174static int dspi_set_mtf (struct fsl_dspi * dspi )
0 commit comments