xref: /openbmc/linux/drivers/dma/sh/rz-dmac.c (revision d1e71a3a7ab9db0168b6885171e0576383216ac8)
15000d370SBiju Das // SPDX-License-Identifier: GPL-2.0
25000d370SBiju Das /*
35000d370SBiju Das  * Renesas RZ/G2L DMA Controller Driver
45000d370SBiju Das  *
55000d370SBiju Das  * Based on imx-dma.c
65000d370SBiju Das  *
75000d370SBiju Das  * Copyright (C) 2021 Renesas Electronics Corp.
85000d370SBiju Das  * Copyright 2010 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>
95000d370SBiju Das  * Copyright 2012 Javier Martin, Vista Silicon <javier.martin@vista-silicon.com>
105000d370SBiju Das  */
115000d370SBiju Das 
125000d370SBiju Das #include <linux/dma-mapping.h>
135000d370SBiju Das #include <linux/dmaengine.h>
145000d370SBiju Das #include <linux/interrupt.h>
157d3a3aaaSBiju Das #include <linux/iopoll.h>
165000d370SBiju Das #include <linux/list.h>
175000d370SBiju Das #include <linux/module.h>
185000d370SBiju Das #include <linux/of.h>
195000d370SBiju Das #include <linux/of_dma.h>
205000d370SBiju Das #include <linux/of_platform.h>
215000d370SBiju Das #include <linux/platform_device.h>
22161596fdSBiju Das #include <linux/pm_runtime.h>
23*d1e71a3aSBiju Das #include <linux/reset.h>
245000d370SBiju Das #include <linux/slab.h>
255000d370SBiju Das #include <linux/spinlock.h>
265000d370SBiju Das 
275000d370SBiju Das #include "../dmaengine.h"
285000d370SBiju Das #include "../virt-dma.h"
295000d370SBiju Das 
305000d370SBiju Das enum  rz_dmac_prep_type {
315000d370SBiju Das 	RZ_DMAC_DESC_MEMCPY,
325000d370SBiju Das 	RZ_DMAC_DESC_SLAVE_SG,
335000d370SBiju Das };
345000d370SBiju Das 
355000d370SBiju Das struct rz_lmdesc {
365000d370SBiju Das 	u32 header;
375000d370SBiju Das 	u32 sa;
385000d370SBiju Das 	u32 da;
395000d370SBiju Das 	u32 tb;
405000d370SBiju Das 	u32 chcfg;
415000d370SBiju Das 	u32 chitvl;
425000d370SBiju Das 	u32 chext;
435000d370SBiju Das 	u32 nxla;
445000d370SBiju Das };
455000d370SBiju Das 
465000d370SBiju Das struct rz_dmac_desc {
475000d370SBiju Das 	struct virt_dma_desc vd;
485000d370SBiju Das 	dma_addr_t src;
495000d370SBiju Das 	dma_addr_t dest;
505000d370SBiju Das 	size_t len;
515000d370SBiju Das 	struct list_head node;
525000d370SBiju Das 	enum dma_transfer_direction direction;
535000d370SBiju Das 	enum rz_dmac_prep_type type;
545000d370SBiju Das 	/* For slave sg */
555000d370SBiju Das 	struct scatterlist *sg;
565000d370SBiju Das 	unsigned int sgcount;
575000d370SBiju Das };
585000d370SBiju Das 
595000d370SBiju Das #define to_rz_dmac_desc(d)	container_of(d, struct rz_dmac_desc, vd)
605000d370SBiju Das 
615000d370SBiju Das struct rz_dmac_chan {
625000d370SBiju Das 	struct virt_dma_chan vc;
635000d370SBiju Das 	void __iomem *ch_base;
645000d370SBiju Das 	void __iomem *ch_cmn_base;
655000d370SBiju Das 	unsigned int index;
665000d370SBiju Das 	int irq;
675000d370SBiju Das 	struct rz_dmac_desc *desc;
685000d370SBiju Das 	int descs_allocated;
695000d370SBiju Das 
705000d370SBiju Das 	enum dma_slave_buswidth src_word_size;
715000d370SBiju Das 	enum dma_slave_buswidth dst_word_size;
725000d370SBiju Das 	dma_addr_t src_per_address;
735000d370SBiju Das 	dma_addr_t dst_per_address;
745000d370SBiju Das 
755000d370SBiju Das 	u32 chcfg;
765000d370SBiju Das 	u32 chctrl;
775000d370SBiju Das 	int mid_rid;
785000d370SBiju Das 
795000d370SBiju Das 	struct list_head ld_free;
805000d370SBiju Das 	struct list_head ld_queue;
815000d370SBiju Das 	struct list_head ld_active;
825000d370SBiju Das 
835000d370SBiju Das 	struct {
845000d370SBiju Das 		struct rz_lmdesc *base;
855000d370SBiju Das 		struct rz_lmdesc *head;
865000d370SBiju Das 		struct rz_lmdesc *tail;
875000d370SBiju Das 		dma_addr_t base_dma;
885000d370SBiju Das 	} lmdesc;
895000d370SBiju Das };
905000d370SBiju Das 
915000d370SBiju Das #define to_rz_dmac_chan(c)	container_of(c, struct rz_dmac_chan, vc.chan)
925000d370SBiju Das 
935000d370SBiju Das struct rz_dmac {
945000d370SBiju Das 	struct dma_device engine;
955000d370SBiju Das 	struct device *dev;
96*d1e71a3aSBiju Das 	struct reset_control *rstc;
975000d370SBiju Das 	void __iomem *base;
985000d370SBiju Das 	void __iomem *ext_base;
995000d370SBiju Das 
1005000d370SBiju Das 	unsigned int n_channels;
1015000d370SBiju Das 	struct rz_dmac_chan *channels;
1025000d370SBiju Das 
1035000d370SBiju Das 	DECLARE_BITMAP(modules, 1024);
1045000d370SBiju Das };
1055000d370SBiju Das 
1065000d370SBiju Das #define to_rz_dmac(d)	container_of(d, struct rz_dmac, engine)
1075000d370SBiju Das 
1085000d370SBiju Das /*
1095000d370SBiju Das  * -----------------------------------------------------------------------------
1105000d370SBiju Das  * Registers
1115000d370SBiju Das  */
1125000d370SBiju Das 
1135000d370SBiju Das #define CHSTAT				0x0024
1145000d370SBiju Das #define CHCTRL				0x0028
1155000d370SBiju Das #define CHCFG				0x002c
1165000d370SBiju Das #define NXLA				0x0038
1175000d370SBiju Das 
1185000d370SBiju Das #define DCTRL				0x0000
1195000d370SBiju Das 
1205000d370SBiju Das #define EACH_CHANNEL_OFFSET		0x0040
1215000d370SBiju Das #define CHANNEL_0_7_OFFSET		0x0000
1225000d370SBiju Das #define CHANNEL_0_7_COMMON_BASE		0x0300
1235000d370SBiju Das #define CHANNEL_8_15_OFFSET		0x0400
1245000d370SBiju Das #define CHANNEL_8_15_COMMON_BASE	0x0700
1255000d370SBiju Das 
1265000d370SBiju Das #define CHSTAT_ER			BIT(4)
1275000d370SBiju Das #define CHSTAT_EN			BIT(0)
1285000d370SBiju Das 
1295000d370SBiju Das #define CHCTRL_CLRINTMSK		BIT(17)
1305000d370SBiju Das #define CHCTRL_CLRSUS			BIT(9)
1315000d370SBiju Das #define CHCTRL_CLRTC			BIT(6)
1325000d370SBiju Das #define CHCTRL_CLREND			BIT(5)
1335000d370SBiju Das #define CHCTRL_CLRRQ			BIT(4)
1345000d370SBiju Das #define CHCTRL_SWRST			BIT(3)
1355000d370SBiju Das #define CHCTRL_STG			BIT(2)
1365000d370SBiju Das #define CHCTRL_CLREN			BIT(1)
1375000d370SBiju Das #define CHCTRL_SETEN			BIT(0)
1385000d370SBiju Das #define CHCTRL_DEFAULT			(CHCTRL_CLRINTMSK | CHCTRL_CLRSUS | \
1395000d370SBiju Das 					 CHCTRL_CLRTC |	CHCTRL_CLREND | \
1405000d370SBiju Das 					 CHCTRL_CLRRQ | CHCTRL_SWRST | \
1415000d370SBiju Das 					 CHCTRL_CLREN)
1425000d370SBiju Das 
1435000d370SBiju Das #define CHCFG_DMS			BIT(31)
1445000d370SBiju Das #define CHCFG_DEM			BIT(24)
1455000d370SBiju Das #define CHCFG_DAD			BIT(21)
1465000d370SBiju Das #define CHCFG_SAD			BIT(20)
1475000d370SBiju Das #define CHCFG_REQD			BIT(3)
1485000d370SBiju Das #define CHCFG_SEL(bits)			((bits) & 0x07)
1495000d370SBiju Das #define CHCFG_MEM_COPY			(0x80400008)
1505000d370SBiju Das #define CHCFG_FILL_DDS(a)		(((a) << 16) & GENMASK(19, 16))
1515000d370SBiju Das #define CHCFG_FILL_SDS(a)		(((a) << 12) & GENMASK(15, 12))
1525000d370SBiju Das #define CHCFG_FILL_TM(a)		(((a) & BIT(5)) << 22)
1535000d370SBiju Das #define CHCFG_FILL_AM(a)		(((a) & GENMASK(4, 2)) << 6)
1545000d370SBiju Das #define CHCFG_FILL_LVL(a)		(((a) & BIT(1)) << 5)
1555000d370SBiju Das #define CHCFG_FILL_HIEN(a)		(((a) & BIT(0)) << 5)
1565000d370SBiju Das 
1575000d370SBiju Das #define MID_RID_MASK			GENMASK(9, 0)
1585000d370SBiju Das #define CHCFG_MASK			GENMASK(15, 10)
1595000d370SBiju Das #define CHCFG_DS_INVALID		0xFF
1605000d370SBiju Das #define DCTRL_LVINT			BIT(1)
1615000d370SBiju Das #define DCTRL_PR			BIT(0)
1625000d370SBiju Das #define DCTRL_DEFAULT			(DCTRL_LVINT | DCTRL_PR)
1635000d370SBiju Das 
1645000d370SBiju Das /* LINK MODE DESCRIPTOR */
1655000d370SBiju Das #define HEADER_LV			BIT(0)
1665000d370SBiju Das 
1675000d370SBiju Das #define RZ_DMAC_MAX_CHAN_DESCRIPTORS	16
1685000d370SBiju Das #define RZ_DMAC_MAX_CHANNELS		16
1695000d370SBiju Das #define DMAC_NR_LMDESC			64
1705000d370SBiju Das 
1715000d370SBiju Das /*
1725000d370SBiju Das  * -----------------------------------------------------------------------------
1735000d370SBiju Das  * Device access
1745000d370SBiju Das  */
1755000d370SBiju Das 
1765000d370SBiju Das static void rz_dmac_writel(struct rz_dmac *dmac, unsigned int val,
1775000d370SBiju Das 			   unsigned int offset)
1785000d370SBiju Das {
1795000d370SBiju Das 	writel(val, dmac->base + offset);
1805000d370SBiju Das }
1815000d370SBiju Das 
1825000d370SBiju Das static void rz_dmac_ext_writel(struct rz_dmac *dmac, unsigned int val,
1835000d370SBiju Das 			       unsigned int offset)
1845000d370SBiju Das {
1855000d370SBiju Das 	writel(val, dmac->ext_base + offset);
1865000d370SBiju Das }
1875000d370SBiju Das 
1885000d370SBiju Das static u32 rz_dmac_ext_readl(struct rz_dmac *dmac, unsigned int offset)
1895000d370SBiju Das {
1905000d370SBiju Das 	return readl(dmac->ext_base + offset);
1915000d370SBiju Das }
1925000d370SBiju Das 
1935000d370SBiju Das static void rz_dmac_ch_writel(struct rz_dmac_chan *channel, unsigned int val,
1945000d370SBiju Das 			      unsigned int offset, int which)
1955000d370SBiju Das {
1965000d370SBiju Das 	if (which)
1975000d370SBiju Das 		writel(val, channel->ch_base + offset);
1985000d370SBiju Das 	else
1995000d370SBiju Das 		writel(val, channel->ch_cmn_base + offset);
2005000d370SBiju Das }
2015000d370SBiju Das 
2025000d370SBiju Das static u32 rz_dmac_ch_readl(struct rz_dmac_chan *channel,
2035000d370SBiju Das 			    unsigned int offset, int which)
2045000d370SBiju Das {
2055000d370SBiju Das 	if (which)
2065000d370SBiju Das 		return readl(channel->ch_base + offset);
2075000d370SBiju Das 	else
2085000d370SBiju Das 		return readl(channel->ch_cmn_base + offset);
2095000d370SBiju Das }
2105000d370SBiju Das 
2115000d370SBiju Das /*
2125000d370SBiju Das  * -----------------------------------------------------------------------------
2135000d370SBiju Das  * Initialization
2145000d370SBiju Das  */
2155000d370SBiju Das 
2165000d370SBiju Das static void rz_lmdesc_setup(struct rz_dmac_chan *channel,
2175000d370SBiju Das 			    struct rz_lmdesc *lmdesc)
2185000d370SBiju Das {
2195000d370SBiju Das 	u32 nxla;
2205000d370SBiju Das 
2215000d370SBiju Das 	channel->lmdesc.base = lmdesc;
2225000d370SBiju Das 	channel->lmdesc.head = lmdesc;
2235000d370SBiju Das 	channel->lmdesc.tail = lmdesc;
2245000d370SBiju Das 	nxla = channel->lmdesc.base_dma;
2255000d370SBiju Das 	while (lmdesc < (channel->lmdesc.base + (DMAC_NR_LMDESC - 1))) {
2265000d370SBiju Das 		lmdesc->header = 0;
2275000d370SBiju Das 		nxla += sizeof(*lmdesc);
2285000d370SBiju Das 		lmdesc->nxla = nxla;
2295000d370SBiju Das 		lmdesc++;
2305000d370SBiju Das 	}
2315000d370SBiju Das 
2325000d370SBiju Das 	lmdesc->header = 0;
2335000d370SBiju Das 	lmdesc->nxla = channel->lmdesc.base_dma;
2345000d370SBiju Das }
2355000d370SBiju Das 
2365000d370SBiju Das /*
2375000d370SBiju Das  * -----------------------------------------------------------------------------
2385000d370SBiju Das  * Descriptors preparation
2395000d370SBiju Das  */
2405000d370SBiju Das 
2415000d370SBiju Das static void rz_dmac_lmdesc_recycle(struct rz_dmac_chan *channel)
2425000d370SBiju Das {
2435000d370SBiju Das 	struct rz_lmdesc *lmdesc = channel->lmdesc.head;
2445000d370SBiju Das 
2455000d370SBiju Das 	while (!(lmdesc->header & HEADER_LV)) {
2465000d370SBiju Das 		lmdesc->header = 0;
2475000d370SBiju Das 		lmdesc++;
2485000d370SBiju Das 		if (lmdesc >= (channel->lmdesc.base + DMAC_NR_LMDESC))
2495000d370SBiju Das 			lmdesc = channel->lmdesc.base;
2505000d370SBiju Das 	}
2515000d370SBiju Das 	channel->lmdesc.head = lmdesc;
2525000d370SBiju Das }
2535000d370SBiju Das 
2545000d370SBiju Das static void rz_dmac_enable_hw(struct rz_dmac_chan *channel)
2555000d370SBiju Das {
2565000d370SBiju Das 	struct dma_chan *chan = &channel->vc.chan;
2575000d370SBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
2585000d370SBiju Das 	unsigned long flags;
2595000d370SBiju Das 	u32 nxla;
2605000d370SBiju Das 	u32 chctrl;
2615000d370SBiju Das 	u32 chstat;
2625000d370SBiju Das 
2635000d370SBiju Das 	dev_dbg(dmac->dev, "%s channel %d\n", __func__, channel->index);
2645000d370SBiju Das 
2655000d370SBiju Das 	local_irq_save(flags);
2665000d370SBiju Das 
2675000d370SBiju Das 	rz_dmac_lmdesc_recycle(channel);
2685000d370SBiju Das 
2695000d370SBiju Das 	nxla = channel->lmdesc.base_dma +
2705000d370SBiju Das 		(sizeof(struct rz_lmdesc) * (channel->lmdesc.head -
2715000d370SBiju Das 					     channel->lmdesc.base));
2725000d370SBiju Das 
2735000d370SBiju Das 	chstat = rz_dmac_ch_readl(channel, CHSTAT, 1);
2745000d370SBiju Das 	if (!(chstat & CHSTAT_EN)) {
2755000d370SBiju Das 		chctrl = (channel->chctrl | CHCTRL_SETEN);
2765000d370SBiju Das 		rz_dmac_ch_writel(channel, nxla, NXLA, 1);
2775000d370SBiju Das 		rz_dmac_ch_writel(channel, channel->chcfg, CHCFG, 1);
2785000d370SBiju Das 		rz_dmac_ch_writel(channel, CHCTRL_SWRST, CHCTRL, 1);
2795000d370SBiju Das 		rz_dmac_ch_writel(channel, chctrl, CHCTRL, 1);
2805000d370SBiju Das 	}
2815000d370SBiju Das 
2825000d370SBiju Das 	local_irq_restore(flags);
2835000d370SBiju Das }
2845000d370SBiju Das 
2855000d370SBiju Das static void rz_dmac_disable_hw(struct rz_dmac_chan *channel)
2865000d370SBiju Das {
2875000d370SBiju Das 	struct dma_chan *chan = &channel->vc.chan;
2885000d370SBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
2895000d370SBiju Das 	unsigned long flags;
2905000d370SBiju Das 
2915000d370SBiju Das 	dev_dbg(dmac->dev, "%s channel %d\n", __func__, channel->index);
2925000d370SBiju Das 
2935000d370SBiju Das 	local_irq_save(flags);
2945000d370SBiju Das 	rz_dmac_ch_writel(channel, CHCTRL_DEFAULT, CHCTRL, 1);
2955000d370SBiju Das 	local_irq_restore(flags);
2965000d370SBiju Das }
2975000d370SBiju Das 
2985000d370SBiju Das static void rz_dmac_set_dmars_register(struct rz_dmac *dmac, int nr, u32 dmars)
2995000d370SBiju Das {
3005000d370SBiju Das 	u32 dmars_offset = (nr / 2) * 4;
3015000d370SBiju Das 	u32 shift = (nr % 2) * 16;
3025000d370SBiju Das 	u32 dmars32;
3035000d370SBiju Das 
3045000d370SBiju Das 	dmars32 = rz_dmac_ext_readl(dmac, dmars_offset);
3055000d370SBiju Das 	dmars32 &= ~(0xffff << shift);
3065000d370SBiju Das 	dmars32 |= dmars << shift;
3075000d370SBiju Das 
3085000d370SBiju Das 	rz_dmac_ext_writel(dmac, dmars32, dmars_offset);
3095000d370SBiju Das }
3105000d370SBiju Das 
3115000d370SBiju Das static void rz_dmac_prepare_desc_for_memcpy(struct rz_dmac_chan *channel)
3125000d370SBiju Das {
3135000d370SBiju Das 	struct dma_chan *chan = &channel->vc.chan;
3145000d370SBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
3151e008336SColin Ian King 	struct rz_lmdesc *lmdesc = channel->lmdesc.tail;
3165000d370SBiju Das 	struct rz_dmac_desc *d = channel->desc;
3175000d370SBiju Das 	u32 chcfg = CHCFG_MEM_COPY;
3185000d370SBiju Das 
3195000d370SBiju Das 	/* prepare descriptor */
3205000d370SBiju Das 	lmdesc->sa = d->src;
3215000d370SBiju Das 	lmdesc->da = d->dest;
3225000d370SBiju Das 	lmdesc->tb = d->len;
3235000d370SBiju Das 	lmdesc->chcfg = chcfg;
3245000d370SBiju Das 	lmdesc->chitvl = 0;
3255000d370SBiju Das 	lmdesc->chext = 0;
3265000d370SBiju Das 	lmdesc->header = HEADER_LV;
3275000d370SBiju Das 
3285000d370SBiju Das 	rz_dmac_set_dmars_register(dmac, channel->index, 0);
3295000d370SBiju Das 
3305000d370SBiju Das 	channel->chcfg = chcfg;
3315000d370SBiju Das 	channel->chctrl = CHCTRL_STG | CHCTRL_SETEN;
3325000d370SBiju Das }
3335000d370SBiju Das 
3345000d370SBiju Das static void rz_dmac_prepare_descs_for_slave_sg(struct rz_dmac_chan *channel)
3355000d370SBiju Das {
3365000d370SBiju Das 	struct dma_chan *chan = &channel->vc.chan;
3375000d370SBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
3385000d370SBiju Das 	struct rz_dmac_desc *d = channel->desc;
3395000d370SBiju Das 	struct scatterlist *sg, *sgl = d->sg;
3405000d370SBiju Das 	struct rz_lmdesc *lmdesc;
3415000d370SBiju Das 	unsigned int i, sg_len = d->sgcount;
3425000d370SBiju Das 
3435000d370SBiju Das 	channel->chcfg |= CHCFG_SEL(channel->index) | CHCFG_DEM | CHCFG_DMS;
3445000d370SBiju Das 
3455000d370SBiju Das 	if (d->direction == DMA_DEV_TO_MEM) {
3465000d370SBiju Das 		channel->chcfg |= CHCFG_SAD;
3475000d370SBiju Das 		channel->chcfg &= ~CHCFG_REQD;
3485000d370SBiju Das 	} else {
3495000d370SBiju Das 		channel->chcfg |= CHCFG_DAD | CHCFG_REQD;
3505000d370SBiju Das 	}
3515000d370SBiju Das 
3525000d370SBiju Das 	lmdesc = channel->lmdesc.tail;
3535000d370SBiju Das 
3545000d370SBiju Das 	for (i = 0, sg = sgl; i < sg_len; i++, sg = sg_next(sg)) {
3555000d370SBiju Das 		if (d->direction == DMA_DEV_TO_MEM) {
3565000d370SBiju Das 			lmdesc->sa = channel->src_per_address;
3575000d370SBiju Das 			lmdesc->da = sg_dma_address(sg);
3585000d370SBiju Das 		} else {
3595000d370SBiju Das 			lmdesc->sa = sg_dma_address(sg);
3605000d370SBiju Das 			lmdesc->da = channel->dst_per_address;
3615000d370SBiju Das 		}
3625000d370SBiju Das 
3635000d370SBiju Das 		lmdesc->tb = sg_dma_len(sg);
3645000d370SBiju Das 		lmdesc->chitvl = 0;
3655000d370SBiju Das 		lmdesc->chext = 0;
3665000d370SBiju Das 		if (i == (sg_len - 1)) {
3675000d370SBiju Das 			lmdesc->chcfg = (channel->chcfg & ~CHCFG_DEM);
3685000d370SBiju Das 			lmdesc->header = HEADER_LV;
3695000d370SBiju Das 		} else {
3705000d370SBiju Das 			lmdesc->chcfg = channel->chcfg;
3715000d370SBiju Das 			lmdesc->header = HEADER_LV;
3725000d370SBiju Das 		}
3735000d370SBiju Das 		if (++lmdesc >= (channel->lmdesc.base + DMAC_NR_LMDESC))
3745000d370SBiju Das 			lmdesc = channel->lmdesc.base;
3755000d370SBiju Das 	}
3765000d370SBiju Das 
3775000d370SBiju Das 	channel->lmdesc.tail = lmdesc;
3785000d370SBiju Das 
3795000d370SBiju Das 	rz_dmac_set_dmars_register(dmac, channel->index, channel->mid_rid);
3805000d370SBiju Das 	channel->chctrl = CHCTRL_SETEN;
3815000d370SBiju Das }
3825000d370SBiju Das 
3835000d370SBiju Das static int rz_dmac_xfer_desc(struct rz_dmac_chan *chan)
3845000d370SBiju Das {
3855000d370SBiju Das 	struct rz_dmac_desc *d = chan->desc;
3865000d370SBiju Das 	struct virt_dma_desc *vd;
3875000d370SBiju Das 
3885000d370SBiju Das 	vd = vchan_next_desc(&chan->vc);
3895000d370SBiju Das 	if (!vd)
3905000d370SBiju Das 		return 0;
3915000d370SBiju Das 
3925000d370SBiju Das 	list_del(&vd->node);
3935000d370SBiju Das 
3945000d370SBiju Das 	switch (d->type) {
3955000d370SBiju Das 	case RZ_DMAC_DESC_MEMCPY:
3965000d370SBiju Das 		rz_dmac_prepare_desc_for_memcpy(chan);
3975000d370SBiju Das 		break;
3985000d370SBiju Das 
3995000d370SBiju Das 	case RZ_DMAC_DESC_SLAVE_SG:
4005000d370SBiju Das 		rz_dmac_prepare_descs_for_slave_sg(chan);
4015000d370SBiju Das 		break;
4025000d370SBiju Das 
4035000d370SBiju Das 	default:
4045000d370SBiju Das 		return -EINVAL;
4055000d370SBiju Das 	}
4065000d370SBiju Das 
4075000d370SBiju Das 	rz_dmac_enable_hw(chan);
4085000d370SBiju Das 
4095000d370SBiju Das 	return 0;
4105000d370SBiju Das }
4115000d370SBiju Das 
4125000d370SBiju Das /*
4135000d370SBiju Das  * -----------------------------------------------------------------------------
4145000d370SBiju Das  * DMA engine operations
4155000d370SBiju Das  */
4165000d370SBiju Das 
4175000d370SBiju Das static int rz_dmac_alloc_chan_resources(struct dma_chan *chan)
4185000d370SBiju Das {
4195000d370SBiju Das 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
4205000d370SBiju Das 
4215000d370SBiju Das 	while (channel->descs_allocated < RZ_DMAC_MAX_CHAN_DESCRIPTORS) {
4225000d370SBiju Das 		struct rz_dmac_desc *desc;
4235000d370SBiju Das 
4245000d370SBiju Das 		desc = kzalloc(sizeof(*desc), GFP_KERNEL);
4255000d370SBiju Das 		if (!desc)
4265000d370SBiju Das 			break;
4275000d370SBiju Das 
4285000d370SBiju Das 		list_add_tail(&desc->node, &channel->ld_free);
4295000d370SBiju Das 		channel->descs_allocated++;
4305000d370SBiju Das 	}
4315000d370SBiju Das 
4325000d370SBiju Das 	if (!channel->descs_allocated)
4335000d370SBiju Das 		return -ENOMEM;
4345000d370SBiju Das 
4355000d370SBiju Das 	return channel->descs_allocated;
4365000d370SBiju Das }
4375000d370SBiju Das 
4385000d370SBiju Das static void rz_dmac_free_chan_resources(struct dma_chan *chan)
4395000d370SBiju Das {
4405000d370SBiju Das 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
4415000d370SBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
4425000d370SBiju Das 	struct rz_lmdesc *lmdesc = channel->lmdesc.base;
4435000d370SBiju Das 	struct rz_dmac_desc *desc, *_desc;
4445000d370SBiju Das 	unsigned long flags;
4455000d370SBiju Das 	unsigned int i;
4465000d370SBiju Das 
4475000d370SBiju Das 	spin_lock_irqsave(&channel->vc.lock, flags);
4485000d370SBiju Das 
4495000d370SBiju Das 	for (i = 0; i < DMAC_NR_LMDESC; i++)
4505000d370SBiju Das 		lmdesc[i].header = 0;
4515000d370SBiju Das 
4525000d370SBiju Das 	rz_dmac_disable_hw(channel);
4535000d370SBiju Das 	list_splice_tail_init(&channel->ld_active, &channel->ld_free);
4545000d370SBiju Das 	list_splice_tail_init(&channel->ld_queue, &channel->ld_free);
4555000d370SBiju Das 
4565000d370SBiju Das 	if (channel->mid_rid >= 0) {
4575000d370SBiju Das 		clear_bit(channel->mid_rid, dmac->modules);
4585000d370SBiju Das 		channel->mid_rid = -EINVAL;
4595000d370SBiju Das 	}
4605000d370SBiju Das 
4615000d370SBiju Das 	spin_unlock_irqrestore(&channel->vc.lock, flags);
4625000d370SBiju Das 
4635000d370SBiju Das 	list_for_each_entry_safe(desc, _desc, &channel->ld_free, node) {
4645000d370SBiju Das 		kfree(desc);
4655000d370SBiju Das 		channel->descs_allocated--;
4665000d370SBiju Das 	}
4675000d370SBiju Das 
4685000d370SBiju Das 	INIT_LIST_HEAD(&channel->ld_free);
4695000d370SBiju Das 	vchan_free_chan_resources(&channel->vc);
4705000d370SBiju Das }
4715000d370SBiju Das 
4725000d370SBiju Das static struct dma_async_tx_descriptor *
4735000d370SBiju Das rz_dmac_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
4745000d370SBiju Das 			size_t len, unsigned long flags)
4755000d370SBiju Das {
4765000d370SBiju Das 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
4775000d370SBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
4785000d370SBiju Das 	struct rz_dmac_desc *desc;
4795000d370SBiju Das 
4805000d370SBiju Das 	dev_dbg(dmac->dev, "%s channel: %d src=0x%pad dst=0x%pad len=%zu\n",
4815000d370SBiju Das 		__func__, channel->index, &src, &dest, len);
4825000d370SBiju Das 
4835000d370SBiju Das 	if (list_empty(&channel->ld_free))
4845000d370SBiju Das 		return NULL;
4855000d370SBiju Das 
4865000d370SBiju Das 	desc = list_first_entry(&channel->ld_free, struct rz_dmac_desc, node);
4875000d370SBiju Das 
4885000d370SBiju Das 	desc->type = RZ_DMAC_DESC_MEMCPY;
4895000d370SBiju Das 	desc->src = src;
4905000d370SBiju Das 	desc->dest = dest;
4915000d370SBiju Das 	desc->len = len;
4925000d370SBiju Das 	desc->direction = DMA_MEM_TO_MEM;
4935000d370SBiju Das 
4945000d370SBiju Das 	list_move_tail(channel->ld_free.next, &channel->ld_queue);
4955000d370SBiju Das 	return vchan_tx_prep(&channel->vc, &desc->vd, flags);
4965000d370SBiju Das }
4975000d370SBiju Das 
4985000d370SBiju Das static struct dma_async_tx_descriptor *
4995000d370SBiju Das rz_dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
5005000d370SBiju Das 		      unsigned int sg_len,
5015000d370SBiju Das 		      enum dma_transfer_direction direction,
5025000d370SBiju Das 		      unsigned long flags, void *context)
5035000d370SBiju Das {
5045000d370SBiju Das 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
5055000d370SBiju Das 	struct rz_dmac_desc *desc;
5065000d370SBiju Das 	struct scatterlist *sg;
5075000d370SBiju Das 	int dma_length = 0;
5085000d370SBiju Das 	int i = 0;
5095000d370SBiju Das 
5105000d370SBiju Das 	if (list_empty(&channel->ld_free))
5115000d370SBiju Das 		return NULL;
5125000d370SBiju Das 
5135000d370SBiju Das 	desc = list_first_entry(&channel->ld_free, struct rz_dmac_desc, node);
5145000d370SBiju Das 
5155000d370SBiju Das 	for_each_sg(sgl, sg, sg_len, i) {
5165000d370SBiju Das 		dma_length += sg_dma_len(sg);
5175000d370SBiju Das 	}
5185000d370SBiju Das 
5195000d370SBiju Das 	desc->type = RZ_DMAC_DESC_SLAVE_SG;
5205000d370SBiju Das 	desc->sg = sgl;
5215000d370SBiju Das 	desc->sgcount = sg_len;
5225000d370SBiju Das 	desc->len = dma_length;
5235000d370SBiju Das 	desc->direction = direction;
5245000d370SBiju Das 
5255000d370SBiju Das 	if (direction == DMA_DEV_TO_MEM)
5265000d370SBiju Das 		desc->src = channel->src_per_address;
5275000d370SBiju Das 	else
5285000d370SBiju Das 		desc->dest = channel->dst_per_address;
5295000d370SBiju Das 
5305000d370SBiju Das 	list_move_tail(channel->ld_free.next, &channel->ld_queue);
5315000d370SBiju Das 	return vchan_tx_prep(&channel->vc, &desc->vd, flags);
5325000d370SBiju Das }
5335000d370SBiju Das 
5345000d370SBiju Das static int rz_dmac_terminate_all(struct dma_chan *chan)
5355000d370SBiju Das {
5365000d370SBiju Das 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
5375000d370SBiju Das 	unsigned long flags;
5385000d370SBiju Das 	LIST_HEAD(head);
5395000d370SBiju Das 
5405000d370SBiju Das 	rz_dmac_disable_hw(channel);
5415000d370SBiju Das 	spin_lock_irqsave(&channel->vc.lock, flags);
5425000d370SBiju Das 	list_splice_tail_init(&channel->ld_active, &channel->ld_free);
5435000d370SBiju Das 	list_splice_tail_init(&channel->ld_queue, &channel->ld_free);
5445000d370SBiju Das 	spin_unlock_irqrestore(&channel->vc.lock, flags);
5455000d370SBiju Das 	vchan_get_all_descriptors(&channel->vc, &head);
5465000d370SBiju Das 	vchan_dma_desc_free_list(&channel->vc, &head);
5475000d370SBiju Das 
5485000d370SBiju Das 	return 0;
5495000d370SBiju Das }
5505000d370SBiju Das 
5515000d370SBiju Das static void rz_dmac_issue_pending(struct dma_chan *chan)
5525000d370SBiju Das {
5535000d370SBiju Das 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
5545000d370SBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
5555000d370SBiju Das 	struct rz_dmac_desc *desc;
5565000d370SBiju Das 	unsigned long flags;
5575000d370SBiju Das 
5585000d370SBiju Das 	spin_lock_irqsave(&channel->vc.lock, flags);
5595000d370SBiju Das 
5605000d370SBiju Das 	if (!list_empty(&channel->ld_queue)) {
5615000d370SBiju Das 		desc = list_first_entry(&channel->ld_queue,
5625000d370SBiju Das 					struct rz_dmac_desc, node);
5635000d370SBiju Das 		channel->desc = desc;
5645000d370SBiju Das 		if (vchan_issue_pending(&channel->vc)) {
5655000d370SBiju Das 			if (rz_dmac_xfer_desc(channel) < 0)
5665000d370SBiju Das 				dev_warn(dmac->dev, "ch: %d couldn't issue DMA xfer\n",
5675000d370SBiju Das 					 channel->index);
5685000d370SBiju Das 			else
5695000d370SBiju Das 				list_move_tail(channel->ld_queue.next,
5705000d370SBiju Das 					       &channel->ld_active);
5715000d370SBiju Das 		}
5725000d370SBiju Das 	}
5735000d370SBiju Das 
5745000d370SBiju Das 	spin_unlock_irqrestore(&channel->vc.lock, flags);
5755000d370SBiju Das }
5765000d370SBiju Das 
5775000d370SBiju Das static u8 rz_dmac_ds_to_val_mapping(enum dma_slave_buswidth ds)
5785000d370SBiju Das {
5795000d370SBiju Das 	u8 i;
5804c0eee50SColin Ian King 	static const enum dma_slave_buswidth ds_lut[] = {
5815000d370SBiju Das 		DMA_SLAVE_BUSWIDTH_1_BYTE,
5825000d370SBiju Das 		DMA_SLAVE_BUSWIDTH_2_BYTES,
5835000d370SBiju Das 		DMA_SLAVE_BUSWIDTH_4_BYTES,
5845000d370SBiju Das 		DMA_SLAVE_BUSWIDTH_8_BYTES,
5855000d370SBiju Das 		DMA_SLAVE_BUSWIDTH_16_BYTES,
5865000d370SBiju Das 		DMA_SLAVE_BUSWIDTH_32_BYTES,
5875000d370SBiju Das 		DMA_SLAVE_BUSWIDTH_64_BYTES,
5885000d370SBiju Das 		DMA_SLAVE_BUSWIDTH_128_BYTES,
5895000d370SBiju Das 	};
5905000d370SBiju Das 
5915000d370SBiju Das 	for (i = 0; i < ARRAY_SIZE(ds_lut); i++) {
5925000d370SBiju Das 		if (ds_lut[i] == ds)
5935000d370SBiju Das 			return i;
5945000d370SBiju Das 	}
5955000d370SBiju Das 
5965000d370SBiju Das 	return CHCFG_DS_INVALID;
5975000d370SBiju Das }
5985000d370SBiju Das 
5995000d370SBiju Das static int rz_dmac_config(struct dma_chan *chan,
6005000d370SBiju Das 			  struct dma_slave_config *config)
6015000d370SBiju Das {
6025000d370SBiju Das 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
6035000d370SBiju Das 	u32 val;
6045000d370SBiju Das 
6055000d370SBiju Das 	channel->src_per_address = config->src_addr;
6065000d370SBiju Das 	channel->src_word_size = config->src_addr_width;
6075000d370SBiju Das 	channel->dst_per_address = config->dst_addr;
6085000d370SBiju Das 	channel->dst_word_size = config->dst_addr_width;
6095000d370SBiju Das 
6105000d370SBiju Das 	val = rz_dmac_ds_to_val_mapping(config->dst_addr_width);
6115000d370SBiju Das 	if (val == CHCFG_DS_INVALID)
6125000d370SBiju Das 		return -EINVAL;
6135000d370SBiju Das 
6145000d370SBiju Das 	channel->chcfg |= CHCFG_FILL_DDS(val);
6155000d370SBiju Das 
6165000d370SBiju Das 	val = rz_dmac_ds_to_val_mapping(config->src_addr_width);
6175000d370SBiju Das 	if (val == CHCFG_DS_INVALID)
6185000d370SBiju Das 		return -EINVAL;
6195000d370SBiju Das 
6205000d370SBiju Das 	channel->chcfg |= CHCFG_FILL_SDS(val);
6215000d370SBiju Das 
6225000d370SBiju Das 	return 0;
6235000d370SBiju Das }
6245000d370SBiju Das 
6255000d370SBiju Das static void rz_dmac_virt_desc_free(struct virt_dma_desc *vd)
6265000d370SBiju Das {
6275000d370SBiju Das 	/*
6285000d370SBiju Das 	 * Place holder
6295000d370SBiju Das 	 * Descriptor allocation is done during alloc_chan_resources and
6305000d370SBiju Das 	 * get freed during free_chan_resources.
6315000d370SBiju Das 	 * list is used to manage the descriptors and avoid any memory
6325000d370SBiju Das 	 * allocation/free during DMA read/write.
6335000d370SBiju Das 	 */
6345000d370SBiju Das }
6355000d370SBiju Das 
6367d3a3aaaSBiju Das static void rz_dmac_device_synchronize(struct dma_chan *chan)
6377d3a3aaaSBiju Das {
6387d3a3aaaSBiju Das 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
6397d3a3aaaSBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
6407d3a3aaaSBiju Das 	u32 chstat;
6417d3a3aaaSBiju Das 	int ret;
6427d3a3aaaSBiju Das 
6437d3a3aaaSBiju Das 	ret = read_poll_timeout(rz_dmac_ch_readl, chstat, !(chstat & CHSTAT_EN),
6447d3a3aaaSBiju Das 				100, 100000, false, channel, CHSTAT, 1);
6457d3a3aaaSBiju Das 	if (ret < 0)
6467d3a3aaaSBiju Das 		dev_warn(dmac->dev, "DMA Timeout");
6477d3a3aaaSBiju Das 
6487d3a3aaaSBiju Das 	rz_dmac_set_dmars_register(dmac, channel->index, 0);
6497d3a3aaaSBiju Das }
6507d3a3aaaSBiju Das 
6515000d370SBiju Das /*
6525000d370SBiju Das  * -----------------------------------------------------------------------------
6535000d370SBiju Das  * IRQ handling
6545000d370SBiju Das  */
6555000d370SBiju Das 
6565000d370SBiju Das static void rz_dmac_irq_handle_channel(struct rz_dmac_chan *channel)
6575000d370SBiju Das {
6585000d370SBiju Das 	struct dma_chan *chan = &channel->vc.chan;
6595000d370SBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
6605000d370SBiju Das 	u32 chstat, chctrl;
6615000d370SBiju Das 
6625000d370SBiju Das 	chstat = rz_dmac_ch_readl(channel, CHSTAT, 1);
6635000d370SBiju Das 	if (chstat & CHSTAT_ER) {
6645000d370SBiju Das 		dev_err(dmac->dev, "DMAC err CHSTAT_%d = %08X\n",
6655000d370SBiju Das 			channel->index, chstat);
6665000d370SBiju Das 		rz_dmac_ch_writel(channel, CHCTRL_DEFAULT, CHCTRL, 1);
6675000d370SBiju Das 		goto done;
6685000d370SBiju Das 	}
6695000d370SBiju Das 
6705000d370SBiju Das 	chctrl = rz_dmac_ch_readl(channel, CHCTRL, 1);
6715000d370SBiju Das 	rz_dmac_ch_writel(channel, chctrl | CHCTRL_CLREND, CHCTRL, 1);
6725000d370SBiju Das done:
6735000d370SBiju Das 	return;
6745000d370SBiju Das }
6755000d370SBiju Das 
6765000d370SBiju Das static irqreturn_t rz_dmac_irq_handler(int irq, void *dev_id)
6775000d370SBiju Das {
6785000d370SBiju Das 	struct rz_dmac_chan *channel = dev_id;
6795000d370SBiju Das 
6805000d370SBiju Das 	if (channel) {
6815000d370SBiju Das 		rz_dmac_irq_handle_channel(channel);
6825000d370SBiju Das 		return IRQ_WAKE_THREAD;
6835000d370SBiju Das 	}
6845000d370SBiju Das 	/* handle DMAERR irq */
6855000d370SBiju Das 	return IRQ_HANDLED;
6865000d370SBiju Das }
6875000d370SBiju Das 
6885000d370SBiju Das static irqreturn_t rz_dmac_irq_handler_thread(int irq, void *dev_id)
6895000d370SBiju Das {
6905000d370SBiju Das 	struct rz_dmac_chan *channel = dev_id;
6915000d370SBiju Das 	struct rz_dmac_desc *desc = NULL;
6925000d370SBiju Das 	unsigned long flags;
6935000d370SBiju Das 
6945000d370SBiju Das 	spin_lock_irqsave(&channel->vc.lock, flags);
6955000d370SBiju Das 
6965000d370SBiju Das 	if (list_empty(&channel->ld_active)) {
6975000d370SBiju Das 		/* Someone might have called terminate all */
6985000d370SBiju Das 		goto out;
6995000d370SBiju Das 	}
7005000d370SBiju Das 
7015000d370SBiju Das 	desc = list_first_entry(&channel->ld_active, struct rz_dmac_desc, node);
7025000d370SBiju Das 	vchan_cookie_complete(&desc->vd);
7035000d370SBiju Das 	list_move_tail(channel->ld_active.next, &channel->ld_free);
7045000d370SBiju Das 	if (!list_empty(&channel->ld_queue)) {
7055000d370SBiju Das 		desc = list_first_entry(&channel->ld_queue, struct rz_dmac_desc,
7065000d370SBiju Das 					node);
7075000d370SBiju Das 		channel->desc = desc;
7085000d370SBiju Das 		if (rz_dmac_xfer_desc(channel) == 0)
7095000d370SBiju Das 			list_move_tail(channel->ld_queue.next, &channel->ld_active);
7105000d370SBiju Das 	}
7115000d370SBiju Das out:
7125000d370SBiju Das 	spin_unlock_irqrestore(&channel->vc.lock, flags);
7135000d370SBiju Das 
7145000d370SBiju Das 	return IRQ_HANDLED;
7155000d370SBiju Das }
7165000d370SBiju Das 
7175000d370SBiju Das /*
7185000d370SBiju Das  * -----------------------------------------------------------------------------
7195000d370SBiju Das  * OF xlate and channel filter
7205000d370SBiju Das  */
7215000d370SBiju Das 
7225000d370SBiju Das static bool rz_dmac_chan_filter(struct dma_chan *chan, void *arg)
7235000d370SBiju Das {
7245000d370SBiju Das 	struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
7255000d370SBiju Das 	struct rz_dmac *dmac = to_rz_dmac(chan->device);
7265000d370SBiju Das 	struct of_phandle_args *dma_spec = arg;
7275000d370SBiju Das 	u32 ch_cfg;
7285000d370SBiju Das 
7295000d370SBiju Das 	channel->mid_rid = dma_spec->args[0] & MID_RID_MASK;
7305000d370SBiju Das 	ch_cfg = (dma_spec->args[0] & CHCFG_MASK) >> 10;
7315000d370SBiju Das 	channel->chcfg = CHCFG_FILL_TM(ch_cfg) | CHCFG_FILL_AM(ch_cfg) |
7325000d370SBiju Das 			 CHCFG_FILL_LVL(ch_cfg) | CHCFG_FILL_HIEN(ch_cfg);
7335000d370SBiju Das 
7345000d370SBiju Das 	return !test_and_set_bit(channel->mid_rid, dmac->modules);
7355000d370SBiju Das }
7365000d370SBiju Das 
7375000d370SBiju Das static struct dma_chan *rz_dmac_of_xlate(struct of_phandle_args *dma_spec,
7385000d370SBiju Das 					 struct of_dma *ofdma)
7395000d370SBiju Das {
7405000d370SBiju Das 	dma_cap_mask_t mask;
7415000d370SBiju Das 
7425000d370SBiju Das 	if (dma_spec->args_count != 1)
7435000d370SBiju Das 		return NULL;
7445000d370SBiju Das 
7455000d370SBiju Das 	/* Only slave DMA channels can be allocated via DT */
7465000d370SBiju Das 	dma_cap_zero(mask);
7475000d370SBiju Das 	dma_cap_set(DMA_SLAVE, mask);
7485000d370SBiju Das 
7495000d370SBiju Das 	return dma_request_channel(mask, rz_dmac_chan_filter, dma_spec);
7505000d370SBiju Das }
7515000d370SBiju Das 
7525000d370SBiju Das /*
7535000d370SBiju Das  * -----------------------------------------------------------------------------
7545000d370SBiju Das  * Probe and remove
7555000d370SBiju Das  */
7565000d370SBiju Das 
7575000d370SBiju Das static int rz_dmac_chan_probe(struct rz_dmac *dmac,
7585000d370SBiju Das 			      struct rz_dmac_chan *channel,
7595000d370SBiju Das 			      unsigned int index)
7605000d370SBiju Das {
7615000d370SBiju Das 	struct platform_device *pdev = to_platform_device(dmac->dev);
7625000d370SBiju Das 	struct rz_lmdesc *lmdesc;
7635000d370SBiju Das 	char pdev_irqname[5];
7645000d370SBiju Das 	char *irqname;
7655000d370SBiju Das 	int ret;
7665000d370SBiju Das 
7675000d370SBiju Das 	channel->index = index;
7685000d370SBiju Das 	channel->mid_rid = -EINVAL;
7695000d370SBiju Das 
7705000d370SBiju Das 	/* Request the channel interrupt. */
7715000d370SBiju Das 	sprintf(pdev_irqname, "ch%u", index);
7725000d370SBiju Das 	channel->irq = platform_get_irq_byname(pdev, pdev_irqname);
7735000d370SBiju Das 	if (channel->irq < 0)
7745000d370SBiju Das 		return channel->irq;
7755000d370SBiju Das 
7765000d370SBiju Das 	irqname = devm_kasprintf(dmac->dev, GFP_KERNEL, "%s:%u",
7775000d370SBiju Das 				 dev_name(dmac->dev), index);
7785000d370SBiju Das 	if (!irqname)
7795000d370SBiju Das 		return -ENOMEM;
7805000d370SBiju Das 
7815000d370SBiju Das 	ret = devm_request_threaded_irq(dmac->dev, channel->irq,
7825000d370SBiju Das 					rz_dmac_irq_handler,
7835000d370SBiju Das 					rz_dmac_irq_handler_thread, 0,
7845000d370SBiju Das 					irqname, channel);
7855000d370SBiju Das 	if (ret) {
7865000d370SBiju Das 		dev_err(dmac->dev, "failed to request IRQ %u (%d)\n",
7875000d370SBiju Das 			channel->irq, ret);
7885000d370SBiju Das 		return ret;
7895000d370SBiju Das 	}
7905000d370SBiju Das 
7915000d370SBiju Das 	/* Set io base address for each channel */
7925000d370SBiju Das 	if (index < 8) {
7935000d370SBiju Das 		channel->ch_base = dmac->base + CHANNEL_0_7_OFFSET +
7945000d370SBiju Das 			EACH_CHANNEL_OFFSET * index;
7955000d370SBiju Das 		channel->ch_cmn_base = dmac->base + CHANNEL_0_7_COMMON_BASE;
7965000d370SBiju Das 	} else {
7975000d370SBiju Das 		channel->ch_base = dmac->base + CHANNEL_8_15_OFFSET +
7985000d370SBiju Das 			EACH_CHANNEL_OFFSET * (index - 8);
7995000d370SBiju Das 		channel->ch_cmn_base = dmac->base + CHANNEL_8_15_COMMON_BASE;
8005000d370SBiju Das 	}
8015000d370SBiju Das 
8025000d370SBiju Das 	/* Allocate descriptors */
8035000d370SBiju Das 	lmdesc = dma_alloc_coherent(&pdev->dev,
8045000d370SBiju Das 				    sizeof(struct rz_lmdesc) * DMAC_NR_LMDESC,
8055000d370SBiju Das 				    &channel->lmdesc.base_dma, GFP_KERNEL);
8065000d370SBiju Das 	if (!lmdesc) {
8075000d370SBiju Das 		dev_err(&pdev->dev, "Can't allocate memory (lmdesc)\n");
8085000d370SBiju Das 		return -ENOMEM;
8095000d370SBiju Das 	}
8105000d370SBiju Das 	rz_lmdesc_setup(channel, lmdesc);
8115000d370SBiju Das 
8125000d370SBiju Das 	/* Initialize register for each channel */
8135000d370SBiju Das 	rz_dmac_ch_writel(channel, CHCTRL_DEFAULT, CHCTRL, 1);
8145000d370SBiju Das 
8155000d370SBiju Das 	channel->vc.desc_free = rz_dmac_virt_desc_free;
8165000d370SBiju Das 	vchan_init(&channel->vc, &dmac->engine);
8175000d370SBiju Das 	INIT_LIST_HEAD(&channel->ld_queue);
8185000d370SBiju Das 	INIT_LIST_HEAD(&channel->ld_free);
8195000d370SBiju Das 	INIT_LIST_HEAD(&channel->ld_active);
8205000d370SBiju Das 
8215000d370SBiju Das 	return 0;
8225000d370SBiju Das }
8235000d370SBiju Das 
8245000d370SBiju Das static int rz_dmac_parse_of(struct device *dev, struct rz_dmac *dmac)
8255000d370SBiju Das {
8265000d370SBiju Das 	struct device_node *np = dev->of_node;
8275000d370SBiju Das 	int ret;
8285000d370SBiju Das 
8295000d370SBiju Das 	ret = of_property_read_u32(np, "dma-channels", &dmac->n_channels);
8305000d370SBiju Das 	if (ret < 0) {
8315000d370SBiju Das 		dev_err(dev, "unable to read dma-channels property\n");
8325000d370SBiju Das 		return ret;
8335000d370SBiju Das 	}
8345000d370SBiju Das 
8355000d370SBiju Das 	if (!dmac->n_channels || dmac->n_channels > RZ_DMAC_MAX_CHANNELS) {
8365000d370SBiju Das 		dev_err(dev, "invalid number of channels %u\n", dmac->n_channels);
8375000d370SBiju Das 		return -EINVAL;
8385000d370SBiju Das 	}
8395000d370SBiju Das 
8405000d370SBiju Das 	return 0;
8415000d370SBiju Das }
8425000d370SBiju Das 
8435000d370SBiju Das static int rz_dmac_probe(struct platform_device *pdev)
8445000d370SBiju Das {
8455000d370SBiju Das 	const char *irqname = "error";
8465000d370SBiju Das 	struct dma_device *engine;
8475000d370SBiju Das 	struct rz_dmac *dmac;
8485000d370SBiju Das 	int channel_num;
8495000d370SBiju Das 	unsigned int i;
8505000d370SBiju Das 	int ret;
8515000d370SBiju Das 	int irq;
8525000d370SBiju Das 
8535000d370SBiju Das 	dmac = devm_kzalloc(&pdev->dev, sizeof(*dmac), GFP_KERNEL);
8545000d370SBiju Das 	if (!dmac)
8555000d370SBiju Das 		return -ENOMEM;
8565000d370SBiju Das 
8575000d370SBiju Das 	dmac->dev = &pdev->dev;
8585000d370SBiju Das 	platform_set_drvdata(pdev, dmac);
8595000d370SBiju Das 
8605000d370SBiju Das 	ret = rz_dmac_parse_of(&pdev->dev, dmac);
8615000d370SBiju Das 	if (ret < 0)
8625000d370SBiju Das 		return ret;
8635000d370SBiju Das 
8645000d370SBiju Das 	dmac->channels = devm_kcalloc(&pdev->dev, dmac->n_channels,
8655000d370SBiju Das 				      sizeof(*dmac->channels), GFP_KERNEL);
8665000d370SBiju Das 	if (!dmac->channels)
8675000d370SBiju Das 		return -ENOMEM;
8685000d370SBiju Das 
8695000d370SBiju Das 	/* Request resources */
8705000d370SBiju Das 	dmac->base = devm_platform_ioremap_resource(pdev, 0);
8715000d370SBiju Das 	if (IS_ERR(dmac->base))
8725000d370SBiju Das 		return PTR_ERR(dmac->base);
8735000d370SBiju Das 
8745000d370SBiju Das 	dmac->ext_base = devm_platform_ioremap_resource(pdev, 1);
8755000d370SBiju Das 	if (IS_ERR(dmac->ext_base))
8765000d370SBiju Das 		return PTR_ERR(dmac->ext_base);
8775000d370SBiju Das 
8785000d370SBiju Das 	/* Register interrupt handler for error */
8795000d370SBiju Das 	irq = platform_get_irq_byname(pdev, irqname);
8805000d370SBiju Das 	if (irq < 0)
8815000d370SBiju Das 		return irq;
8825000d370SBiju Das 
8835000d370SBiju Das 	ret = devm_request_irq(&pdev->dev, irq, rz_dmac_irq_handler, 0,
8845000d370SBiju Das 			       irqname, NULL);
8855000d370SBiju Das 	if (ret) {
8865000d370SBiju Das 		dev_err(&pdev->dev, "failed to request IRQ %u (%d)\n",
8875000d370SBiju Das 			irq, ret);
8885000d370SBiju Das 		return ret;
8895000d370SBiju Das 	}
8905000d370SBiju Das 
8915000d370SBiju Das 	/* Initialize the channels. */
8925000d370SBiju Das 	INIT_LIST_HEAD(&dmac->engine.channels);
8935000d370SBiju Das 
894*d1e71a3aSBiju Das 	dmac->rstc = devm_reset_control_array_get_exclusive(&pdev->dev);
895*d1e71a3aSBiju Das 	if (IS_ERR(dmac->rstc))
896*d1e71a3aSBiju Das 		return dev_err_probe(&pdev->dev, PTR_ERR(dmac->rstc),
897*d1e71a3aSBiju Das 				     "failed to get resets\n");
898*d1e71a3aSBiju Das 
899161596fdSBiju Das 	pm_runtime_enable(&pdev->dev);
900161596fdSBiju Das 	ret = pm_runtime_resume_and_get(&pdev->dev);
901161596fdSBiju Das 	if (ret < 0) {
902161596fdSBiju Das 		dev_err(&pdev->dev, "pm_runtime_resume_and_get failed\n");
903161596fdSBiju Das 		goto err_pm_disable;
904161596fdSBiju Das 	}
905161596fdSBiju Das 
906*d1e71a3aSBiju Das 	ret = reset_control_deassert(dmac->rstc);
907*d1e71a3aSBiju Das 	if (ret)
908*d1e71a3aSBiju Das 		goto err_pm_runtime_put;
909*d1e71a3aSBiju Das 
9105000d370SBiju Das 	for (i = 0; i < dmac->n_channels; i++) {
9115000d370SBiju Das 		ret = rz_dmac_chan_probe(dmac, &dmac->channels[i], i);
9125000d370SBiju Das 		if (ret < 0)
9135000d370SBiju Das 			goto err;
9145000d370SBiju Das 	}
9155000d370SBiju Das 
9165000d370SBiju Das 	/* Register the DMAC as a DMA provider for DT. */
9175000d370SBiju Das 	ret = of_dma_controller_register(pdev->dev.of_node, rz_dmac_of_xlate,
9185000d370SBiju Das 					 NULL);
9195000d370SBiju Das 	if (ret < 0)
9205000d370SBiju Das 		goto err;
9215000d370SBiju Das 
9225000d370SBiju Das 	/* Register the DMA engine device. */
9235000d370SBiju Das 	engine = &dmac->engine;
9245000d370SBiju Das 	dma_cap_set(DMA_SLAVE, engine->cap_mask);
9255000d370SBiju Das 	dma_cap_set(DMA_MEMCPY, engine->cap_mask);
9265000d370SBiju Das 	rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_0_7_COMMON_BASE + DCTRL);
9275000d370SBiju Das 	rz_dmac_writel(dmac, DCTRL_DEFAULT, CHANNEL_8_15_COMMON_BASE + DCTRL);
9285000d370SBiju Das 
9295000d370SBiju Das 	engine->dev = &pdev->dev;
9305000d370SBiju Das 
9315000d370SBiju Das 	engine->device_alloc_chan_resources = rz_dmac_alloc_chan_resources;
9325000d370SBiju Das 	engine->device_free_chan_resources = rz_dmac_free_chan_resources;
9335000d370SBiju Das 	engine->device_tx_status = dma_cookie_status;
9345000d370SBiju Das 	engine->device_prep_slave_sg = rz_dmac_prep_slave_sg;
9355000d370SBiju Das 	engine->device_prep_dma_memcpy = rz_dmac_prep_dma_memcpy;
9365000d370SBiju Das 	engine->device_config = rz_dmac_config;
9375000d370SBiju Das 	engine->device_terminate_all = rz_dmac_terminate_all;
9385000d370SBiju Das 	engine->device_issue_pending = rz_dmac_issue_pending;
9397d3a3aaaSBiju Das 	engine->device_synchronize = rz_dmac_device_synchronize;
9405000d370SBiju Das 
9415000d370SBiju Das 	engine->copy_align = DMAENGINE_ALIGN_1_BYTE;
9425000d370SBiju Das 	dma_set_max_seg_size(engine->dev, U32_MAX);
9435000d370SBiju Das 
9445000d370SBiju Das 	ret = dma_async_device_register(engine);
9455000d370SBiju Das 	if (ret < 0) {
9465000d370SBiju Das 		dev_err(&pdev->dev, "unable to register\n");
9475000d370SBiju Das 		goto dma_register_err;
9485000d370SBiju Das 	}
9495000d370SBiju Das 	return 0;
9505000d370SBiju Das 
9515000d370SBiju Das dma_register_err:
9525000d370SBiju Das 	of_dma_controller_free(pdev->dev.of_node);
9535000d370SBiju Das err:
954*d1e71a3aSBiju Das 	reset_control_assert(dmac->rstc);
9555000d370SBiju Das 	channel_num = i ? i - 1 : 0;
9565000d370SBiju Das 	for (i = 0; i < channel_num; i++) {
9575000d370SBiju Das 		struct rz_dmac_chan *channel = &dmac->channels[i];
9585000d370SBiju Das 
95911a427beSDan Carpenter 		dma_free_coherent(&pdev->dev,
9605000d370SBiju Das 				  sizeof(struct rz_lmdesc) * DMAC_NR_LMDESC,
9615000d370SBiju Das 				  channel->lmdesc.base,
9625000d370SBiju Das 				  channel->lmdesc.base_dma);
9635000d370SBiju Das 	}
9645000d370SBiju Das 
965*d1e71a3aSBiju Das err_pm_runtime_put:
966161596fdSBiju Das 	pm_runtime_put(&pdev->dev);
967161596fdSBiju Das err_pm_disable:
968161596fdSBiju Das 	pm_runtime_disable(&pdev->dev);
969161596fdSBiju Das 
9705000d370SBiju Das 	return ret;
9715000d370SBiju Das }
9725000d370SBiju Das 
9735000d370SBiju Das static int rz_dmac_remove(struct platform_device *pdev)
9745000d370SBiju Das {
9755000d370SBiju Das 	struct rz_dmac *dmac = platform_get_drvdata(pdev);
9765000d370SBiju Das 	unsigned int i;
9775000d370SBiju Das 
9785000d370SBiju Das 	for (i = 0; i < dmac->n_channels; i++) {
9795000d370SBiju Das 		struct rz_dmac_chan *channel = &dmac->channels[i];
9805000d370SBiju Das 
98111a427beSDan Carpenter 		dma_free_coherent(&pdev->dev,
9825000d370SBiju Das 				  sizeof(struct rz_lmdesc) * DMAC_NR_LMDESC,
9835000d370SBiju Das 				  channel->lmdesc.base,
9845000d370SBiju Das 				  channel->lmdesc.base_dma);
9855000d370SBiju Das 	}
9865000d370SBiju Das 	of_dma_controller_free(pdev->dev.of_node);
9875000d370SBiju Das 	dma_async_device_unregister(&dmac->engine);
988*d1e71a3aSBiju Das 	reset_control_assert(dmac->rstc);
989161596fdSBiju Das 	pm_runtime_put(&pdev->dev);
990161596fdSBiju Das 	pm_runtime_disable(&pdev->dev);
9915000d370SBiju Das 
9925000d370SBiju Das 	return 0;
9935000d370SBiju Das }
9945000d370SBiju Das 
9955000d370SBiju Das static const struct of_device_id of_rz_dmac_match[] = {
9965000d370SBiju Das 	{ .compatible = "renesas,rz-dmac", },
9975000d370SBiju Das 	{ /* Sentinel */ }
9985000d370SBiju Das };
9995000d370SBiju Das MODULE_DEVICE_TABLE(of, of_rz_dmac_match);
10005000d370SBiju Das 
10015000d370SBiju Das static struct platform_driver rz_dmac_driver = {
10025000d370SBiju Das 	.driver		= {
10035000d370SBiju Das 		.name	= "rz-dmac",
10045000d370SBiju Das 		.of_match_table = of_rz_dmac_match,
10055000d370SBiju Das 	},
10065000d370SBiju Das 	.probe		= rz_dmac_probe,
10075000d370SBiju Das 	.remove		= rz_dmac_remove,
10085000d370SBiju Das };
10095000d370SBiju Das 
10105000d370SBiju Das module_platform_driver(rz_dmac_driver);
10115000d370SBiju Das 
10125000d370SBiju Das MODULE_DESCRIPTION("Renesas RZ/G2L DMA Controller Driver");
10135000d370SBiju Das MODULE_AUTHOR("Biju Das <biju.das.jz@bp.renesas.com>");
10145000d370SBiju Das MODULE_LICENSE("GPL v2");
1015