|
@@ -266,7 +266,7 @@ static void spi_qup_read_from_fifo(struct spi_qup *controller, u32 num_words)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void spi_qup_read(struct spi_qup *controller)
|
|
|
+static void spi_qup_read(struct spi_qup *controller, u32 *opflags)
|
|
|
{
|
|
|
u32 remainder, words_per_block, num_words;
|
|
|
bool is_block_mode = controller->mode == QUP_IO_M_MODE_BLOCK;
|
|
@@ -305,10 +305,12 @@ static void spi_qup_read(struct spi_qup *controller)
|
|
|
|
|
|
/*
|
|
|
* Due to extra stickiness of the QUP_OP_IN_SERVICE_FLAG during block
|
|
|
- * mode reads, it has to be cleared again at the very end
|
|
|
+ * reads, it has to be cleared again at the very end. However, be sure
|
|
|
+ * to refresh opflags value because MAX_INPUT_DONE_FLAG may now be
|
|
|
+ * present and this is used to determine if transaction is complete
|
|
|
*/
|
|
|
- if (is_block_mode && spi_qup_is_flag_set(controller,
|
|
|
- QUP_OP_MAX_INPUT_DONE_FLAG))
|
|
|
+ *opflags = readl_relaxed(controller->base + QUP_OPERATIONAL);
|
|
|
+ if (is_block_mode && *opflags & QUP_OP_MAX_INPUT_DONE_FLAG)
|
|
|
writel_relaxed(QUP_OP_IN_SERVICE_FLAG,
|
|
|
controller->base + QUP_OPERATIONAL);
|
|
|
|
|
@@ -613,7 +615,7 @@ static irqreturn_t spi_qup_qup_irq(int irq, void *dev_id)
|
|
|
writel_relaxed(opflags, controller->base + QUP_OPERATIONAL);
|
|
|
} else {
|
|
|
if (opflags & QUP_OP_IN_SERVICE_FLAG)
|
|
|
- spi_qup_read(controller);
|
|
|
+ spi_qup_read(controller, &opflags);
|
|
|
|
|
|
if (opflags & QUP_OP_OUT_SERVICE_FLAG)
|
|
|
spi_qup_write(controller);
|