Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull dmaengine fixes from Vinod Koul:

- bam_dma fix for completed descriptor count

- fix for imx-sdma remove BD_INTR for channel0 and use-after-free on
probe error path

- endian bug fix in jz4780 IRQ handler

* tag 'dmaengine-fix-5.2' of git://git.infradead.org/users/vkoul/slave-dma:
dmaengine: qcom: bam_dma: Fix completed descriptors count
dmaengine: imx-sdma: remove BD_INTR for channel0
dmaengine: imx-sdma: fix use-after-free on probe error path
dmaengine: jz4780: Fix an endian bug in IRQ handler

+35 -25
+3 -2
drivers/dma/dma-jz4780.c
··· 718 718 { 719 719 struct jz4780_dma_dev *jzdma = data; 720 720 unsigned int nb_channels = jzdma->soc_data->nb_channels; 721 - uint32_t pending, dmac; 721 + unsigned long pending; 722 + uint32_t dmac; 722 723 int i; 723 724 724 725 pending = jz4780_dma_ctrl_readl(jzdma, JZ_DMA_REG_DIRQP); 725 726 726 - for_each_set_bit(i, (unsigned long *)&pending, nb_channels) { 727 + for_each_set_bit(i, &pending, nb_channels) { 727 728 if (jz4780_dma_chan_irq(jzdma, &jzdma->chan[i])) 728 729 pending &= ~BIT(i); 729 730 }
+29 -23
drivers/dma/imx-sdma.c
··· 703 703 spin_lock_irqsave(&sdma->channel_0_lock, flags); 704 704 705 705 bd0->mode.command = C0_SETPM; 706 - bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD; 706 + bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD; 707 707 bd0->mode.count = size / 2; 708 708 bd0->buffer_addr = buf_phys; 709 709 bd0->ext_buffer_addr = address; ··· 1025 1025 context->gReg[7] = sdmac->watermark_level; 1026 1026 1027 1027 bd0->mode.command = C0_SETDM; 1028 - bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD; 1028 + bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD; 1029 1029 bd0->mode.count = sizeof(*context) / 4; 1030 1030 bd0->buffer_addr = sdma->context_phys; 1031 1031 bd0->ext_buffer_addr = 2048 + (sizeof(*context) / 4) * channel; ··· 2096 2096 if (pdata && pdata->script_addrs) 2097 2097 sdma_add_scripts(sdma, pdata->script_addrs); 2098 2098 2099 - if (pdata) { 2100 - ret = sdma_get_firmware(sdma, pdata->fw_name); 2101 - if (ret) 2102 - dev_warn(&pdev->dev, "failed to get firmware from platform data\n"); 2103 - } else { 2104 - /* 2105 - * Because that device tree does not encode ROM script address, 2106 - * the RAM script in firmware is mandatory for device tree 2107 - * probe, otherwise it fails. 2108 - */ 2109 - ret = of_property_read_string(np, "fsl,sdma-ram-script-name", 2110 - &fw_name); 2111 - if (ret) 2112 - dev_warn(&pdev->dev, "failed to get firmware name\n"); 2113 - else { 2114 - ret = sdma_get_firmware(sdma, fw_name); 2115 - if (ret) 2116 - dev_warn(&pdev->dev, "failed to get firmware from device tree\n"); 2117 - } 2118 - } 2119 - 2120 2099 sdma->dma_device.dev = &pdev->dev; 2121 2100 2122 2101 sdma->dma_device.device_alloc_chan_resources = sdma_alloc_chan_resources; ··· 2138 2159 sdma->spba_end_addr = spba_res.end; 2139 2160 } 2140 2161 of_node_put(spba_bus); 2162 + } 2163 + 2164 + /* 2165 + * Kick off firmware loading as the very last step: 2166 + * attempt to load firmware only if we're not on the error path, because 2167 + * the firmware callback requires a fully functional and allocated sdma 2168 + * instance. 2169 + */ 2170 + if (pdata) { 2171 + ret = sdma_get_firmware(sdma, pdata->fw_name); 2172 + if (ret) 2173 + dev_warn(&pdev->dev, "failed to get firmware from platform data\n"); 2174 + } else { 2175 + /* 2176 + * Because that device tree does not encode ROM script address, 2177 + * the RAM script in firmware is mandatory for device tree 2178 + * probe, otherwise it fails. 2179 + */ 2180 + ret = of_property_read_string(np, "fsl,sdma-ram-script-name", 2181 + &fw_name); 2182 + if (ret) { 2183 + dev_warn(&pdev->dev, "failed to get firmware name\n"); 2184 + } else { 2185 + ret = sdma_get_firmware(sdma, fw_name); 2186 + if (ret) 2187 + dev_warn(&pdev->dev, "failed to get firmware from device tree\n"); 2188 + } 2141 2189 } 2142 2190 2143 2191 return 0;
+3
drivers/dma/qcom/bam_dma.c
··· 799 799 /* Number of bytes available to read */ 800 800 avail = CIRC_CNT(offset, bchan->head, MAX_DESCRIPTORS + 1); 801 801 802 + if (offset < bchan->head) 803 + avail--; 804 + 802 805 list_for_each_entry_safe(async_desc, tmp, 803 806 &bchan->desc_list, desc_node) { 804 807 /* Not enough data to read */