Merge tag 'dmaengine-fix-5.3' of git://git.infradead.org/users/vkoul/slave-dma

Pull dmaengine fixes from Vinod Koul:
"Some late fixes for drivers:

- memory leak in ti crossbar dma driver

- cleanup of omap dma probe

- Fix for link list configuration in sprd dma driver

- Handling fixed for DMACHCLR if iommu is mapped in rcar dma"

* tag 'dmaengine-fix-5.3' of git://git.infradead.org/users/vkoul/slave-dma:
dmaengine: rcar-dmac: Fix DMACHCLR handling if iommu is mapped
dmaengine: sprd: Fix the DMA link-list configuration
dmaengine: ti: omap-dma: Add cleanup in omap_dma_probe()
dmaengine: ti: dma-crossbar: Fix a memory leak bug

Changed files
+33 -13
drivers
+19 -9
drivers/dma/sh/rcar-dmac.c
··· 192 192 * @iomem: remapped I/O memory base 193 193 * @n_channels: number of available channels 194 194 * @channels: array of DMAC channels 195 + * @channels_mask: bitfield of which DMA channels are managed by this driver 195 196 * @modules: bitmask of client modules in use 196 197 */ 197 198 struct rcar_dmac { ··· 203 202 204 203 unsigned int n_channels; 205 204 struct rcar_dmac_chan *channels; 205 + unsigned int channels_mask; 206 206 207 207 DECLARE_BITMAP(modules, 256); 208 208 }; ··· 440 438 u16 dmaor; 441 439 442 440 /* Clear all channels and enable the DMAC globally. */ 443 - rcar_dmac_write(dmac, RCAR_DMACHCLR, GENMASK(dmac->n_channels - 1, 0)); 441 + rcar_dmac_write(dmac, RCAR_DMACHCLR, dmac->channels_mask); 444 442 rcar_dmac_write(dmac, RCAR_DMAOR, 445 443 RCAR_DMAOR_PRI_FIXED | RCAR_DMAOR_DME); 446 444 ··· 815 813 /* Stop all channels. */ 816 814 for (i = 0; i < dmac->n_channels; ++i) { 817 815 struct rcar_dmac_chan *chan = &dmac->channels[i]; 816 + 817 + if (!(dmac->channels_mask & BIT(i))) 818 + continue; 818 819 819 820 /* Stop and reinitialize the channel. */ 820 821 spin_lock_irq(&chan->lock); ··· 1781 1776 return 0; 1782 1777 } 1783 1778 1779 + #define RCAR_DMAC_MAX_CHANNELS 32 1780 + 1784 1781 static int rcar_dmac_parse_of(struct device *dev, struct rcar_dmac *dmac) 1785 1782 { 1786 1783 struct device_node *np = dev->of_node; ··· 1794 1787 return ret; 1795 1788 } 1796 1789 1797 - if (dmac->n_channels <= 0 || dmac->n_channels >= 100) { 1790 + /* The hardware and driver don't support more than 32 bits in CHCLR */ 1791 + if (dmac->n_channels <= 0 || 1792 + dmac->n_channels >= RCAR_DMAC_MAX_CHANNELS) { 1798 1793 dev_err(dev, "invalid number of channels %u\n", 1799 1794 dmac->n_channels); 1800 1795 return -EINVAL; 1801 1796 } 1797 + 1798 + dmac->channels_mask = GENMASK(dmac->n_channels - 1, 0); 1802 1799 1803 1800 return 0; 1804 1801 } ··· 1813 1802 DMA_SLAVE_BUSWIDTH_2_BYTES | DMA_SLAVE_BUSWIDTH_4_BYTES | 1814 1803 DMA_SLAVE_BUSWIDTH_8_BYTES | DMA_SLAVE_BUSWIDTH_16_BYTES | 1815 1804 DMA_SLAVE_BUSWIDTH_32_BYTES | DMA_SLAVE_BUSWIDTH_64_BYTES; 1816 - unsigned int channels_offset = 0; 1817 1805 struct dma_device *engine; 1818 1806 struct rcar_dmac *dmac; 1819 1807 struct resource *mem; ··· 1841 1831 * level we can't disable it selectively, so ignore channel 0 for now if 1842 1832 * the device is part of an IOMMU group. 1843 1833 */ 1844 - if (device_iommu_mapped(&pdev->dev)) { 1845 - dmac->n_channels--; 1846 - channels_offset = 1; 1847 - } 1834 + if (device_iommu_mapped(&pdev->dev)) 1835 + dmac->channels_mask &= ~BIT(0); 1848 1836 1849 1837 dmac->channels = devm_kcalloc(&pdev->dev, dmac->n_channels, 1850 1838 sizeof(*dmac->channels), GFP_KERNEL); ··· 1900 1892 INIT_LIST_HEAD(&engine->channels); 1901 1893 1902 1894 for (i = 0; i < dmac->n_channels; ++i) { 1903 - ret = rcar_dmac_chan_probe(dmac, &dmac->channels[i], 1904 - i + channels_offset); 1895 + if (!(dmac->channels_mask & BIT(i))) 1896 + continue; 1897 + 1898 + ret = rcar_dmac_chan_probe(dmac, &dmac->channels[i], i); 1905 1899 if (ret < 0) 1906 1900 goto error; 1907 1901 }
+8 -2
drivers/dma/sprd-dma.c
··· 908 908 struct sprd_dma_chn *schan = to_sprd_dma_chan(chan); 909 909 struct dma_slave_config *slave_cfg = &schan->slave_cfg; 910 910 dma_addr_t src = 0, dst = 0; 911 + dma_addr_t start_src = 0, start_dst = 0; 911 912 struct sprd_dma_desc *sdesc; 912 913 struct scatterlist *sg; 913 914 u32 len = 0; ··· 955 954 dst = sg_dma_address(sg); 956 955 } 957 956 957 + if (!i) { 958 + start_src = src; 959 + start_dst = dst; 960 + } 961 + 958 962 /* 959 963 * The link-list mode needs at least 2 link-list 960 964 * configurations. If there is only one sg, it doesn't ··· 976 970 } 977 971 } 978 972 979 - ret = sprd_dma_fill_desc(chan, &sdesc->chn_hw, 0, 0, src, dst, len, 980 - dir, flags, slave_cfg); 973 + ret = sprd_dma_fill_desc(chan, &sdesc->chn_hw, 0, 0, start_src, 974 + start_dst, len, dir, flags, slave_cfg); 981 975 if (ret) { 982 976 kfree(sdesc); 983 977 return NULL;
+3 -1
drivers/dma/ti/dma-crossbar.c
··· 391 391 392 392 ret = of_property_read_u32_array(node, pname, (u32 *)rsv_events, 393 393 nelm * 2); 394 - if (ret) 394 + if (ret) { 395 + kfree(rsv_events); 395 396 return ret; 397 + } 396 398 397 399 for (i = 0; i < nelm; i++) { 398 400 ti_dra7_xbar_reserve(rsv_events[i][0], rsv_events[i][1],
+3 -1
drivers/dma/ti/omap-dma.c
··· 1540 1540 1541 1541 rc = devm_request_irq(&pdev->dev, irq, omap_dma_irq, 1542 1542 IRQF_SHARED, "omap-dma-engine", od); 1543 - if (rc) 1543 + if (rc) { 1544 + omap_dma_free(od); 1544 1545 return rc; 1546 + } 1545 1547 } 1546 1548 1547 1549 if (omap_dma_glbl_read(od, CAPS_0) & CAPS_0_SUPPORT_LL123)