spi: spi-fsl-dspi: Move dspi_interrupt above dspi_transfer_one_message
The two functions are loosely coupled through dspi->waitq, but logically, dspi_transfer_one_message depends on dspi_interrupt in order to complete. Move its definition above it so the I/O functions are grouped closer together. Signed-off-by: Vladimir Oltean <olteanv@gmail.com> Link: https://lore.kernel.org/r/20190818180115.31114-13-olteanv@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
206175306d
commit
a63af99f0d
|
@ -647,6 +647,63 @@ static void dspi_eoq_read(struct fsl_dspi *dspi)
|
|||
dspi_push_rx(dspi, fifo_read(dspi));
|
||||
}
|
||||
|
||||
static irqreturn_t dspi_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id;
|
||||
struct spi_message *msg = dspi->cur_msg;
|
||||
enum dspi_trans_mode trans_mode;
|
||||
u32 spi_sr, spi_tcr;
|
||||
u16 spi_tcnt;
|
||||
|
||||
regmap_read(dspi->regmap, SPI_SR, &spi_sr);
|
||||
regmap_write(dspi->regmap, SPI_SR, spi_sr);
|
||||
|
||||
|
||||
if (spi_sr & (SPI_SR_EOQF | SPI_SR_TCFQF)) {
|
||||
/* Get transfer counter (in number of SPI transfers). It was
|
||||
* reset to 0 when transfer(s) were started.
|
||||
*/
|
||||
regmap_read(dspi->regmap, SPI_TCR, &spi_tcr);
|
||||
spi_tcnt = SPI_TCR_GET_TCNT(spi_tcr);
|
||||
/* Update total number of bytes that were transferred */
|
||||
msg->actual_length += spi_tcnt * dspi->bytes_per_word;
|
||||
|
||||
trans_mode = dspi->devtype_data->trans_mode;
|
||||
switch (trans_mode) {
|
||||
case DSPI_EOQ_MODE:
|
||||
dspi_eoq_read(dspi);
|
||||
break;
|
||||
case DSPI_TCFQ_MODE:
|
||||
dspi_tcfq_read(dspi);
|
||||
break;
|
||||
default:
|
||||
dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n",
|
||||
trans_mode);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
if (!dspi->len) {
|
||||
dspi->waitflags = 1;
|
||||
wake_up_interruptible(&dspi->waitq);
|
||||
} else {
|
||||
switch (trans_mode) {
|
||||
case DSPI_EOQ_MODE:
|
||||
dspi_eoq_write(dspi);
|
||||
break;
|
||||
case DSPI_TCFQ_MODE:
|
||||
dspi_tcfq_write(dspi);
|
||||
break;
|
||||
default:
|
||||
dev_err(&dspi->pdev->dev,
|
||||
"unsupported trans_mode %u\n",
|
||||
trans_mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int dspi_transfer_one_message(struct spi_controller *ctlr,
|
||||
struct spi_message *message)
|
||||
{
|
||||
|
@ -825,63 +882,6 @@ static void dspi_cleanup(struct spi_device *spi)
|
|||
kfree(chip);
|
||||
}
|
||||
|
||||
static irqreturn_t dspi_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id;
|
||||
struct spi_message *msg = dspi->cur_msg;
|
||||
enum dspi_trans_mode trans_mode;
|
||||
u32 spi_sr, spi_tcr;
|
||||
u16 spi_tcnt;
|
||||
|
||||
regmap_read(dspi->regmap, SPI_SR, &spi_sr);
|
||||
regmap_write(dspi->regmap, SPI_SR, spi_sr);
|
||||
|
||||
|
||||
if (spi_sr & (SPI_SR_EOQF | SPI_SR_TCFQF)) {
|
||||
/* Get transfer counter (in number of SPI transfers). It was
|
||||
* reset to 0 when transfer(s) were started.
|
||||
*/
|
||||
regmap_read(dspi->regmap, SPI_TCR, &spi_tcr);
|
||||
spi_tcnt = SPI_TCR_GET_TCNT(spi_tcr);
|
||||
/* Update total number of bytes that were transferred */
|
||||
msg->actual_length += spi_tcnt * dspi->bytes_per_word;
|
||||
|
||||
trans_mode = dspi->devtype_data->trans_mode;
|
||||
switch (trans_mode) {
|
||||
case DSPI_EOQ_MODE:
|
||||
dspi_eoq_read(dspi);
|
||||
break;
|
||||
case DSPI_TCFQ_MODE:
|
||||
dspi_tcfq_read(dspi);
|
||||
break;
|
||||
default:
|
||||
dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n",
|
||||
trans_mode);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
if (!dspi->len) {
|
||||
dspi->waitflags = 1;
|
||||
wake_up_interruptible(&dspi->waitq);
|
||||
} else {
|
||||
switch (trans_mode) {
|
||||
case DSPI_EOQ_MODE:
|
||||
dspi_eoq_write(dspi);
|
||||
break;
|
||||
case DSPI_TCFQ_MODE:
|
||||
dspi_tcfq_write(dspi);
|
||||
break;
|
||||
default:
|
||||
dev_err(&dspi->pdev->dev,
|
||||
"unsupported trans_mode %u\n",
|
||||
trans_mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static const struct of_device_id fsl_dspi_dt_ids[] = {
|
||||
{ .compatible = "fsl,vf610-dspi", .data = &vf610_data, },
|
||||
{ .compatible = "fsl,ls1021a-v1.0-dspi", .data = &ls1021a_v1_data, },
|
||||
|
|
Loading…
Reference in New Issue