From patchwork Mon Sep 14 12:02:36 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: hamzahfrq.sub@gmail.com X-Patchwork-Id: 7174891 Return-Path: X-Original-To: patchwork-dmaengine@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id E879FBEEC1 for ; Mon, 14 Sep 2015 12:03:13 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1954620717 for ; Mon, 14 Sep 2015 12:03:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6DCF52072E for ; Mon, 14 Sep 2015 12:03:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753101AbbINMCz (ORCPT ); Mon, 14 Sep 2015 08:02:55 -0400 Received: from mail-wi0-f181.google.com ([209.85.212.181]:34516 "EHLO mail-wi0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753098AbbINMCy (ORCPT ); Mon, 14 Sep 2015 08:02:54 -0400 Received: by wicfx3 with SMTP id fx3so136978048wic.1 for ; Mon, 14 Sep 2015 05:02:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=envgydrNkR0C7REAXpHHoakaJrqwY+OZR+DHN/jM1S4=; b=yZ8412X0lwJNdargkgm24cSaGjPvnBEmAbDIuqUTSiX2MlmzrzKLAHLlHF3Lq3enbz LPgSx8mUWp91Zjq6dsAcnYm1gpNPYmRDwVJEL/NuNJXQPsh7eoC/+CAqOPZAcg5U9zn3 i0wr1dbLd8+nq3+ajBwLRl/UnBdSULD8osuupLO9MGhPqiwAHrB2aQqfcxeVowVIiEO7 Go2TxaucTcMFNoGyKqL4oPAnmW+stNq3LoNmeOH+rF5wDHjS8nF3odhGa8ELtFsTxLx4 dqSinTAGOmhODnDcbuqJa84vH9skLEGxBFPb2E7u81Al3g75IzvWU+SpYiJMZb8IrTdY Y3lA== X-Received: by 10.180.37.76 with SMTP id w12mr26240545wij.0.1442232173517; Mon, 14 Sep 2015 05:02:53 -0700 (PDT) Received: from ubuntu-VirtualBox.fritz.box (p4FDCD8DE.dip0.t-ipconnect.de. [79.220.216.222]) by smtp.googlemail.com with ESMTPSA id lz10sm15166706wjb.48.2015.09.14.05.02.52 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 14 Sep 2015 05:02:52 -0700 (PDT) From: hamzahfrq.sub@gmail.com To: laurent.pinchart+renesas@ideasonboard.com Cc: dmaengine@vger.kernel.org, j@bitron.ch, joe@perches.com, kuninori.morimoto.gx@renesas.com, broonie@kernel.org, geert+renesas@glider.be, vinod.koul@intel.com, Muhammad Hamza Farooq Subject: [PATCH 3/6] dma: rcar_dma: check if complete DMA packet received but not processed Date: Mon, 14 Sep 2015 14:02:36 +0200 Message-Id: <1442232160-2615-4-git-send-email-hamzahfrq.sub@gmail.com> X-Mailer: git-send-email 1.7.9.5 Sender: dmaengine-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Muhammad Hamza Farooq At high speeds, DMA interrupts come very fast. If there's an interrupt pending before previous is handled, this method can help return actual status of the DMA transaction by reading the hardware flag Signed-off-by: Muhammad Hamza Farooq --- drivers/dma/sh/rcar-dmac.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe dmaengine" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c index 52cd528..653563d 100644 --- a/drivers/dma/sh/rcar-dmac.c +++ b/drivers/dma/sh/rcar-dmac.c @@ -314,6 +314,14 @@ static bool rcar_dmac_chan_is_busy(struct rcar_dmac_chan *chan) return (chcr & (RCAR_DMACHCR_DE | RCAR_DMACHCR_TE)) == RCAR_DMACHCR_DE; } +/* Transfer completed but not yet handled */ +static bool rcar_dmac_last_tx_complete(struct rcar_dmac_chan *chan) +{ + u32 chcr = rcar_dmac_chan_read(chan, RCAR_DMACHCR); + + return (chcr & RCAR_DMACHCR_TE) == RCAR_DMACHCR_TE; +} + static void rcar_dmac_chan_start_xfer(struct rcar_dmac_chan *chan) { struct rcar_dmac_desc *desc = chan->desc.running; @@ -1237,6 +1245,10 @@ static enum dma_status rcar_dmac_tx_status(struct dma_chan *chan, unsigned long flags; unsigned int residue; + /* Interrupt not yet serviced */ + if(rcar_dmac_last_tx_complete(rchan)) + return DMA_COMPLETE; + status = dma_cookie_status(chan, cookie, txstate); if (status == DMA_COMPLETE || !txstate) return status;