From patchwork Tue Sep 10 18:52:51 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Fernandes X-Patchwork-Id: 2867321 Return-Path: X-Original-To: patchwork-linux-omap@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 427DCBF43F for ; Tue, 10 Sep 2013 18:54:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 238972025A for ; Tue, 10 Sep 2013 18:54:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E9ED020274 for ; Tue, 10 Sep 2013 18:54:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751358Ab3IJSyC (ORCPT ); Tue, 10 Sep 2013 14:54:02 -0400 Received: from bear.ext.ti.com ([192.94.94.41]:57571 "EHLO bear.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750982Ab3IJSxm (ORCPT ); Tue, 10 Sep 2013 14:53:42 -0400 Received: from dlelxv90.itg.ti.com ([172.17.2.17]) by bear.ext.ti.com (8.13.7/8.13.7) with ESMTP id r8AIqw1g006860; Tue, 10 Sep 2013 13:52:58 -0500 Received: from DLEE71.ent.ti.com (dlee71.ent.ti.com [157.170.170.114]) by dlelxv90.itg.ti.com (8.14.3/8.13.8) with ESMTP id r8AIqwHg013526; Tue, 10 Sep 2013 13:52:58 -0500 Received: from dflp33.itg.ti.com (10.64.6.16) by DLEE71.ent.ti.com (157.170.170.114) with Microsoft SMTP Server id 14.2.342.3; Tue, 10 Sep 2013 13:52:57 -0500 Received: from joel-laptop.am.dhcp.ti.com (ileax41-snat.itg.ti.com [10.172.224.153]) by dflp33.itg.ti.com (8.14.3/8.13.8) with ESMTP id r8AIqpoE023870; Tue, 10 Sep 2013 13:52:57 -0500 From: Joel Fernandes To: Sekhar Nori , Matt Porter , Vinod Koul , Dan Williams , Russell King , Jyri Sarah , "Jason Kridner" , Koen Kooi CC: Linux OMAP List , Linux ARM Kernel List , Linux DaVinci Kernel List , Linux Kernel Mailing List , Linux MMC List , Pantel Antoniou , Joel Fernandes Subject: [PATCH v3] ARM: EDMA: Fix clearing of unused list for DT DMA resources Date: Tue, 10 Sep 2013 13:52:51 -0500 Message-ID: <1378839171-14455-1-git-send-email-joelf@ti.com> X-Mailer: git-send-email 1.8.1.2 MIME-Version: 1.0 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Spam-Status: No, score=-7.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, 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 HWMOD removal for MMC is breaking edma_start as the events are being manually triggered due to unused channel list not being clear. This patch fixes the issue, by reading the "dmas" property from the DT node if it exists and clearing the bits in the unused channel list. For this purpose we use the of_* helpers to parse the arguments in the dmas phandle list. Reviewed-by: Sekhar Nori Reported-by: Balaji T K Cc: Pantel Antoniou Signed-off-by: Joel Fernandes --- This patch is a repost of v2 with minor change of return value. As such this patch fixes DMA breakages on all dependent peripherals (DMA, AES, MMC, McASP..) so should go in for -rc cycle. arch/arm/common/edma.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/arch/arm/common/edma.c b/arch/arm/common/edma.c index 117f955..88ea067 100644 --- a/arch/arm/common/edma.c +++ b/arch/arm/common/edma.c @@ -560,14 +560,30 @@ static int reserve_contiguous_slots(int ctlr, unsigned int id, static int prepare_unused_channel_list(struct device *dev, void *data) { struct platform_device *pdev = to_platform_device(dev); - int i, ctlr; + int i = 0, ctlr; + u32 dma_chan; + const __be32 *dma_chan_p; + struct property *prop; + + if (dev->of_node) { + of_property_for_each_u32(dev->of_node, "dmas", prop, + dma_chan_p, dma_chan) { + if (i++ & 1) { + ctlr = EDMA_CTLR(dma_chan); + clear_bit(EDMA_CHAN_SLOT(dma_chan), + edma_cc[ctlr]->edma_unused); + } + } + return 0; + } - for (i = 0; i < pdev->num_resources; i++) { + /* For non-OF case */ + for (; i < pdev->num_resources; i++) { if ((pdev->resource[i].flags & IORESOURCE_DMA) && (int)pdev->resource[i].start >= 0) { ctlr = EDMA_CTLR(pdev->resource[i].start); clear_bit(EDMA_CHAN_SLOT(pdev->resource[i].start), - edma_cc[ctlr]->edma_unused); + edma_cc[ctlr]->edma_unused); } }