From patchwork Sun Sep 20 19:10:59 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: 7226541 X-Patchwork-Delegate: geert@linux-m68k.org Return-Path: X-Original-To: patchwork-linux-sh@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id BF0569F40A for ; Sun, 20 Sep 2015 19:11:20 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EE13420697 for ; Sun, 20 Sep 2015 19:11:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EE183206BC for ; Sun, 20 Sep 2015 19:11:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755486AbbITTLP (ORCPT ); Sun, 20 Sep 2015 15:11:15 -0400 Received: from mail-wi0-f176.google.com ([209.85.212.176]:37277 "EHLO mail-wi0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755468AbbITTLO (ORCPT ); Sun, 20 Sep 2015 15:11:14 -0400 Received: by wicfx3 with SMTP id fx3so85832751wic.0; Sun, 20 Sep 2015 12:11:13 -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=5uGCcExdWKDTXVRTcdVU5xNmysui2eXP8V1vym/nCvI=; b=uGJxHfNLhR0JO+OP7BYj0IBxb2QEXRanPfOLllulEmN3RXupXMpIsDCrnmRfvUczHz bDAFwJbNRD74ekAehnaUMXEU5iamQBESfUeLQfWPcJ5jG9cQJYsGBbE+gIalGSLKxY4B 6Ic9aDa85WR+LT83sVgR2k7n3UIZBmQHCM+lrsGpg4CGJW1GS7k793ezPqbRpAQj+s2i L1DjxYuEW/y9nsLdsbk78/04D0ULkoTCC9fnqT0A8KdXdC1uZREiHEykK130C8oclBMN qqNTfeS9/TtU4OUpV214FfmzXiSnsMkVlhbqQyWISRn7c5rBciZYfdpPtoD6qtKmJt78 K/mg== X-Received: by 10.194.52.6 with SMTP id p6mr21381233wjo.119.1442776273624; Sun, 20 Sep 2015 12:11:13 -0700 (PDT) Received: from ubuntu-VirtualBox.fritz.box (p4FDCDB66.dip0.t-ipconnect.de. [79.220.219.102]) by smtp.googlemail.com with ESMTPSA id fz1sm9644738wic.8.2015.09.20.12.11.12 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 20 Sep 2015 12:11:13 -0700 (PDT) From: hamzahfrq.sub@gmail.com To: laurent.pinchart@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, linux-sh@vger.kernel.org, Muhammad Hamza Farooq Subject: [RESEND PATCH 3/6] dma: rcar-dma: check if complete DMA packet received but not processed Date: Sun, 20 Sep 2015 21:10:59 +0200 Message-Id: <1442776262-2503-4-git-send-email-hamzahfrq.sub@gmail.com> X-Mailer: git-send-email 1.7.9.5 Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@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=unavailable 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(+) diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c index c3753e1..668fd2b 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; @@ -1238,6 +1246,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;