Merge branch 'fixes' of git://git.infradead.org/users/vkoul/slave-dma

Pull slave-dmaengine fixes from Vinod Koul:
"Here is the slave dmanegine fixes. We have the fix for deadlock issue
on imx-dma by Michael and Josh's edma config fix along with author
change"

* 'fixes' of git://git.infradead.org/users/vkoul/slave-dma:
dmaengine: imx-dma: fix callback path in tasklet
dmaengine: imx-dma: fix lockdep issue between irqhandler and tasklet
dmaengine: imx-dma: fix slow path issue in prep_dma_cyclic
dma/Kconfig: Make TI_EDMA select TI_PRIV_EDMA
edma: Update author email address

Changed files
+17 -17
drivers
+1
drivers/dma/Kconfig
··· 198 198 depends on ARCH_DAVINCI || ARCH_OMAP 199 199 select DMA_ENGINE 200 200 select DMA_VIRTUAL_CHANNELS 201 + select TI_PRIV_EDMA 201 202 default n 202 203 help 203 204 Enable support for the TI EDMA controller. This DMA
+1 -1
drivers/dma/edma.c
··· 749 749 } 750 750 module_exit(edma_exit); 751 751 752 - MODULE_AUTHOR("Matt Porter <mporter@ti.com>"); 752 + MODULE_AUTHOR("Matt Porter <matt.porter@linaro.org>"); 753 753 MODULE_DESCRIPTION("TI EDMA DMA engine driver"); 754 754 MODULE_LICENSE("GPL v2");
+15 -16
drivers/dma/imx-dma.c
··· 437 437 struct imxdma_engine *imxdma = imxdmac->imxdma; 438 438 int chno = imxdmac->channel; 439 439 struct imxdma_desc *desc; 440 + unsigned long flags; 440 441 441 - spin_lock(&imxdma->lock); 442 + spin_lock_irqsave(&imxdma->lock, flags); 442 443 if (list_empty(&imxdmac->ld_active)) { 443 - spin_unlock(&imxdma->lock); 444 + spin_unlock_irqrestore(&imxdma->lock, flags); 444 445 goto out; 445 446 } 446 447 447 448 desc = list_first_entry(&imxdmac->ld_active, 448 449 struct imxdma_desc, 449 450 node); 450 - spin_unlock(&imxdma->lock); 451 + spin_unlock_irqrestore(&imxdma->lock, flags); 451 452 452 453 if (desc->sg) { 453 454 u32 tmp; ··· 520 519 { 521 520 struct imxdma_channel *imxdmac = to_imxdma_chan(d->desc.chan); 522 521 struct imxdma_engine *imxdma = imxdmac->imxdma; 523 - unsigned long flags; 524 522 int slot = -1; 525 523 int i; 526 524 ··· 527 527 switch (d->type) { 528 528 case IMXDMA_DESC_INTERLEAVED: 529 529 /* Try to get a free 2D slot */ 530 - spin_lock_irqsave(&imxdma->lock, flags); 531 530 for (i = 0; i < IMX_DMA_2D_SLOTS; i++) { 532 531 if ((imxdma->slots_2d[i].count > 0) && 533 532 ((imxdma->slots_2d[i].xsr != d->x) || ··· 536 537 slot = i; 537 538 break; 538 539 } 539 - if (slot < 0) { 540 - spin_unlock_irqrestore(&imxdma->lock, flags); 540 + if (slot < 0) 541 541 return -EBUSY; 542 - } 543 542 544 543 imxdma->slots_2d[slot].xsr = d->x; 545 544 imxdma->slots_2d[slot].ysr = d->y; ··· 546 549 547 550 imxdmac->slot_2d = slot; 548 551 imxdmac->enabled_2d = true; 549 - spin_unlock_irqrestore(&imxdma->lock, flags); 550 552 551 553 if (slot == IMX_DMA_2D_SLOT_A) { 552 554 d->config_mem &= ~CCR_MSEL_B; ··· 621 625 struct imxdma_channel *imxdmac = (void *)data; 622 626 struct imxdma_engine *imxdma = imxdmac->imxdma; 623 627 struct imxdma_desc *desc; 628 + unsigned long flags; 624 629 625 - spin_lock(&imxdma->lock); 630 + spin_lock_irqsave(&imxdma->lock, flags); 626 631 627 632 if (list_empty(&imxdmac->ld_active)) { 628 633 /* Someone might have called terminate all */ 629 - goto out; 634 + spin_unlock_irqrestore(&imxdma->lock, flags); 635 + return; 630 636 } 631 637 desc = list_first_entry(&imxdmac->ld_active, struct imxdma_desc, node); 632 - 633 - if (desc->desc.callback) 634 - desc->desc.callback(desc->desc.callback_param); 635 638 636 639 /* If we are dealing with a cyclic descriptor, keep it on ld_active 637 640 * and dont mark the descriptor as complete. ··· 658 663 __func__, imxdmac->channel); 659 664 } 660 665 out: 661 - spin_unlock(&imxdma->lock); 666 + spin_unlock_irqrestore(&imxdma->lock, flags); 667 + 668 + if (desc->desc.callback) 669 + desc->desc.callback(desc->desc.callback_param); 670 + 662 671 } 663 672 664 673 static int imxdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, ··· 882 883 kfree(imxdmac->sg_list); 883 884 884 885 imxdmac->sg_list = kcalloc(periods + 1, 885 - sizeof(struct scatterlist), GFP_KERNEL); 886 + sizeof(struct scatterlist), GFP_ATOMIC); 886 887 if (!imxdmac->sg_list) 887 888 return NULL; 888 889