From patchwork Fri Mar 4 08:42:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zong Li X-Patchwork-Id: 12768783 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 45CFDC433EF for ; Fri, 4 Mar 2022 09:14:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=9N+fHU2Ze9hw5dXr/JX3ppnT6Itpp+BhG3wnyUjvwks=; b=3QMcmp7F1/9dB5 3AKrtNoWs3pfKVB9mw5EZ8bl/TtQQHpsbcl6SSt80vlUU+eLOKAOZTD+qUuUz9dD9V8YNIOizlbY0 i4F1d8MjAIcW5ROhwO9Yi3WR/QZvemXtFpgqYXv1Ots+A8qyRGhNVAY7F0MPQCIQvxADCEia2Or7g wo6Mu9W9lolH5qi1q9RLOisicSkpxjpHuMbuKeFw7cLrHefD5fK8ErtG0EML8VO4uhwomjpqwAmG4 AsojCscDeV5Fe1CCotslLhHxq5q6e3vfF57tmALsXCvy5+/9+OpzUY09520+RURor3943LllI9qQF 6pplRXCEKuqBd4DamLzg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nQ40V-009E48-O6; Fri, 04 Mar 2022 09:13:52 +0000 Received: from mail-pg1-x535.google.com ([2607:f8b0:4864:20::535]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nQ3Ws-0095zg-CI for linux-riscv@lists.infradead.org; Fri, 04 Mar 2022 08:43:16 +0000 Received: by mail-pg1-x535.google.com with SMTP id 132so6949917pga.5 for ; Fri, 04 Mar 2022 00:43:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SjzY9j/Keh5kcP1plUzMyATlCp3344jlI/9GvjcvYoo=; b=hJspy1/zqbuYIy7Y0JcXpLgEZ4LaeXRf1V/d38KWyaUJxyyIsgFJrTx+GbgWmAVdoM nSIZCT+jRFS4ipOU7erO7Dvrn8u7624EbHpI+KnD82BuAbScaajWmVpaCmCFyaQ+B7jI fT6+vcxHFNEHa1caSdXwzgOfeobfiVLFSQXwyMSUxpa+MIZhnOI2tiLeBQu4LB4hgrBW q4fpQzAbmpQFanBjQg3QSM5wLpx49uFzRH6JVZda6B0w2tP0Ga9WIG64eFB3ZFceNaYX 5pSSUZt6Yr3agxSoXN5ImRQs4jXC3AIILRyoSUyMseEUsPRZA+90V61UHGD/fw6zQf8T TI4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SjzY9j/Keh5kcP1plUzMyATlCp3344jlI/9GvjcvYoo=; b=rGN91b2U27fl/9sPgxRI75qFT7WUwxQMzHEPKlETHzZaWz2etUWgpp8L6rhUy+4MjD y9LY+rrdlOazaz+HRinUv99q+detjCbO7cGfki9BsM90jwqCpaefp/qRfNbu0/3Oq+K8 oOrCQj/GTQpb0JsWCiOinLxL594OmZa/eiozOVa3ZuieJbJiCTiVtcxyybGaOn9VxqLp C9bLJRg4D5ESoaWVbJUA+6QYNgbXJxN0to3/y0zZOjXvJpOprUMtwD0qTMKUGBvAZu4D OXa55RrQ10CO+A6ikr71K4/I0gzRKigRVm8EBTArB+0vGn0d53WzIl4Dca3N9o82g6P0 APTg== X-Gm-Message-State: AOAM531EKoqapiTXR1Nk/S8EFNKdXb77tfBp/9U5UXUvn0Ye7Oi2/iKm cCQ0UXJInCOT2cWKnn2pTitEGA== X-Google-Smtp-Source: ABdhPJxz6/k/qi7D2lE+uC+vHsr6OFEJAKnQEm3xgi1poTgu0ti/Snnmg4f5psDZA2jmuoST/mcY6A== X-Received: by 2002:a63:dc11:0:b0:37c:942d:cff0 with SMTP id s17-20020a63dc11000000b0037c942dcff0mr2170447pgg.484.1646383393169; Fri, 04 Mar 2022 00:43:13 -0800 (PST) Received: from hsinchu16.internal.sifive.com (59-124-168-89.hinet-ip.hinet.net. [59.124.168.89]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4245191pjb.14.2022.03.04.00.43.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Mar 2022 00:43:12 -0800 (PST) From: Zong Li To: robh+dt@kernel.org, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, krzysztof.kozlowski@canonical.com, conor.dooley@microchip.com, geert@linux-m68k.org, bin.meng@windriver.com, green.wan@sifive.com, vkoul@kernel.org, dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org Cc: Zong Li , Palmer Dabbelt Subject: [PATCH v6 3/3] dmaengine: sf-pdma: Get number of channel by device tree Date: Fri, 4 Mar 2022 16:42:57 +0800 Message-Id: <5d5bb0c13cee78210e4fd1ce80e23127304e1825.1646383150.git.zong.li@sifive.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220304_004314_463339_8D83C7F1 X-CRM114-Status: GOOD ( 19.23 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org It currently assumes that there are always four channels, it would cause the error if there is actually less than four channels. Change that by getting number of channel from device tree. For backwards-compatibility, it uses the default value (i.e. 4) when there is no 'dma-channels' information in dts. Signed-off-by: Zong Li Acked-by: Palmer Dabbelt --- drivers/dma/sf-pdma/sf-pdma.c | 24 ++++++++++++++++-------- drivers/dma/sf-pdma/sf-pdma.h | 8 ++------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/drivers/dma/sf-pdma/sf-pdma.c b/drivers/dma/sf-pdma/sf-pdma.c index f12606aeff87..db5a4ef76077 100644 --- a/drivers/dma/sf-pdma/sf-pdma.c +++ b/drivers/dma/sf-pdma/sf-pdma.c @@ -482,23 +482,30 @@ static void sf_pdma_setup_chans(struct sf_pdma *pdma) static int sf_pdma_probe(struct platform_device *pdev) { struct sf_pdma *pdma; - struct sf_pdma_chan *chan; struct resource *res; - int len, chans; - int ret; + int ret, n_chans; const enum dma_slave_buswidth widths = DMA_SLAVE_BUSWIDTH_1_BYTE | DMA_SLAVE_BUSWIDTH_2_BYTES | DMA_SLAVE_BUSWIDTH_4_BYTES | DMA_SLAVE_BUSWIDTH_8_BYTES | DMA_SLAVE_BUSWIDTH_16_BYTES | DMA_SLAVE_BUSWIDTH_32_BYTES | DMA_SLAVE_BUSWIDTH_64_BYTES; - chans = PDMA_NR_CH; - len = sizeof(*pdma) + sizeof(*chan) * chans; - pdma = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); + ret = of_property_read_u32(pdev->dev.of_node, "dma-channels", &n_chans); + if (ret) { + /* backwards-compatibility for no dma-channels property */ + dev_dbg(&pdev->dev, "set number of channels to default value: 4\n"); + n_chans = PDMA_MAX_NR_CH; + } else if (n_chans > PDMA_MAX_NR_CH) { + dev_err(&pdev->dev, "the number of channels exceeds the maximum\n"); + return -EINVAL; + } + + pdma = devm_kzalloc(&pdev->dev, struct_size(pdma, chans, n_chans), + GFP_KERNEL); if (!pdma) return -ENOMEM; - pdma->n_chans = chans; + pdma->n_chans = n_chans; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); pdma->membase = devm_ioremap_resource(&pdev->dev, res); @@ -556,7 +563,7 @@ static int sf_pdma_remove(struct platform_device *pdev) struct sf_pdma_chan *ch; int i; - for (i = 0; i < PDMA_NR_CH; i++) { + for (i = 0; i < pdma->n_chans; i++) { ch = &pdma->chans[i]; devm_free_irq(&pdev->dev, ch->txirq, ch); @@ -574,6 +581,7 @@ static int sf_pdma_remove(struct platform_device *pdev) static const struct of_device_id sf_pdma_dt_ids[] = { { .compatible = "sifive,fu540-c000-pdma" }, + { .compatible = "sifive,pdma0" }, {}, }; MODULE_DEVICE_TABLE(of, sf_pdma_dt_ids); diff --git a/drivers/dma/sf-pdma/sf-pdma.h b/drivers/dma/sf-pdma/sf-pdma.h index 0c20167b097d..dcb3687bd5da 100644 --- a/drivers/dma/sf-pdma/sf-pdma.h +++ b/drivers/dma/sf-pdma/sf-pdma.h @@ -22,11 +22,7 @@ #include "../dmaengine.h" #include "../virt-dma.h" -#define PDMA_NR_CH 4 - -#if (PDMA_NR_CH != 4) -#error "Please define PDMA_NR_CH to 4" -#endif +#define PDMA_MAX_NR_CH 4 #define PDMA_BASE_ADDR 0x3000000 #define PDMA_CHAN_OFFSET 0x1000 @@ -118,7 +114,7 @@ struct sf_pdma { void __iomem *membase; void __iomem *mappedbase; u32 n_chans; - struct sf_pdma_chan chans[PDMA_NR_CH]; + struct sf_pdma_chan chans[]; }; #endif /* _SF_PDMA_H */