Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp3824511imm; Sat, 21 Jul 2018 04:09:31 -0700 (PDT) X-Google-Smtp-Source: AAOMgpd1j59WJ/4NwfcImOqwCb7v0ug17XYFAX57CWONQakuoF8RTlUoKO0yyOlgL2SHjDkl4POs X-Received: by 2002:a62:9d14:: with SMTP id i20-v6mr5702615pfd.3.1532171371612; 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=LJjU+GMPD3ge4R8niYcPBeeUmXmh9uefo3dy2jTAV+1wTI3XIxctj7AL9M/1uV4Kla Dba/jJZsiEYw1hq8lc4Jxuo840XlVo/JALNFJ1qNoD+Krdt2jF+tsLXN71MbEM9eJTjK 8evarlkfTLHCuq41nerGoVgwYZNA/8UstJmFoasw0SpdZ/sNy2KoDPuO3R8ebVaL6oSL kC8fl7kCA+Oe3gjpEy8rQQym+W4e8TfIiQ0y537XLep9x86h4yHoiePzceSzh5TMyk7Q vDnfMAZXivwyglLl1cPa9URHCExie4oEQGCj9Dwaq+KkvHbM1Wg6wn13mZk/lZNFDg+H GkcQ== 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=kOb8RxLLNADSsNXCjpWqD74EsT1CVpZoNcy5OVK6ryw=; b=Ts4bkLCFYK1G0mPn5RqCOBf6AaiBM8XnKcTMD6HYopCq512qtHT5N2ZozdqsgA2uhy 0nv9wtSgf9f0AE8+RX14K5g9048zdD82/TiUVlitmoHvJtTPTvHiy74HvW6pdf6+Og3u pIlm3fvYuDCTTuKxSCYPw0IPt1TwjXO2u0Jg6e0FqrlfRbs3nimOebOiMBgBjw/YNUYi t5mZKcal7ONEqIv2UBYmBVL6ej60lqHt653uKlnkkvxzXFbR4eGkIPNb1Xerk8n2BgvR 7DnJxGkUuvk67vfZw0m0mqqM89e58G0QKvf4gpDQFKbKfrdRM3kLz1NpFyQb0B6/7sw+ J9RQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=N2xwE+fI; 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 1-v6si3789039plq.91.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=N2xwE+fI; 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 S1728208AbeGUMAH (ORCPT + 99 others); Sat, 21 Jul 2018 08:00:07 -0400 Received: from outils.crapouillou.net ([89.234.176.41]:42788 "EHLO crapouillou.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727500AbeGUMAH (ORCPT ); Sat, 21 Jul 2018 08:00:07 -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 07/18] dmaengine: dma-jz4780: Add support for the JZ4770 SoC Date: Sat, 21 Jul 2018 13:06:32 +0200 Message-Id: <20180721110643.19624-8-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=1532171265; bh=kOb8RxLLNADSsNXCjpWqD74EsT1CVpZoNcy5OVK6ryw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=N2xwE+fIs7nE7r5zmNvNpdiW7KaBuxsIdrSGHcAi1A/OPTBHq3AglFwTKU2+bimu2HZhBzRLXKKdbG6MCoOCqrGiD9S/4Q0tJJLAgRSykjc9XeDLY3f40l8OomaG0Xd78sOwzeQ8xcUIME2HIoMpPuuJLXZMPP2p4pH8nBM2WDs= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The JZ4770 SoC has two DMA cores, each one featuring six DMA channels. The major change is that each channel's clock can be enabled or disabled through register writes. Signed-off-by: Paul Cercueil Tested-by: Mathieu Malaterre --- drivers/dma/dma-jz4780.c | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) v2: - Move transfer_ord_max variable to the new jz4780_dma_soc_data structure - The documentation update is now in patch 01/17 v3: The Kconfig update was dropped thanks to patch 06/18 diff --git a/drivers/dma/dma-jz4780.c b/drivers/dma/dma-jz4780.c index 23e92d153919..a5f4a8d54516 100644 --- a/drivers/dma/dma-jz4780.c +++ b/drivers/dma/dma-jz4780.c @@ -29,6 +29,9 @@ #define JZ_DMA_REG_DIRQP 0x04 #define JZ_DMA_REG_DDR 0x08 #define JZ_DMA_REG_DDRS 0x0c +#define JZ_DMA_REG_DCKE 0x10 +#define JZ_DMA_REG_DCKES 0x14 +#define JZ_DMA_REG_DCKEC 0x18 #define JZ_DMA_REG_DMACP 0x1c #define JZ_DMA_REG_DSIRQP 0x20 #define JZ_DMA_REG_DSIRQM 0x24 @@ -132,11 +135,13 @@ struct jz4780_dma_chan { }; enum jz_version { + ID_JZ4770, ID_JZ4780, }; struct jz4780_dma_soc_data { unsigned int nb_channels; + unsigned int transfer_ord_max; }; struct jz4780_dma_dev { @@ -200,6 +205,20 @@ static inline void jz4780_dma_ctrl_writel(struct jz4780_dma_dev *jzdma, writel(val, jzdma->ctrl_base + reg); } +static inline void jz4780_dma_chan_enable(struct jz4780_dma_dev *jzdma, + unsigned int chn) +{ + if (jzdma->version == ID_JZ4770) + jz4780_dma_ctrl_writel(jzdma, JZ_DMA_REG_DCKES, BIT(chn)); +} + +static inline void jz4780_dma_chan_disable(struct jz4780_dma_dev *jzdma, + unsigned int chn) +{ + if (jzdma->version == ID_JZ4770) + jz4780_dma_ctrl_writel(jzdma, JZ_DMA_REG_DCKEC, BIT(chn)); +} + static struct jz4780_dma_desc *jz4780_dma_desc_alloc( struct jz4780_dma_chan *jzchan, unsigned int count, enum dma_transaction_type type) @@ -234,8 +253,10 @@ static void jz4780_dma_desc_free(struct virt_dma_desc *vdesc) kfree(desc); } -static uint32_t jz4780_dma_transfer_size(unsigned long val, uint32_t *shift) +static uint32_t jz4780_dma_transfer_size(struct jz4780_dma_chan *jzchan, + unsigned long val, uint32_t *shift) { + struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); int ord = ffs(val) - 1; /* @@ -247,8 +268,8 @@ static uint32_t jz4780_dma_transfer_size(unsigned long val, uint32_t *shift) */ if (ord == 3) ord = 2; - else if (ord > 7) - ord = 7; + else if (ord > jzdma->soc_data->transfer_ord_max) + ord = jzdma->soc_data->transfer_ord_max; *shift = ord; @@ -300,7 +321,7 @@ static int jz4780_dma_setup_hwdesc(struct jz4780_dma_chan *jzchan, * divisible by the transfer size, and we must not use more than the * maximum burst specified by the user. */ - tsz = jz4780_dma_transfer_size(addr | len | (width * maxburst), + tsz = jz4780_dma_transfer_size(jzchan, addr | len | (width * maxburst), &jzchan->transfer_shift); switch (width) { @@ -429,7 +450,7 @@ static struct dma_async_tx_descriptor *jz4780_dma_prep_dma_memcpy( if (!desc) return NULL; - tsz = jz4780_dma_transfer_size(dest | src | len, + tsz = jz4780_dma_transfer_size(jzchan, dest | src | len, &jzchan->transfer_shift); jzchan->transfer_type = JZ_DMA_DRT_AUTO; @@ -490,6 +511,9 @@ static void jz4780_dma_begin(struct jz4780_dma_chan *jzchan) (jzchan->curr_hwdesc + 1) % jzchan->desc->count; } + /* Enable the channel's clock. */ + jz4780_dma_chan_enable(jzdma, jzchan->id); + /* Use 4-word descriptors. */ jz4780_dma_chn_writel(jzdma, jzchan->id, JZ_DMA_REG_DCS, 0); @@ -537,6 +561,8 @@ static int jz4780_dma_terminate_all(struct dma_chan *chan) jzchan->desc = NULL; } + jz4780_dma_chan_disable(jzdma, jzchan->id); + vchan_get_all_descriptors(&jzchan->vchan, &head); spin_unlock_irqrestore(&jzchan->vchan.lock, flags); @@ -548,8 +574,10 @@ static int jz4780_dma_terminate_all(struct dma_chan *chan) static void jz4780_dma_synchronize(struct dma_chan *chan) { struct jz4780_dma_chan *jzchan = to_jz4780_dma_chan(chan); + struct jz4780_dma_dev *jzdma = jz4780_dma_chan_parent(jzchan); vchan_synchronize(&jzchan->vchan); + jz4780_dma_chan_disable(jzdma, jzchan->id); } static int jz4780_dma_config(struct dma_chan *chan, @@ -775,10 +803,12 @@ 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, }, + [ID_JZ4770] = { .nb_channels = 6, .transfer_ord_max = 6, }, + [ID_JZ4780] = { .nb_channels = 32, .transfer_ord_max = 7, }, }; static const struct of_device_id jz4780_dma_dt_match[] = { + { .compatible = "ingenic,jz4770-dma", .data = (void *)ID_JZ4770 }, { .compatible = "ingenic,jz4780-dma", .data = (void *)ID_JZ4780 }, {}, }; @@ -901,7 +931,9 @@ static int jz4780_dma_probe(struct platform_device *pdev) */ jz4780_dma_ctrl_writel(jzdma, JZ_DMA_REG_DMAC, JZ_DMA_DMAC_DMAE | JZ_DMA_DMAC_FMSC); - jz4780_dma_ctrl_writel(jzdma, JZ_DMA_REG_DMACP, 0); + + if (jzdma->version == ID_JZ4780) + jz4780_dma_ctrl_writel(jzdma, JZ_DMA_REG_DMACP, 0); INIT_LIST_HEAD(&dd->channels); -- 2.11.0