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