Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp3824508imm; Sat, 21 Jul 2018 04:09:31 -0700 (PDT) X-Google-Smtp-Source: AAOMgpd3A+ohZ6DlO6u6nrTpUP5grVsMyxK49B+r7UFKtoPHVhitfgvFJBS3rlVqqMdWRzu4GwBH X-Received: by 2002:a63:f18:: with SMTP id e24-v6mr5343810pgl.320.1532171371600; Sat, 21 Jul 2018 04:09:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532171371; cv=none; d=google.com; s=arc-20160816; b=GriGNtktKgJn2bZYoTFenmftBhj5/3eSpKxu/T6Xnpj5UIostwiAxgF/wfrL9dqc8A WTovwoxTxsNTInhZx9RYclnwu7ZItfDqrCKn2wVHbFYlwNApAXFENcB55zk1b1gtuUBs NmpsgCIDeuyMe2qTMXLr3H+Rv+xYG4A4U2se0B7mBIHFjH/MLT5GIiNja0BO0fPtnWrI Yg4x7TQbymMqVrLiPjV49VYrhGG+O3qG8aS1jgeR8kF04R++BL9loCtQzJx8yhzpVKbO EcTg3LzKlkhZmsQ/bZdzjmM6bWujJ2YX+yDrBC2NfTXEM0b6g17RFLW+n+040cQWlbAJ eEVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:dkim-signature:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=hciIk9gID7aV0NKrxOVE+5rhlcyIEKEEoUFxhmnxPeE=; b=QnheY3Sld7G6fUPx7Nvw7/oAPhD/qnO91GjrnSbgJ2qMdoILWenqymmEuTuAfzHjht zCpLdT/dwOi+ui/oZtQQedoZ7+pgdgDyhNRDjSx2GUYE8Yb8lA5Rvx3mmUInOfHC6IJT 6p+7l5pFP7xSCKr72XGBDlR5HzVYBz23akqBR2cdHwCYM+Sy+sUNXaykXKwJ/uaVHLnt WguPyN1GD16Ph5XBHeLvscb1YpmPTb7ROQaBBxN8EETpR6JXoMirL6hpagQ+/KvTe5rW YyFpDpj79R3M5DDQHSFxQsZRrKOAgBBPmKkNMBzheiEnhYgsP3eMTmUoRnd5M244pX66 kyyw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=xYh5DBAc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x7-v6si3894915pgb.297.2018.07.21.04.09.04; Sat, 21 Jul 2018 04:09:31 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=xYh5DBAc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727960AbeGUMAC (ORCPT + 99 others); Sat, 21 Jul 2018 08:00:02 -0400 Received: from outils.crapouillou.net ([89.234.176.41]:42396 "EHLO crapouillou.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727754AbeGUMAC (ORCPT ); Sat, 21 Jul 2018 08:00:02 -0400 From: Paul Cercueil To: Vinod Koul , Rob Herring , Mark Rutland , Ralf Baechle , Paul Burton , James Hogan , Zubair Lutfullah Kakakhel Cc: Mathieu Malaterre , Daniel Silsby , Paul Cercueil , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mips@linux-mips.org Subject: [PATCH v3 03/18] dmaengine: dma-jz4780: Avoid hardcoding number of channels Date: Sat, 21 Jul 2018 13:06:28 +0200 Message-Id: <20180721110643.19624-4-paul@crapouillou.net> In-Reply-To: <20180721110643.19624-1-paul@crapouillou.net> References: <20180721110643.19624-1-paul@crapouillou.net> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=crapouillou.net; s=mail; t=1532171259; bh=hciIk9gID7aV0NKrxOVE+5rhlcyIEKEEoUFxhmnxPeE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=xYh5DBAciLnkPTh6BaumB2w+kO+cSeF798nZsTWU5SlqHEg3X3jYKMfMDVe2i2IJOM8vQI26VZSOSFyldgPGH26ENJIlluPtJzmWx9WkFYQmqd2kqsNpxyl/CWbItRV3HUyY7tEHdw0CujlqF8Q/E5Fx57N/vMhjMAGcDXSWP9s= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As part of the work to support various other Ingenic JZ47xx SoC versions, which don't feature the same number of DMA channels per core, we now deduce the number of DMA channels available from the devicetree compatible string. Signed-off-by: Paul Cercueil Tested-by: Mathieu Malaterre --- drivers/dma/dma-jz4780.c | 53 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 14 deletions(-) v2: - don't hardcode jz_version to ID_JZ4780 when not probed from DT, because it cannot happen - Put SoC-specific data into a jz4780_dma_soc_data structure v3: No change diff --git a/drivers/dma/dma-jz4780.c b/drivers/dma/dma-jz4780.c index 987899610b46..a26107c85ee7 100644 --- a/drivers/dma/dma-jz4780.c +++ b/drivers/dma/dma-jz4780.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -23,8 +24,6 @@ #include "dmaengine.h" #include "virt-dma.h" -#define JZ_DMA_NR_CHANNELS 32 - /* Global registers. */ #define JZ_DMA_REG_DMAC 0x1000 #define JZ_DMA_REG_DIRQP 0x1004 @@ -135,14 +134,24 @@ struct jz4780_dma_chan { unsigned int curr_hwdesc; }; +enum jz_version { + ID_JZ4780, +}; + +struct jz4780_dma_soc_data { + unsigned int nb_channels; +}; + struct jz4780_dma_dev { struct dma_device dma_device; void __iomem *base; struct clk *clk; unsigned int irq; + enum jz_version version; + const struct jz4780_dma_soc_data *soc_data; uint32_t chan_reserved; - struct jz4780_dma_chan chan[JZ_DMA_NR_CHANNELS]; + struct jz4780_dma_chan chan[]; }; struct jz4780_dma_filter_data { @@ -648,7 +657,7 @@ static irqreturn_t jz4780_dma_irq_handler(int irq, void *data) pending = jz4780_dma_readl(jzdma, JZ_DMA_REG_DIRQP); - for (i = 0; i < JZ_DMA_NR_CHANNELS; i++) { + for (i = 0; i < jzdma->soc_data->nb_channels; i++) { if (!(pending & (1<args[1]; if (data.channel > -1) { - if (data.channel >= JZ_DMA_NR_CHANNELS) { + if (data.channel >= jzdma->soc_data->nb_channels) { dev_err(jzdma->dma_device.dev, "device requested non-existent channel %u\n", data.channel); @@ -752,13 +761,27 @@ static struct dma_chan *jz4780_of_dma_xlate(struct of_phandle_args *dma_spec, } } +static const struct jz4780_dma_soc_data jz4780_dma_soc_data[] = { + [ID_JZ4780] = { .nb_channels = 32, }, +}; + +static const struct of_device_id jz4780_dma_dt_match[] = { + { .compatible = "ingenic,jz4780-dma", .data = (void *)ID_JZ4780 }, + {}, +}; +MODULE_DEVICE_TABLE(of, jz4780_dma_dt_match); + static int jz4780_dma_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; + const struct of_device_id *of_id = of_match_device( + jz4780_dma_dt_match, dev); + const struct jz4780_dma_soc_data *soc_data; struct jz4780_dma_dev *jzdma; struct jz4780_dma_chan *jzchan; struct dma_device *dd; struct resource *res; + enum jz_version version; int i, ret; if (!dev->of_node) { @@ -766,10 +789,18 @@ static int jz4780_dma_probe(struct platform_device *pdev) return -EINVAL; } - jzdma = devm_kzalloc(dev, sizeof(*jzdma), GFP_KERNEL); + version = (enum jz_version)of_id->data; + soc_data = &jz4780_dma_soc_data[version]; + + jzdma = devm_kzalloc(dev, sizeof(*jzdma) + + sizeof(*jzdma->chan) * soc_data->nb_channels, + GFP_KERNEL); if (!jzdma) return -ENOMEM; + jzdma->soc_data = soc_data; + jzdma->version = version; + platform_set_drvdata(pdev, jzdma); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -844,7 +875,7 @@ static int jz4780_dma_probe(struct platform_device *pdev) INIT_LIST_HEAD(&dd->channels); - for (i = 0; i < JZ_DMA_NR_CHANNELS; i++) { + for (i = 0; i < soc_data->nb_channels; i++) { jzchan = &jzdma->chan[i]; jzchan->id = i; @@ -889,19 +920,13 @@ static int jz4780_dma_remove(struct platform_device *pdev) free_irq(jzdma->irq, jzdma); - for (i = 0; i < JZ_DMA_NR_CHANNELS; i++) + for (i = 0; i < jzdma->soc_data->nb_channels; i++) tasklet_kill(&jzdma->chan[i].vchan.task); dma_async_device_unregister(&jzdma->dma_device); return 0; } -static const struct of_device_id jz4780_dma_dt_match[] = { - { .compatible = "ingenic,jz4780-dma", .data = NULL }, - {}, -}; -MODULE_DEVICE_TABLE(of, jz4780_dma_dt_match); - static struct platform_driver jz4780_dma_driver = { .probe = jz4780_dma_probe, .remove = jz4780_dma_remove, -- 2.11.0