Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp4841025pxb; Mon, 28 Mar 2022 04:24:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyCHEoYt3WiiZpdSfC1iWbbEInu8Wow04Av6olTzrmwVXaXIZUfOLO1hJA14wgSIivB2s3V X-Received: by 2002:a05:622a:56:b0:2e1:aaa1:739a with SMTP id y22-20020a05622a005600b002e1aaa1739amr20701206qtw.210.1648466681735; Mon, 28 Mar 2022 04:24:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648466681; cv=none; d=google.com; s=arc-20160816; b=Y3P7/bLnHdEzxhQnHSdlssyUHrFLp6svCc0DGwTTvIUC5aKeS6cf3fxgUvtf0cN/if KyQYQmJ+aeNzlqnYlgY0emPXQx6CJUvGlfn4Q7KtVs9BNFqBdmn7MtBucCUMHBe586HA w44x/wLFX8kWwS8qHaMYxJWqUBbmI1JAGtDN+9NEujvnolNWPMWWPtqvM1oCoY9fMtux iwQtpI2bx3+VE18N+oSS/vmZeZVfirQecaLuUWMrtzsSMPk1WqMjBJGFkPkBuz/O4aLu hprb7jH4H5gzDl1iTzYRx1nxh/rfn+afGdIKaJXABSkGNNc6yp3kdPVuUq7SSdUUJTAy HQ1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=oFYJu8bdS9lTnagtGk2u5UISyqGssJEWeZR75J4CCQ4=; b=fI3F34i2lP37+8IvU+3MEuwbgDOdD3N7ab3qPFXnpH+yw0zNQRcZoSqWqhemDXy0fC RjES9VPAHsAkaZSIzrtZ5zHLKapgYVfxHpngAqfbdEZTTHOUCKyBJeJxBkos5Lcuwsvm JXXEe92JOrsWxhQ4CwvJOwIAU2JaW3Jk5g83ItcVsXe28ffK5EuW33YRYFSGZcg76CK9 Vs0hH+HvyBNHEdq/MtwlkX+bkWiDzLnKeqOnk7OEoBikKS2E/jMxHe1/JOKKXTV2nikF 7FkABbo3XzoF2eK9xJv6dVu0f/wil4j0j8ZbeIglehfmJluBw/qxE08fgOFoRj0VrI63 TpuA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sifive.com header.s=google header.b=GntnHgow; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ci16-20020a056214055000b004413ebcf3e8si6084001qvb.402.2022.03.28.04.23.54; Mon, 28 Mar 2022 04:24:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@sifive.com header.s=google header.b=GntnHgow; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240057AbiC1Jyb (ORCPT + 99 others); Mon, 28 Mar 2022 05:54:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59130 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240047AbiC1Jy2 (ORCPT ); Mon, 28 Mar 2022 05:54:28 -0400 Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4145154BF6 for ; Mon, 28 Mar 2022 02:52:47 -0700 (PDT) Received: by mail-pj1-x1031.google.com with SMTP id o3-20020a17090a3d4300b001c6bc749227so14939278pjf.1 for ; Mon, 28 Mar 2022 02:52:47 -0700 (PDT) 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=oFYJu8bdS9lTnagtGk2u5UISyqGssJEWeZR75J4CCQ4=; b=GntnHgow6kb2bhuinGrTFT6S/X9qym/s0sFSEUkJXDmNQl82e2NCI1Dma+l72P+0wm 9XMVcbHiRuxmvVtSPBZ7tQKj3M9CwbQN8u0YrhUHuwLJA0xwxOAP/iwP5HG2ieL5yBOB riyl5rYiqhApthbGtlZAOlL61VBJIcvqO1QaO37Z7lv9H4vxQ+xubqdQx26xXUVGFD8d gxMFYcwX+olVPgEM1Ntshiy1FnwUIwyiKDhK2pqaCM1mSHd6b1m0g9+oLCrcBHPeLggT +UMQ6lX6a6VxpFVHvdyINtwXFxyfB2gkIAq5wYTXNjWGzZ4XNOPo3g7YIa1sPy5P0hSU vILg== 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=oFYJu8bdS9lTnagtGk2u5UISyqGssJEWeZR75J4CCQ4=; b=hG164/NraizmBhrS9TrX9KOsU96Bvj3y9NvWwyzbAKRQsJ6UTQTJfJoQ5QoCS/9+w0 ABGt5jycjWf6vb4LVCt+0YF1S8cfqBuFP/0kZ5UK8iuV0nxVzgZMlNet6yGNfkY9kaQg IBu2ML4bbYvk0bS4jZh2ac5rlD2MfhjGliIWUgL+bKIuUYYragMlijicibLH+KVwWkKF 5zqkh7QbMSOuvWIXChnYo5ofHXdVkXOFy1UX4P11TJ4IaPO9zUdqIKi0an6qLQhWCsWO xA7ot8owQ/CNOH/1hNOe+6wPt5TqXBahHvWDrR+6y3JhCCe6/3CcgmDHfFAO90g7vngj a1Mw== X-Gm-Message-State: AOAM531XgKNOWaTIG+ExskkKtu1UQ4DgPqL+f6p2OK6EJ5O4d+a7HdCe +0r7F82prLtW16yUzW04LOqCPg== X-Received: by 2002:a17:90b:1c01:b0:1c6:dc49:d146 with SMTP id oc1-20020a17090b1c0100b001c6dc49d146mr39288419pjb.29.1648461166701; Mon, 28 Mar 2022 02:52:46 -0700 (PDT) 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 g4-20020a633744000000b00381efba48b0sm12255117pgn.44.2022.03.28.02.52.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Mar 2022 02:52:46 -0700 (PDT) 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 v8 4/4] dmaengine: sf-pdma: Get number of channel by device tree Date: Mon, 28 Mar 2022 17:52:25 +0800 Message-Id: X-Mailer: git-send-email 2.35.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.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 */ -- 2.35.1