Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp1098895imm; Tue, 3 Jul 2018 05:36:38 -0700 (PDT) X-Google-Smtp-Source: AAOMgpctRL6BRYwV8HCeJc7gquCsjdNNkLx5UJZLCptdZPD4kW3fLq5ey7128ZDKgFNvJ/k1LVVA X-Received: by 2002:a62:4c88:: with SMTP id e8-v6mr29212641pfj.99.1530621397949; Tue, 03 Jul 2018 05:36:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530621397; cv=none; d=google.com; s=arc-20160816; b=uTi2hUAz5U1vepGWRfpa/ho5k7BMkwAoLsnT322hK7mYsdEy/skeuE5MrqZYgGGDu/ kUspHYLOEnYX4/TYKQk6QE/4UxwTeiWrkf/HCcr1EU85j/zkM2e4fkr0MJ444V4MLwrN kY5pOQYoK53Un+Npx7/F9x9f57RLj0/4k0FXSkAnvRHxUnfXxv3eyA8mW24zl6F3U4JZ yOyRu1BAD9rolt2J6AkGy4NIeIe4XGy7xyomgU69Ctg+HjoGeLiT7rp2zvdeyfGg+12n GdYcz+QE3nqpl+5ElC+is3mb6BRO75U9of+rDzmx27dLz7SiPM5BHCr5HqoYRQ3dH4HI v7Pg== 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=sY12ch7weYIeAeEjKWN4RLjd/Bro4We1mVzZOTcwFe4=; b=C7N3SRpWTl72g1ZGs5SUz7zrAO+jOy31kHN9WKllffLr4jRMkO7OdLVREHWnbHTL39 kF5BJ569kEUZpVnzktkxNfu5IYuv9lcXT2970YMUnYB9PRhB8sa0kD461dGiEyQjM8R5 peIgJ7JLT8mtXtqlpmuQZywEO4nGSiZQIeTNj1q+xLHM5CCPAmQyn2buTlzTis3rIGQM 8VWnmdDAPRzIkuVGQ6AK5gDHthbYg8hkwVH1mlhlX8UAZYoWPRvTcmwBREdRbiLd81HK IpNulz1SmzuQM2DwUiUTpoRVBW+7gj584uKnQWpeg9udP756nTcS8wLfYcwZkK/pOH6A DBQw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=HalV4HI7; 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 n11-v6si967703pgu.649.2018.07.03.05.36.23; Tue, 03 Jul 2018 05:36:37 -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=HalV4HI7; 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 S1753274AbeGCMcc (ORCPT + 99 others); Tue, 3 Jul 2018 08:32:32 -0400 Received: from outils.crapouillou.net ([89.234.176.41]:45918 "EHLO crapouillou.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752730AbeGCMca (ORCPT ); Tue, 3 Jul 2018 08:32:30 -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 , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mips@linux-mips.org, Paul Cercueil Subject: [PATCH 01/14] dmaengine: dma-jz4780: Avoid hardcoding number of channels Date: Tue, 3 Jul 2018 14:32:01 +0200 Message-Id: <20180703123214.23090-2-paul@crapouillou.net> In-Reply-To: <20180703123214.23090-1-paul@crapouillou.net> References: <20180703123214.23090-1-paul@crapouillou.net> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=crapouillou.net; s=mail; t=1530621148; bh=sY12ch7weYIeAeEjKWN4RLjd/Bro4We1mVzZOTcwFe4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=HalV4HI7Lk9nE4e4xpR5YBkR/nc6Gdxx6VyKIuZr0YPVF2g1/3B7VPhhS3+IFf83HKTuojC2d0JLcfK+8MuPOLj246Ngdwb3rzP9qvSjqP/ywB0EL2Db8TQFXoTPoXjkCdt/vaDYpK2Bg/RCkC1il+7ieOt4AeEYxnlRSV5HGQw= 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 --- drivers/dma/dma-jz4780.c | 53 +++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/drivers/dma/dma-jz4780.c b/drivers/dma/dma-jz4780.c index 85820a2d69d4..b40f491f0367 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,20 @@ struct jz4780_dma_chan { unsigned int curr_hwdesc; }; +enum jz_version { + ID_JZ4780, +}; + struct jz4780_dma_dev { struct dma_device dma_device; void __iomem *base; struct clk *clk; unsigned int irq; + unsigned int nb_channels; + enum jz_version version; 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 +653,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->nb_channels; i++) { if (!(pending & (1<args[1]; if (data.channel > -1) { - if (data.channel >= JZ_DMA_NR_CHANNELS) { + if (data.channel >= jzdma->nb_channels) { dev_err(jzdma->dma_device.dev, "device requested non-existent channel %u\n", data.channel); @@ -752,19 +757,45 @@ static struct dma_chan *jz4780_of_dma_xlate(struct of_phandle_args *dma_spec, } } +static const unsigned int jz4780_dma_nb_channels[] = { + [ID_JZ4780] = 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); struct jz4780_dma_dev *jzdma; struct jz4780_dma_chan *jzchan; struct dma_device *dd; struct resource *res; + enum jz_version version; + unsigned int nb_channels; int i, ret; - jzdma = devm_kzalloc(dev, sizeof(*jzdma), GFP_KERNEL); + if (of_id) + version = (enum jz_version)of_id->data; + else + version = ID_JZ4780; /* Default when not probed from DT */ + + nb_channels = jz4780_dma_nb_channels[version]; + + jzdma = devm_kzalloc(dev, sizeof(*jzdma) + + sizeof(*jzdma->chan) * nb_channels, + GFP_KERNEL); if (!jzdma) return -ENOMEM; + jzdma->nb_channels = nb_channels; + jzdma->version = version; + platform_set_drvdata(pdev, jzdma); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -839,7 +870,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 < jzdma->nb_channels; i++) { jzchan = &jzdma->chan[i]; jzchan->id = i; @@ -884,19 +915,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->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.18.0