Skip to content

Commit

Permalink
spi: spi-fsl-dspi: Move invariant configs out of dspi_transfer_one_me…
Browse files Browse the repository at this point in the history
…ssage

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 <vladimir.oltean@nxp.com>
Tested-by: Michael Walle <michael@walle.cc>
Link: https://lore.kernel.org/r/20200318001603.9650-10-olteanv@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Vladimir Oltean authored and Mark Brown committed Mar 18, 2020
1 parent 826b3a6 commit 5b342c5
Showing 1 changed file with 29 additions and 26 deletions.
55 changes: 29 additions & 26 deletions drivers/spi/spi-fsl-dspi.c
Original file line number Diff line number Diff line change
Expand Up @@ -900,7 +900,6 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
{
struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr);
struct spi_device *spi = message->spi;
enum dspi_trans_mode trans_mode;
struct spi_transfer *transfer;
int status = 0;

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

trans_mode = dspi->devtype_data->trans_mode;
switch (trans_mode) {
case DSPI_EOQ_MODE:
regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_EOQFE);
dspi_fifo_write(dspi);
break;
case DSPI_XSPI_MODE:
regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_CMDTCFE);
dspi_fifo_write(dspi);
break;
case DSPI_DMA_MODE:
regmap_write(dspi->regmap, SPI_RSER,
SPI_RSER_TFFFE | SPI_RSER_TFFFD |
SPI_RSER_RFDFE | SPI_RSER_RFDFD);
if (dspi->devtype_data->trans_mode == DSPI_DMA_MODE) {
status = dspi_dma_xfer(dspi);
break;
default:
dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n",
trans_mode);
status = -EINVAL;
goto out;
}
} else {
dspi_fifo_write(dspi);

if (trans_mode != DSPI_DMA_MODE) {
if (dspi->irq) {
wait_for_completion(&dspi->xfer_done);
reinit_completion(&dspi->xfer_done);
Expand All @@ -975,11 +955,12 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
} while (status == -EINPROGRESS);
}
}
if (status)
break;

spi_transfer_delay_exec(transfer);
}

out:
message->status = status;
spi_finalize_current_message(ctlr);

Expand Down Expand Up @@ -1170,7 +1151,7 @@ static const struct regmap_config dspi_xspi_regmap_config[] = {
},
};

static void dspi_init(struct fsl_dspi *dspi)
static int dspi_init(struct fsl_dspi *dspi)
{
unsigned int mcr;

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

regmap_write(dspi->regmap, SPI_MCR, mcr);
regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR);

switch (dspi->devtype_data->trans_mode) {
case DSPI_EOQ_MODE:
regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_EOQFE);
break;
case DSPI_XSPI_MODE:
regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_CMDTCFE);
break;
case DSPI_DMA_MODE:
regmap_write(dspi->regmap, SPI_RSER,
SPI_RSER_TFFFE | SPI_RSER_TFFFD |
SPI_RSER_RFDFE | SPI_RSER_RFDFD);
break;
default:
dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n",
dspi->devtype_data->trans_mode);
return -EINVAL;
}

return 0;
}

static int dspi_slave_abort(struct spi_master *master)
Expand Down Expand Up @@ -1339,7 +1340,9 @@ static int dspi_probe(struct platform_device *pdev)
if (ret)
goto out_ctlr_put;

dspi_init(dspi);
ret = dspi_init(dspi);
if (ret)
goto out_clk_put;

dspi->irq = platform_get_irq(pdev, 0);
if (dspi->irq <= 0) {
Expand Down

0 comments on commit 5b342c5

Please sign in to comment.