Skip to content

Commit 952c53c

Browse files
committed
Merge tag 'dmaengine-fix-5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine
Pull dmaengine fixes from Vinod Koul: "One core fix for DMA_INTERRUPT and rest driver fixes. Core: - Revert verification of DMA_INTERRUPT capability as that was incorrect Bunch of driver fixes for: - ti: refcount and put_device leak - qcom_bam: runtime pm overflow - idxd: force wq context cleanup and call idxd_enable_system_pasid() on success - dw-axi-dmac: RMW on channel suspend register - imx-sdma: restart cyclic channel when enabled - at_xdma: error handling for at_xdmac_alloc_desc - pl330: lockdep warning - lgm: error handling path in probe - allwinner: Fix min/max typo in binding" * tag 'dmaengine-fix-5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine: dt-bindings: dma: allwinner,sun50i-a64-dma: Fix min/max typo dmaengine: lgm: Fix an error handling path in intel_ldma_probe() dmaengine: pl330: Fix lockdep warning about non-static key dmaengine: idxd: Only call idxd_enable_system_pasid() if succeeded in enabling SVA feature dmaengine: at_xdma: handle errors of at_xdmac_alloc_desc() correctly dmaengine: imx-sdma: only restart cyclic channel when enabled dmaengine: dw-axi-dmac: Fix RMW on channel suspend register dmaengine: idxd: force wq context cleanup on device disable path dmaengine: qcom: bam_dma: fix runtime PM underflow dmaengine: imx-sdma: Allow imx8m for imx7 FW revs dmaengine: Revert "dmaengine: add verification of DMA_INTERRUPT capability for dmatest" dmaengine: ti: Add missing put_device in ti_dra7_xbar_route_allocate dmaengine: ti: Fix refcount leak in ti_dra7_xbar_route_allocate
2 parents 5867f3b + 607a48c commit 952c53c

File tree

11 files changed

+43
-56
lines changed

11 files changed

+43
-56
lines changed

Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ if:
6767
then:
6868
properties:
6969
clocks:
70-
maxItems: 2
70+
minItems: 2
7171

7272
required:
7373
- clock-names

