static irqreturn_t dspi_interrupt(int irq, void *dev_id) { struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; writel(SPI_SR_EOQF, dspi->base + SPI_SR); dspi_transfer_read(dspi); if (!dspi->len) { if (dspi->dataflags & TRAN_STATE_WORD_ODD_NUM) set_bit_mode(dspi, 16); dspi->waitflags = 1; wake_up_interruptible(&dspi->waitq); } else { dspi_transfer_write(dspi); return IRQ_HANDLED; } return IRQ_HANDLED; }
static irqreturn_t dspi_interrupt(int irq, void *dev_id) { struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; regmap_write(dspi->regmap, SPI_SR, SPI_SR_EOQF); dspi_transfer_read(dspi); if (!dspi->len) { if (dspi->dataflags & TRAN_STATE_WORD_ODD_NUM) regmap_update_bits(dspi->regmap, SPI_CTAR(dspi->cs), SPI_FRAME_BITS_MASK, SPI_FRAME_BITS(16)); dspi->waitflags = 1; wake_up_interruptible(&dspi->waitq); } else { dspi_transfer_write(dspi); return IRQ_HANDLED; } return IRQ_HANDLED; }
static int dspi_txrx_transfer(struct spi_device *spi, struct spi_transfer *t) { struct fsl_dspi *dspi = spi_master_get_devdata(spi->master); dspi->cur_transfer = t; dspi->cur_chip = spi_get_ctldata(spi); dspi->cs = spi->chip_select; dspi->void_write_data = dspi->cur_chip->void_write_data; dspi->dataflags = 0; dspi->tx = (void *)t->tx_buf; dspi->tx_end = dspi->tx + t->len; dspi->rx = t->rx_buf; dspi->rx_end = dspi->rx + t->len; dspi->len = t->len; if (!dspi->rx) dspi->dataflags |= TRAN_STATE_RX_VOID; if (!dspi->tx) dspi->dataflags |= TRAN_STATE_TX_VOID; writel(dspi->cur_chip->mcr_val, dspi->base + SPI_MCR); writel(dspi->cur_chip->ctar_val, dspi->base + SPI_CTAR(dspi->cs)); writel(SPI_RSER_EOQFE, dspi->base + SPI_RSER); if (t->speed_hz) writel(dspi->cur_chip->ctar_val, dspi->base + SPI_CTAR(dspi->cs)); dspi_transfer_write(dspi); if (wait_event_interruptible(dspi->waitq, dspi->waitflags)) dev_err(&dspi->pdev->dev, "wait transfer complete fail!\n"); dspi->waitflags = 0; return t->len - dspi->len; }