Merge remote-tracking branch 'spi/fix/xilinx' into spi-linus
This commit is contained in:
commit
c1d926a5d2
|
@ -267,7 +267,6 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
|
|||
{
|
||||
struct xilinx_spi *xspi = spi_master_get_devdata(spi->master);
|
||||
u32 ipif_ier;
|
||||
u16 cr;
|
||||
|
||||
/* We get here with transmitter inhibited */
|
||||
|
||||
|
@ -276,7 +275,6 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
|
|||
xspi->remaining_bytes = t->len;
|
||||
INIT_COMPLETION(xspi->done);
|
||||
|
||||
xilinx_spi_fill_tx_fifo(xspi);
|
||||
|
||||
/* Enable the transmit empty interrupt, which we use to determine
|
||||
* progress on the transmission.
|
||||
|
@ -285,12 +283,41 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
|
|||
xspi->write_fn(ipif_ier | XSPI_INTR_TX_EMPTY,
|
||||
xspi->regs + XIPIF_V123B_IIER_OFFSET);
|
||||
|
||||
/* Start the transfer by not inhibiting the transmitter any longer */
|
||||
cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET) &
|
||||
~XSPI_CR_TRANS_INHIBIT;
|
||||
xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET);
|
||||
for (;;) {
|
||||
u16 cr;
|
||||
u8 sr;
|
||||
|
||||
wait_for_completion(&xspi->done);
|
||||
xilinx_spi_fill_tx_fifo(xspi);
|
||||
|
||||
/* Start the transfer by not inhibiting the transmitter any
|
||||
* longer
|
||||
*/
|
||||
cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET) &
|
||||
~XSPI_CR_TRANS_INHIBIT;
|
||||
xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET);
|
||||
|
||||
wait_for_completion(&xspi->done);
|
||||
|
||||
/* A transmit has just completed. Process received data and
|
||||
* check for more data to transmit. Always inhibit the
|
||||
* transmitter while the Isr refills the transmit register/FIFO,
|
||||
* or make sure it is stopped if we're done.
|
||||
*/
|
||||
cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET);
|
||||
xspi->write_fn(cr | XSPI_CR_TRANS_INHIBIT,
|
||||
xspi->regs + XSPI_CR_OFFSET);
|
||||
|
||||
/* Read out all the data from the Rx FIFO */
|
||||
sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET);
|
||||
while ((sr & XSPI_SR_RX_EMPTY_MASK) == 0) {
|
||||
xspi->rx_fn(xspi);
|
||||
sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET);
|
||||
}
|
||||
|
||||
/* See if there is more data to send */
|
||||
if (!xspi->remaining_bytes > 0)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Disable the transmit empty interrupt */
|
||||
xspi->write_fn(ipif_ier, xspi->regs + XIPIF_V123B_IIER_OFFSET);
|
||||
|
@ -314,38 +341,7 @@ static irqreturn_t xilinx_spi_irq(int irq, void *dev_id)
|
|||
xspi->write_fn(ipif_isr, xspi->regs + XIPIF_V123B_IISR_OFFSET);
|
||||
|
||||
if (ipif_isr & XSPI_INTR_TX_EMPTY) { /* Transmission completed */
|
||||
u16 cr;
|
||||
u8 sr;
|
||||
|
||||
/* A transmit has just completed. Process received data and
|
||||
* check for more data to transmit. Always inhibit the
|
||||
* transmitter while the Isr refills the transmit register/FIFO,
|
||||
* or make sure it is stopped if we're done.
|
||||
*/
|
||||
cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET);
|
||||
xspi->write_fn(cr | XSPI_CR_TRANS_INHIBIT,
|
||||
xspi->regs + XSPI_CR_OFFSET);
|
||||
|
||||
/* Read out all the data from the Rx FIFO */
|
||||
sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET);
|
||||
while ((sr & XSPI_SR_RX_EMPTY_MASK) == 0) {
|
||||
xspi->rx_fn(xspi);
|
||||
sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET);
|
||||
}
|
||||
|
||||
/* See if there is more data to send */
|
||||
if (xspi->remaining_bytes > 0) {
|
||||
xilinx_spi_fill_tx_fifo(xspi);
|
||||
/* Start the transfer by not inhibiting the
|
||||
* transmitter any longer
|
||||
*/
|
||||
xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET);
|
||||
} else {
|
||||
/* No more data to send.
|
||||
* Indicate the transfer is completed.
|
||||
*/
|
||||
complete(&xspi->done);
|
||||
}
|
||||
complete(&xspi->done);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
|
Loading…
Reference in New Issue