diff options
author | Vinod Koul <vinod.koul@intel.com> | 2015-02-02 19:55:35 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2015-02-02 19:55:35 -0500 |
commit | 2cd6f7928ca42c7744f493e0ae2a4acaf02331a0 (patch) | |
tree | 2051ca01dbfeaa3185df454d874b6c450f540a92 /drivers/dma/imx-dma.c | |
parent | c914570f28552eb4ed6f016ec7b1db292a7c924b (diff) | |
parent | 5cf5aec5b38a5143883fc5b689bf5c1c8ee48aa3 (diff) |
Merge branch 'topic/slave_caps_device_control_fix_rebased' into for-linus
Diffstat (limited to 'drivers/dma/imx-dma.c')
-rw-r--r-- | drivers/dma/imx-dma.c | 103 |
1 files changed, 51 insertions, 52 deletions
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c index 0c4d35da1502..eed405976ea9 100644 --- a/drivers/dma/imx-dma.c +++ b/drivers/dma/imx-dma.c | |||
@@ -664,69 +664,67 @@ out: | |||
664 | 664 | ||
665 | } | 665 | } |
666 | 666 | ||
667 | static int imxdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | 667 | static int imxdma_terminate_all(struct dma_chan *chan) |
668 | unsigned long arg) | ||
669 | { | 668 | { |
670 | struct imxdma_channel *imxdmac = to_imxdma_chan(chan); | 669 | struct imxdma_channel *imxdmac = to_imxdma_chan(chan); |
671 | struct dma_slave_config *dmaengine_cfg = (void *)arg; | ||
672 | struct imxdma_engine *imxdma = imxdmac->imxdma; | 670 | struct imxdma_engine *imxdma = imxdmac->imxdma; |
673 | unsigned long flags; | 671 | unsigned long flags; |
674 | unsigned int mode = 0; | ||
675 | |||
676 | switch (cmd) { | ||
677 | case DMA_TERMINATE_ALL: | ||
678 | imxdma_disable_hw(imxdmac); | ||
679 | 672 | ||
680 | spin_lock_irqsave(&imxdma->lock, flags); | 673 | imxdma_disable_hw(imxdmac); |
681 | list_splice_tail_init(&imxdmac->ld_active, &imxdmac->ld_free); | ||
682 | list_splice_tail_init(&imxdmac->ld_queue, &imxdmac->ld_free); | ||
683 | spin_unlock_irqrestore(&imxdma->lock, flags); | ||
684 | return 0; | ||
685 | case DMA_SLAVE_CONFIG: | ||
686 | if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { | ||
687 | imxdmac->per_address = dmaengine_cfg->src_addr; | ||
688 | imxdmac->watermark_level = dmaengine_cfg->src_maxburst; | ||
689 | imxdmac->word_size = dmaengine_cfg->src_addr_width; | ||
690 | } else { | ||
691 | imxdmac->per_address = dmaengine_cfg->dst_addr; | ||
692 | imxdmac->watermark_level = dmaengine_cfg->dst_maxburst; | ||
693 | imxdmac->word_size = dmaengine_cfg->dst_addr_width; | ||
694 | } | ||
695 | |||
696 | switch (imxdmac->word_size) { | ||
697 | case DMA_SLAVE_BUSWIDTH_1_BYTE: | ||
698 | mode = IMX_DMA_MEMSIZE_8; | ||
699 | break; | ||
700 | case DMA_SLAVE_BUSWIDTH_2_BYTES: | ||
701 | mode = IMX_DMA_MEMSIZE_16; | ||
702 | break; | ||
703 | default: | ||
704 | case DMA_SLAVE_BUSWIDTH_4_BYTES: | ||
705 | mode = IMX_DMA_MEMSIZE_32; | ||
706 | break; | ||
707 | } | ||
708 | 674 | ||
709 | imxdmac->hw_chaining = 0; | 675 | spin_lock_irqsave(&imxdma->lock, flags); |
676 | list_splice_tail_init(&imxdmac->ld_active, &imxdmac->ld_free); | ||
677 | list_splice_tail_init(&imxdmac->ld_queue, &imxdmac->ld_free); | ||
678 | spin_unlock_irqrestore(&imxdma->lock, flags); | ||
679 | return 0; | ||
680 | } | ||
710 | 681 | ||
711 | imxdmac->ccr_from_device = (mode | IMX_DMA_TYPE_FIFO) | | 682 | static int imxdma_config(struct dma_chan *chan, |
712 | ((IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_LINEAR) << 2) | | 683 | struct dma_slave_config *dmaengine_cfg) |
713 | CCR_REN; | 684 | { |
714 | imxdmac->ccr_to_device = | 685 | struct imxdma_channel *imxdmac = to_imxdma_chan(chan); |
715 | (IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_LINEAR) | | 686 | struct imxdma_engine *imxdma = imxdmac->imxdma; |
716 | ((mode | IMX_DMA_TYPE_FIFO) << 2) | CCR_REN; | 687 | unsigned int mode = 0; |
717 | imx_dmav1_writel(imxdma, imxdmac->dma_request, | ||
718 | DMA_RSSR(imxdmac->channel)); | ||
719 | 688 | ||
720 | /* Set burst length */ | 689 | if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { |
721 | imx_dmav1_writel(imxdma, imxdmac->watermark_level * | 690 | imxdmac->per_address = dmaengine_cfg->src_addr; |
722 | imxdmac->word_size, DMA_BLR(imxdmac->channel)); | 691 | imxdmac->watermark_level = dmaengine_cfg->src_maxburst; |
692 | imxdmac->word_size = dmaengine_cfg->src_addr_width; | ||
693 | } else { | ||
694 | imxdmac->per_address = dmaengine_cfg->dst_addr; | ||
695 | imxdmac->watermark_level = dmaengine_cfg->dst_maxburst; | ||
696 | imxdmac->word_size = dmaengine_cfg->dst_addr_width; | ||
697 | } | ||
723 | 698 | ||
724 | return 0; | 699 | switch (imxdmac->word_size) { |
700 | case DMA_SLAVE_BUSWIDTH_1_BYTE: | ||
701 | mode = IMX_DMA_MEMSIZE_8; | ||
702 | break; | ||
703 | case DMA_SLAVE_BUSWIDTH_2_BYTES: | ||
704 | mode = IMX_DMA_MEMSIZE_16; | ||
705 | break; | ||
725 | default: | 706 | default: |
726 | return -ENOSYS; | 707 | case DMA_SLAVE_BUSWIDTH_4_BYTES: |
708 | mode = IMX_DMA_MEMSIZE_32; | ||
709 | break; | ||
727 | } | 710 | } |
728 | 711 | ||
729 | return -EINVAL; | 712 | imxdmac->hw_chaining = 0; |
713 | |||
714 | imxdmac->ccr_from_device = (mode | IMX_DMA_TYPE_FIFO) | | ||
715 | ((IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_LINEAR) << 2) | | ||
716 | CCR_REN; | ||
717 | imxdmac->ccr_to_device = | ||
718 | (IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_LINEAR) | | ||
719 | ((mode | IMX_DMA_TYPE_FIFO) << 2) | CCR_REN; | ||
720 | imx_dmav1_writel(imxdma, imxdmac->dma_request, | ||
721 | DMA_RSSR(imxdmac->channel)); | ||
722 | |||
723 | /* Set burst length */ | ||
724 | imx_dmav1_writel(imxdma, imxdmac->watermark_level * | ||
725 | imxdmac->word_size, DMA_BLR(imxdmac->channel)); | ||
726 | |||
727 | return 0; | ||
730 | } | 728 | } |
731 | 729 | ||
732 | static enum dma_status imxdma_tx_status(struct dma_chan *chan, | 730 | static enum dma_status imxdma_tx_status(struct dma_chan *chan, |
@@ -1179,7 +1177,8 @@ static int __init imxdma_probe(struct platform_device *pdev) | |||
1179 | imxdma->dma_device.device_prep_dma_cyclic = imxdma_prep_dma_cyclic; | 1177 | imxdma->dma_device.device_prep_dma_cyclic = imxdma_prep_dma_cyclic; |
1180 | imxdma->dma_device.device_prep_dma_memcpy = imxdma_prep_dma_memcpy; | 1178 | imxdma->dma_device.device_prep_dma_memcpy = imxdma_prep_dma_memcpy; |
1181 | imxdma->dma_device.device_prep_interleaved_dma = imxdma_prep_dma_interleaved; | 1179 | imxdma->dma_device.device_prep_interleaved_dma = imxdma_prep_dma_interleaved; |
1182 | imxdma->dma_device.device_control = imxdma_control; | 1180 | imxdma->dma_device.device_config = imxdma_config; |
1181 | imxdma->dma_device.device_terminate_all = imxdma_terminate_all; | ||
1183 | imxdma->dma_device.device_issue_pending = imxdma_issue_pending; | 1182 | imxdma->dma_device.device_issue_pending = imxdma_issue_pending; |
1184 | 1183 | ||
1185 | platform_set_drvdata(pdev, imxdma); | 1184 | platform_set_drvdata(pdev, imxdma); |