From patchwork Thu Nov 16 17:11:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 838693 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="K/hmaRCD"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yd79Y4z3gz9s03 for ; Fri, 17 Nov 2017 04:13:05 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935751AbdKPRNE (ORCPT ); Thu, 16 Nov 2017 12:13:04 -0500 Received: from mail-lf0-f65.google.com ([209.85.215.65]:55892 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935749AbdKPRND (ORCPT ); Thu, 16 Nov 2017 12:13:03 -0500 Received: by mail-lf0-f65.google.com with SMTP id e143so31036529lfg.12; Thu, 16 Nov 2017 09:13:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=HyAAxlcKQs7d039IFHPHwE8z4WStm6JTJ4F8yAgyDR4=; b=K/hmaRCD/bLmIPZcYks6sElfD8g37dyV0FiB/PBFmlQOQbs8z8XzwtwKMy7MWUY7nr lBL3yCHKFU+NT6bgjbO4WfyYquuzqxBcB0JW6VXZ0+wr5+/pwxAZryhKHFioGYO+sku7 koxjH/JdQAT/d910vFJMoCJN2eo5j9oCy4kSemOZqDlwoYzppOEApMUw2/jLtUb+FPFn XOI6stf25dHMCdHwguBT5vGHiY64QYnkC+kpUaLn7lNpGNrhtImraClnYAChbZ45rIbR T2d08asABppEu3cxYFOoAScq9Y0tC6HM8CTde3cxzXs7arqFvJMUBiJxLVvwX1xh8Z2M PZBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=HyAAxlcKQs7d039IFHPHwE8z4WStm6JTJ4F8yAgyDR4=; b=J+kBPkSiP1rZGn5IUZYuU3NaFpvWDM9r91L9zgT/gZ9UOvd1AWsnidWrDGRHtiCi81 ntE+0/wqTqyk7qIqxWh5m8Fl0JMX7xw6y0HY+AuBeH/FJB30qUdMaIZ4gMqGndu637BC +Kj3coL3+frX45suYEPOGomCOLL5byRTMRQ9J+5Wo86ggr5EcK/4jXIzW4dBsudac3t1 nokQOB0uk5jSJ8rlDtfdO9IomFIJdv2sJtZ2zuLY9wKYXxgujB83h50ZGiSOqvh5oCuR OnaEFid9L0OTMczIu0uTZ4tvikNEu4C7KGpWReFoRWS1P2N0TVAFEfZfVDM+W8oXwqwy tWAw== X-Gm-Message-State: AJaThX5fHgLk1eaVqNE/xEf8ykAU6n+lffIRmh4WqsGr+d+jFHajqtIt etP3vifGj8tEWiHIFu3UQ90= X-Google-Smtp-Source: AGs4zMaQLe1CPtMAVrqv5I32AZIjSFjUVYO0HSkLJw7FKTyim/LZzS7uakR4jiTJK7LEksUqdfBQZQ== X-Received: by 10.25.80.93 with SMTP id z29mr829672lfj.9.1510852382189; Thu, 16 Nov 2017 09:13:02 -0800 (PST) Received: from localhost.localdomain (ppp109-252-91-204.pppoe.spdop.ru. [109.252.91.204]) by smtp.gmail.com with ESMTPSA id x18sm393453lja.55.2017.11.16.09.13.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Nov 2017 09:13:01 -0800 (PST) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Vinod Koul , Laxman Dewangan Cc: dmaengine@vger.kernel.org, linux-tegra@vger.kernel.org Subject: [PATCH RESEND v2] dmaengine: tegra-apb: Support non-flow controlled slave configuration Date: Thu, 16 Nov 2017 20:11:06 +0300 Message-Id: <20171116171106.25932-1-digetx@gmail.com> X-Mailer: git-send-email 2.14.2 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org This allows DMA client to issue a non-flow controlled TX. In particular it is needed for the fuse driver that reads fuse registers using APBDMA to workaround a HW bug that results in hang when CPU and DMA perform simultaneous access to fuse peripheral. Signed-off-by: Dmitry Osipenko Reviewed-by: Jon Hunter --- Petch resent as per Vinod's request. Change log: v2: - Removed trailing whitespace reported by checkpatch drivers/dma/tegra20-apb-dma.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c index b9d75a54c896..9a558e30c461 100644 --- a/drivers/dma/tegra20-apb-dma.c +++ b/drivers/dma/tegra20-apb-dma.c @@ -353,7 +353,8 @@ static int tegra_dma_slave_config(struct dma_chan *dc, } memcpy(&tdc->dma_sconfig, sconfig, sizeof(*sconfig)); - if (tdc->slave_id == TEGRA_APBDMA_SLAVE_ID_INVALID) { + if (tdc->slave_id == TEGRA_APBDMA_SLAVE_ID_INVALID && + sconfig->device_fc) { if (sconfig->slave_id > TEGRA_APBDMA_CSR_REQ_SEL_MASK) return -EINVAL; tdc->slave_id = sconfig->slave_id; @@ -970,8 +971,13 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_slave_sg( TEGRA_APBDMA_AHBSEQ_WRAP_SHIFT; ahb_seq |= TEGRA_APBDMA_AHBSEQ_BUS_WIDTH_32; - csr |= TEGRA_APBDMA_CSR_ONCE | TEGRA_APBDMA_CSR_FLOW; - csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT; + csr |= TEGRA_APBDMA_CSR_ONCE; + + if (tdc->slave_id != TEGRA_APBDMA_SLAVE_ID_INVALID) { + csr |= TEGRA_APBDMA_CSR_FLOW; + csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT; + } + if (flags & DMA_PREP_INTERRUPT) csr |= TEGRA_APBDMA_CSR_IE_EOC; @@ -1110,10 +1116,13 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_dma_cyclic( TEGRA_APBDMA_AHBSEQ_WRAP_SHIFT; ahb_seq |= TEGRA_APBDMA_AHBSEQ_BUS_WIDTH_32; - csr |= TEGRA_APBDMA_CSR_FLOW; + if (tdc->slave_id != TEGRA_APBDMA_SLAVE_ID_INVALID) { + csr |= TEGRA_APBDMA_CSR_FLOW; + csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT; + } + if (flags & DMA_PREP_INTERRUPT) csr |= TEGRA_APBDMA_CSR_IE_EOC; - csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT; apb_seq |= TEGRA_APBDMA_APBSEQ_WRAP_WORD_1;