diff options
| -rw-r--r-- | drivers/spi/spi-qup.c | 12 | 
1 files changed, 7 insertions, 5 deletions
| diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c index 3c2c2c0ed9ab..4c3c938360f4 100644 --- a/drivers/spi/spi-qup.c +++ b/drivers/spi/spi-qup.c @@ -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); | 