drivers/dma/at_xdmac.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,6 +1900,11 @@ static int at_xdmac_alloc_chan_resources(struct dma_chan *chan)
19001900
for (i = 0; i < init_nr_desc_per_channel; i++) {
19011901
desc = at_xdmac_alloc_desc(chan, GFP_KERNEL);
19021902
if (!desc) {
1903+
if (i == 0) {
1904+
dev_warn(chan2dev(chan),
1905+
"can't allocate any descriptors\n");
1906+
return -EIO;
1907+
}
19031908
dev_warn(chan2dev(chan),
19041909
"only %d descriptors have been allocated\n", i);
19051910
break;

drivers/dma/dmatest.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -675,16 +675,10 @@ static int dmatest_func(void *data)
675675
/*
676676
* src and dst buffers are freed by ourselves below
677677
*/
678-
if (params->polled) {
678+
if (params->polled)
679679
flags = DMA_CTRL_ACK;
680-
} else {
681-
if (dma_has_cap(DMA_INTERRUPT, dev->cap_mask)) {
682-
flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
683-
} else {
684-
pr_err("Channel does not support interrupt!\n");
685-
goto err_pq_array;
686-
}
687-
}
680+
else
681+
flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
688682

689683
ktime = ktime_get();
690684
while (!(kthread_should_stop() ||
@@ -912,7 +906,6 @@ static int dmatest_func(void *data)
912906
runtime = ktime_to_us(ktime);
913907

914908
ret = 0;
915-
err_pq_array:
916909
kfree(dma_pq);
917910
err_srcs_array:
918911
kfree(srcs);

drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,8 +1164,9 @@ static int dma_chan_pause(struct dma_chan *dchan)
11641164
BIT(chan->id) << DMAC_CHAN_SUSP_WE_SHIFT;
11651165
axi_dma_iowrite32(chan->chip, DMAC_CHEN, val);
11661166
} else {
1167-
val = BIT(chan->id) << DMAC_CHAN_SUSP2_SHIFT |
1168-
BIT(chan->id) << DMAC_CHAN_SUSP2_WE_SHIFT;
1167+
val = axi_dma_ioread32(chan->chip, DMAC_CHSUSPREG);
1168+
val |= BIT(chan->id) << DMAC_CHAN_SUSP2_SHIFT |
1169+
BIT(chan->id) << DMAC_CHAN_SUSP2_WE_SHIFT;
11691170
axi_dma_iowrite32(chan->chip, DMAC_CHSUSPREG, val);
11701171
}
11711172

@@ -1190,12 +1191,13 @@ static inline void axi_chan_resume(struct axi_dma_chan *chan)
11901191
{
11911192
u32 val;
11921193

1193-
val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
11941194
if (chan->chip->dw->hdata->reg_map_8_channels) {
1195+
val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
11951196
val &= ~(BIT(chan->id) << DMAC_CHAN_SUSP_SHIFT);
11961197
val |= (BIT(chan->id) << DMAC_CHAN_SUSP_WE_SHIFT);
11971198
axi_dma_iowrite32(chan->chip, DMAC_CHEN, val);
11981199
} else {
1200+
val = axi_dma_ioread32(chan->chip, DMAC_CHSUSPREG);
11991201
val &= ~(BIT(chan->id) << DMAC_CHAN_SUSP2_SHIFT);
12001202
val |= (BIT(chan->id) << DMAC_CHAN_SUSP2_WE_SHIFT);
12011203
axi_dma_iowrite32(chan->chip, DMAC_CHSUSPREG, val);

drivers/dma/idxd/device.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -716,10 +716,7 @@ static void idxd_device_wqs_clear_state(struct idxd_device *idxd)
716716
struct idxd_wq *wq = idxd->wqs[i];
717717

718718
mutex_lock(&wq->wq_lock);
719-
if (wq->state == IDXD_WQ_ENABLED) {
720-
idxd_wq_disable_cleanup(wq);
721-
wq->state = IDXD_WQ_DISABLED;
722-
}
719+
idxd_wq_disable_cleanup(wq);
723720
idxd_wq_device_reset_cleanup(wq);
724721
mutex_unlock(&wq->wq_lock);
725722
}

drivers/dma/idxd/init.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -512,15 +512,16 @@ static int idxd_probe(struct idxd_device *idxd)
512512
dev_dbg(dev, "IDXD reset complete\n");
513513

514514
if (IS_ENABLED(CONFIG_INTEL_IDXD_SVM) && sva) {
515-
if (iommu_dev_enable_feature(dev, IOMMU_DEV_FEAT_SVA))
515+
if (iommu_dev_enable_feature(dev, IOMMU_DEV_FEAT_SVA)) {
516516
dev_warn(dev, "Unable to turn on user SVA feature.\n");
517-
else
517+
} else {
518518
set_bit(IDXD_FLAG_USER_PASID_ENABLED, &idxd->flags);
519519

520-
if (idxd_enable_system_pasid(idxd))
521-
dev_warn(dev, "No in-kernel DMA with PASID.\n");
522-
else
523-
set_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags);
520+
if (idxd_enable_system_pasid(idxd))
521+
dev_warn(dev, "No in-kernel DMA with PASID.\n");
522+
else
523+
set_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags);
524+
}
524525
} else if (!sva) {
525526
dev_warn(dev, "User forced SVA off via module param.\n");
526527
}

drivers/dma/imx-sdma.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,7 @@ static void sdma_update_channel_loop(struct sdma_channel *sdmac)
891891
* SDMA stops cyclic channel when DMA request triggers a channel and no SDMA
892892
* owned buffer is available (i.e. BD_DONE was set too late).
893893
*/
894-
if (!is_sdma_channel_enabled(sdmac->sdma, sdmac->channel)) {
894+
if (sdmac->desc && !is_sdma_channel_enabled(sdmac->sdma, sdmac->channel)) {
895895
dev_warn(sdmac->sdma->dev, "restart cyclic channel %d\n", sdmac->channel);
896896
sdma_enable_channel(sdmac->sdma, sdmac->channel);
897897
}
@@ -2346,7 +2346,7 @@ MODULE_DESCRIPTION("i.MX SDMA driver");
23462346
#if IS_ENABLED(CONFIG_SOC_IMX6Q)
23472347
MODULE_FIRMWARE("imx/sdma/sdma-imx6q.bin");
23482348
#endif
2349-
#if IS_ENABLED(CONFIG_SOC_IMX7D)
2349+
#if IS_ENABLED(CONFIG_SOC_IMX7D) || IS_ENABLED(CONFIG_SOC_IMX8M)
23502350
MODULE_FIRMWARE("imx/sdma/sdma-imx7d.bin");
23512351
#endif
23522352
MODULE_LICENSE("GPL");

drivers/dma/lgm/lgm-dma.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1593,11 +1593,12 @@ static int intel_ldma_probe(struct platform_device *pdev)
15931593
d->core_clk = devm_clk_get_optional(dev, NULL);
15941594
if (IS_ERR(d->core_clk))
15951595
return PTR_ERR(d->core_clk);
1596-
clk_prepare_enable(d->core_clk);
15971596

15981597
d->rst = devm_reset_control_get_optional(dev, NULL);
15991598
if (IS_ERR(d->rst))
16001599
return PTR_ERR(d->rst);
1600+
1601+
clk_prepare_enable(d->core_clk);
16011602
reset_control_deassert(d->rst);
16021603

16031604
ret = devm_add_action_or_reset(dev, ldma_clk_disable, d);

drivers/dma/pl330.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2589,7 +2589,7 @@ static struct dma_pl330_desc *pl330_get_desc(struct dma_pl330_chan *pch)
25892589

25902590
/* If the DMAC pool is empty, alloc new */
25912591
if (!desc) {
2592-
DEFINE_SPINLOCK(lock);
2592+
static DEFINE_SPINLOCK(lock);
25932593
LIST_HEAD(pool);
25942594

25952595
if (!add_desc(&pool, &lock, GFP_ATOMIC, 1))

drivers/dma/qcom/bam_dma.c

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -558,14 +558,6 @@ static int bam_alloc_chan(struct dma_chan *chan)
558558
return 0;
559559
}
560560

561-
static int bam_pm_runtime_get_sync(struct device *dev)
562-
{
563-
if (pm_runtime_enabled(dev))
564-
return pm_runtime_get_sync(dev);
565-
566-
return 0;
567-
}
568-
569561
/**
570562
* bam_free_chan - Frees dma resources associated with specific channel
571563
* @chan: specified channel
@@ -581,7 +573,7 @@ static void bam_free_chan(struct dma_chan *chan)
581573
unsigned long flags;
582574
int ret;
583575

584-
ret = bam_pm_runtime_get_sync(bdev->dev);
576+
ret = pm_runtime_get_sync(bdev->dev);
585577
if (ret < 0)
586578
return;
587579

@@ -784,7 +776,7 @@ static int bam_pause(struct dma_chan *chan)
784776
unsigned long flag;
785777
int ret;
786778

787-
ret = bam_pm_runtime_get_sync(bdev->dev);
779+
ret = pm_runtime_get_sync(bdev->dev);
788780
if (ret < 0)
789781
return ret;
790782

@@ -810,7 +802,7 @@ static int bam_resume(struct dma_chan *chan)
810802
unsigned long flag;
811803
int ret;
812804

813-
ret = bam_pm_runtime_get_sync(bdev->dev);
805+
ret = pm_runtime_get_sync(bdev->dev);
814806
if (ret < 0)
815807
return ret;
816808

@@ -919,7 +911,7 @@ static irqreturn_t bam_dma_irq(int irq, void *data)
919911
if (srcs & P_IRQ)
920912
tasklet_schedule(&bdev->task);
921913

922-
ret = bam_pm_runtime_get_sync(bdev->dev);
914+
ret = pm_runtime_get_sync(bdev->dev);
923915
if (ret < 0)
924916
return IRQ_NONE;
925917

@@ -1037,7 +1029,7 @@ static void bam_start_dma(struct bam_chan *bchan)
10371029
if (!vd)
10381030
return;
10391031

1040-
ret = bam_pm_runtime_get_sync(bdev->dev);
1032+
ret = pm_runtime_get_sync(bdev->dev);
10411033
if (ret < 0)
10421034
return;
10431035

@@ -1374,11 +1366,6 @@ static int bam_dma_probe(struct platform_device *pdev)
13741366
if (ret)
13751367
goto err_unregister_dma;
13761368

1377-
if (!bdev->bamclk) {
1378-
pm_runtime_disable(&pdev->dev);
1379-
return 0;
1380-
}
1381-
13821369
pm_runtime_irq_safe(&pdev->dev);
13831370
pm_runtime_set_autosuspend_delay(&pdev->dev, BAM_DMA_AUTOSUSPEND_DELAY);
13841371
pm_runtime_use_autosuspend(&pdev->dev);
@@ -1462,10 +1449,8 @@ static int __maybe_unused bam_dma_suspend(struct device *dev)
14621449
{
14631450
struct bam_device *bdev = dev_get_drvdata(dev);
14641451

1465-
if (bdev->bamclk) {
1466-
pm_runtime_force_suspend(dev);
1467-
clk_unprepare(bdev->bamclk);
1468-
}
1452+
pm_runtime_force_suspend(dev);
1453+
clk_unprepare(bdev->bamclk);
14691454

14701455
return 0;
14711456
}
@@ -1475,13 +1460,11 @@ static int __maybe_unused bam_dma_resume(struct device *dev)
14751460
struct bam_device *bdev = dev_get_drvdata(dev);
14761461
int ret;
14771462

1478-
if (bdev->bamclk) {
1479-
ret = clk_prepare(bdev->bamclk);
1480-
if (ret)
1481-
return ret;
1463+
ret = clk_prepare(bdev->bamclk);
1464+
if (ret)
1465+
return ret;
14821466

1483-
pm_runtime_force_resume(dev);
1484-
}
1467+
pm_runtime_force_resume(dev);
14851468

14861469
return 0;
14871470
}

0 commit comments

Comments
 (0)