From patchwork Fri Jul 28 06:53:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Varadarajan Narayanan X-Patchwork-Id: 9867921 X-Patchwork-Delegate: agross@codeaurora.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D3BFB60382 for ; Fri, 28 Jul 2017 06:54:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C7C8F2888F for ; Fri, 28 Jul 2017 06:54:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BCD73288A0; Fri, 28 Jul 2017 06:54:25 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 52DEA2888F for ; Fri, 28 Jul 2017 06:54:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751759AbdG1GyL (ORCPT ); Fri, 28 Jul 2017 02:54:11 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:36254 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751963AbdG1GyG (ORCPT ); Fri, 28 Jul 2017 02:54:06 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 84ABB60724; Fri, 28 Jul 2017 06:54:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1501224845; bh=ltfjOrOMZwTeWBG65PWffiVNgLnDeZQtx60RALxe6WE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BDZtpvvokJVPLStypuoODgCp++XLKHCapS2sEt8CwQy7ALsOIXsXOvvab1JewTYaZ Z34A4lSN6WB0GMgpSKv8XgTbuxX0cymXqOUq4X374OCxMl6mpua43eehiMcEGaAuEC JW7QGZ7E8HtpXNNIe0UEH5hsekZscLwOgaxf1n1g= Received: from varda-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: varada@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id F215B60953; Fri, 28 Jul 2017 06:54:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1501224844; bh=ltfjOrOMZwTeWBG65PWffiVNgLnDeZQtx60RALxe6WE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XGilxe9tZiBBPl4PyVsnicSBKhLAzsK2brWrmF/n3qfjhHd49kGLVBe/BpSrrJVQK GqvGtICfJZR1G9kRDKsQT70HOjPa1Yg2AQoB75TBhqr0Ttsc/0b3jjiMhiJW8u//Rc z35JBBrAzz73dq/Q3gmLwJvHXNVeNHTmuyoAmw8Q= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org F215B60953 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=varada@codeaurora.org From: Varadarajan Narayanan To: broonie@kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, andy.gross@linaro.org, david.brown@linaro.org, linux-spi@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org Cc: Varadarajan Narayanan , Andy Gross , Abhishek Sahu Subject: [PATCH v6 13/14] spi: qup: Ensure done detection Date: Fri, 28 Jul 2017 12:23:00 +0530 Message-Id: <1501224781-19519-14-git-send-email-varada@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1501224781-19519-1-git-send-email-varada@codeaurora.org> References: <1501224781-19519-1-git-send-email-varada@codeaurora.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch fixes an issue where a SPI transaction has completed, but the done condition is missed. This occurs because at the time of interrupt the MAX_INPUT_DONE_FLAG is not asserted. However, in the process of reading blocks of data from the FIFO, the last portion of data comes in. The opflags read at the beginning of the irq handler no longer matches the current opflag state. To get around this condition, the block read function should update the opflags so that done detection is correct after the return. Signed-off-by: Andy Gross Signed-off-by: Abhishek Sahu Signed-off-by: Varadarajan Narayanan --- drivers/spi/spi-qup.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c index 3c2c2c0..4c3c938 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);