Skip to content

Commit 5b342c5

Browse files
vladimirolteanbroonie
authored andcommitted
spi: spi-fsl-dspi: Move invariant configs out of dspi_transfer_one_message
The operating mode (DMA, XSPI, EOQ) is not going to change across the lifetime of the device. So it makes no sense to keep writing to SPI_RSER on each message. Move this configuration to dspi_init instead. Signed-off-by: Vladimir Oltean <[email protected]> Tested-by: Michael Walle <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 826b3a6 commit 5b342c5

File tree

1 file changed

+29
-26
lines changed

1 file changed

+29
-26
lines changed

drivers/spi/spi-fsl-dspi.c

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,6 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
900900
{
901901
struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr);
902902
struct spi_device *spi = message->spi;
903-
enum dspi_trans_mode trans_mode;
904903
struct spi_transfer *transfer;
905904
int status = 0;
906905

@@ -942,30 +941,11 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
942941
spi_take_timestamp_pre(dspi->ctlr, dspi->cur_transfer,
943942
dspi->progress, !dspi->irq);
944943

945-
trans_mode = dspi->devtype_data->trans_mode;
946-
switch (trans_mode) {
947-
case DSPI_EOQ_MODE:
948-
regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_EOQFE);
949-
dspi_fifo_write(dspi);
950-
break;
951-
case DSPI_XSPI_MODE:
952-
regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_CMDTCFE);
953-
dspi_fifo_write(dspi);
954-
break;
955-
case DSPI_DMA_MODE:
956-
regmap_write(dspi->regmap, SPI_RSER,
957-
SPI_RSER_TFFFE | SPI_RSER_TFFFD |
958-
SPI_RSER_RFDFE | SPI_RSER_RFDFD);
944+
if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) {
959945
status = dspi_dma_xfer(dspi);
960-
break;
961-
default:
962-
dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n",
963-
trans_mode);
964-
status = -EINVAL;
965-
goto out;
966-
}
946+
} else {
947+
dspi_fifo_write(dspi);
967948

968-
if (trans_mode != DSPI_DMA_MODE) {
969949
if (dspi->irq) {
970950
wait_for_completion(&dspi->xfer_done);
971951
reinit_completion(&dspi->xfer_done);
@@ -975,11 +955,12 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
975955
} while (status == -EINPROGRESS);
976956
}
977957
}
958+
if (status)
959+
break;
978960

979961
spi_transfer_delay_exec(transfer);
980962
}
981963

982-
out:
983964
message->status = status;
984965
spi_finalize_current_message(ctlr);
985966

@@ -1170,7 +1151,7 @@ static const struct regmap_config dspi_xspi_regmap_config[] = {
11701151
},
11711152
};
11721153

1173-
static void dspi_init(struct fsl_dspi *dspi)
1154+
static int dspi_init(struct fsl_dspi *dspi)
11741155
{
11751156
unsigned int mcr;
11761157

@@ -1184,6 +1165,26 @@ static void dspi_init(struct fsl_dspi *dspi)
11841165

11851166
regmap_write(dspi->regmap, SPI_MCR, mcr);
11861167
regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR);
1168+
1169+
switch (dspi->devtype_data->trans_mode) {
1170+
case DSPI_EOQ_MODE:
1171+
regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_EOQFE);
1172+
break;
1173+
case DSPI_XSPI_MODE:
1174+
regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_CMDTCFE);
1175+
break;
1176+
case DSPI_DMA_MODE:
1177+
regmap_write(dspi->regmap, SPI_RSER,
1178+
SPI_RSER_TFFFE | SPI_RSER_TFFFD |
1179+
SPI_RSER_RFDFE | SPI_RSER_RFDFD);
1180+
break;
1181+
default:
1182+
dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n",
1183+
dspi->devtype_data->trans_mode);
1184+
return -EINVAL;
1185+
}
1186+
1187+
return 0;
11871188
}
11881189

11891190
static int dspi_slave_abort(struct spi_master *master)
@@ -1339,7 +1340,9 @@ static int dspi_probe(struct platform_device *pdev)
13391340
if (ret)
13401341
goto out_ctlr_put;
13411342

1342-
dspi_init(dspi);
1343+
ret = dspi_init(dspi);
1344+
if (ret)
1345+
goto out_clk_put;
13431346

13441347
dspi->irq = platform_get_irq(pdev, 0);
13451348
if (dspi->irq <= 0) {

0 commit comments

Comments
 (0)