diff options
author | Maxime Ripard <maxime.ripard@free-electrons.com> | 2014-11-17 08:42:30 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2014-12-22 02:02:15 -0500 |
commit | 62ec8eb52d5a72058e04b3d48c6ab9233c3721ff (patch) | |
tree | 7124f7ce3914ff3294b80ad3b14a3c060aee12e4 | |
parent | 740aa95703c59d8b59adb78c65efa08714f66ebb (diff) |
dmaengine: bam-dma: Split device_control
Split the device_control callback of the Qualcomm BAM DMA driver to make use
of the newly introduced callbacks, that will eventually be used to retrieve
slave capabilities.
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r-- | drivers/dma/qcom_bam_dma.c | 85 |
1 files changed, 43 insertions, 42 deletions
diff --git a/drivers/dma/qcom_bam_dma.c b/drivers/dma/qcom_bam_dma.c index 3122a99ec06b..d7a33b3ac466 100644 --- a/drivers/dma/qcom_bam_dma.c +++ b/drivers/dma/qcom_bam_dma.c | |||
@@ -530,11 +530,18 @@ static void bam_free_chan(struct dma_chan *chan) | |||
530 | * Sets slave configuration for channel | 530 | * Sets slave configuration for channel |
531 | * | 531 | * |
532 | */ | 532 | */ |
533 | static void bam_slave_config(struct bam_chan *bchan, | 533 | static int bam_slave_config(struct dma_chan *chan, |
534 | struct dma_slave_config *cfg) | 534 | struct dma_slave_config *cfg) |
535 | { | 535 | { |
536 | struct bam_chan *bchan = to_bam_chan(chan); | ||
537 | unsigned long flag; | ||
538 | |||
539 | spin_lock_irqsave(&bchan->vc.lock, flag); | ||
536 | memcpy(&bchan->slave, cfg, sizeof(*cfg)); | 540 | memcpy(&bchan->slave, cfg, sizeof(*cfg)); |
537 | bchan->reconfigure = 1; | 541 | bchan->reconfigure = 1; |
542 | spin_unlock_irqrestore(&bchan->vc.lock, flag); | ||
543 | |||
544 | return 0; | ||
538 | } | 545 | } |
539 | 546 | ||
540 | /** | 547 | /** |
@@ -627,8 +634,9 @@ err_out: | |||
627 | * No callbacks are done | 634 | * No callbacks are done |
628 | * | 635 | * |
629 | */ | 636 | */ |
630 | static void bam_dma_terminate_all(struct bam_chan *bchan) | 637 | static int bam_dma_terminate_all(struct dma_chan *chan) |
631 | { | 638 | { |
639 | struct bam_chan *bchan = to_bam_chan(chan); | ||
632 | unsigned long flag; | 640 | unsigned long flag; |
633 | LIST_HEAD(head); | 641 | LIST_HEAD(head); |
634 | 642 | ||
@@ -643,56 +651,46 @@ static void bam_dma_terminate_all(struct bam_chan *bchan) | |||
643 | spin_unlock_irqrestore(&bchan->vc.lock, flag); | 651 | spin_unlock_irqrestore(&bchan->vc.lock, flag); |
644 | 652 | ||
645 | vchan_dma_desc_free_list(&bchan->vc, &head); | 653 | vchan_dma_desc_free_list(&bchan->vc, &head); |
654 | |||
655 | return 0; | ||
646 | } | 656 | } |
647 | 657 | ||
648 | /** | 658 | /** |
649 | * bam_control - DMA device control | 659 | * bam_pause - Pause DMA channel |
650 | * @chan: dma channel | 660 | * @chan: dma channel |
651 | * @cmd: control cmd | ||
652 | * @arg: cmd argument | ||
653 | * | 661 | * |
654 | * Perform DMA control command | 662 | */ |
663 | static int bam_pause(struct dma_chan *chan) | ||
664 | { | ||
665 | struct bam_chan *bchan = to_bam_chan(chan); | ||
666 | struct bam_device *bdev = bchan->bdev; | ||
667 | unsigned long flag; | ||
668 | |||
669 | spin_lock_irqsave(&bchan->vc.lock, flag); | ||
670 | writel_relaxed(1, bam_addr(bdev, bchan->id, BAM_P_HALT)); | ||
671 | bchan->paused = 1; | ||
672 | spin_unlock_irqrestore(&bchan->vc.lock, flag); | ||
673 | |||
674 | return 0; | ||
675 | } | ||
676 | |||
677 | /** | ||
678 | * bam_resume - Resume DMA channel operations | ||
679 | * @chan: dma channel | ||
655 | * | 680 | * |
656 | */ | 681 | */ |
657 | static int bam_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | 682 | static int bam_resume(struct dma_chan *chan) |
658 | unsigned long arg) | ||
659 | { | 683 | { |
660 | struct bam_chan *bchan = to_bam_chan(chan); | 684 | struct bam_chan *bchan = to_bam_chan(chan); |
661 | struct bam_device *bdev = bchan->bdev; | 685 | struct bam_device *bdev = bchan->bdev; |
662 | int ret = 0; | ||
663 | unsigned long flag; | 686 | unsigned long flag; |
664 | 687 | ||
665 | switch (cmd) { | 688 | spin_lock_irqsave(&bchan->vc.lock, flag); |
666 | case DMA_PAUSE: | 689 | writel_relaxed(0, bam_addr(bdev, bchan->id, BAM_P_HALT)); |
667 | spin_lock_irqsave(&bchan->vc.lock, flag); | 690 | bchan->paused = 0; |
668 | writel_relaxed(1, bam_addr(bdev, bchan->id, BAM_P_HALT)); | 691 | spin_unlock_irqrestore(&bchan->vc.lock, flag); |
669 | bchan->paused = 1; | ||
670 | spin_unlock_irqrestore(&bchan->vc.lock, flag); | ||
671 | break; | ||
672 | |||
673 | case DMA_RESUME: | ||
674 | spin_lock_irqsave(&bchan->vc.lock, flag); | ||
675 | writel_relaxed(0, bam_addr(bdev, bchan->id, BAM_P_HALT)); | ||
676 | bchan->paused = 0; | ||
677 | spin_unlock_irqrestore(&bchan->vc.lock, flag); | ||
678 | break; | ||
679 | |||
680 | case DMA_TERMINATE_ALL: | ||
681 | bam_dma_terminate_all(bchan); | ||
682 | break; | ||
683 | |||
684 | case DMA_SLAVE_CONFIG: | ||
685 | spin_lock_irqsave(&bchan->vc.lock, flag); | ||
686 | bam_slave_config(bchan, (struct dma_slave_config *)arg); | ||
687 | spin_unlock_irqrestore(&bchan->vc.lock, flag); | ||
688 | break; | ||
689 | |||
690 | default: | ||
691 | ret = -ENXIO; | ||
692 | break; | ||
693 | } | ||
694 | 692 | ||
695 | return ret; | 693 | return 0; |
696 | } | 694 | } |
697 | 695 | ||
698 | /** | 696 | /** |
@@ -1148,7 +1146,10 @@ static int bam_dma_probe(struct platform_device *pdev) | |||
1148 | bdev->common.device_alloc_chan_resources = bam_alloc_chan; | 1146 | bdev->common.device_alloc_chan_resources = bam_alloc_chan; |
1149 | bdev->common.device_free_chan_resources = bam_free_chan; | 1147 | bdev->common.device_free_chan_resources = bam_free_chan; |
1150 | bdev->common.device_prep_slave_sg = bam_prep_slave_sg; | 1148 | bdev->common.device_prep_slave_sg = bam_prep_slave_sg; |
1151 | bdev->common.device_control = bam_control; | 1149 | bdev->common.device_config = bam_slave_config; |
1150 | bdev->common.device_pause = bam_pause; | ||
1151 | bdev->common.device_resume = bam_resume; | ||
1152 | bdev->common.device_terminate_all = bam_dma_terminate_all; | ||
1152 | bdev->common.device_issue_pending = bam_issue_pending; | 1153 | bdev->common.device_issue_pending = bam_issue_pending; |
1153 | bdev->common.device_tx_status = bam_tx_status; | 1154 | bdev->common.device_tx_status = bam_tx_status; |
1154 | bdev->common.dev = bdev->dev; | 1155 | bdev->common.dev = bdev->dev; |
@@ -1187,7 +1188,7 @@ static int bam_dma_remove(struct platform_device *pdev) | |||
1187 | devm_free_irq(bdev->dev, bdev->irq, bdev); | 1188 | devm_free_irq(bdev->dev, bdev->irq, bdev); |
1188 | 1189 | ||
1189 | for (i = 0; i < bdev->num_channels; i++) { | 1190 | for (i = 0; i < bdev->num_channels; i++) { |
1190 | bam_dma_terminate_all(&bdev->channels[i]); | 1191 | bam_dma_terminate_all(&bdev->channels[i].vc.chan); |
1191 | tasklet_kill(&bdev->channels[i].vc.task); | 1192 | tasklet_kill(&bdev->channels[i].vc.task); |
1192 | 1193 | ||
1193 | dma_free_writecombine(bdev->dev, BAM_DESC_FIFO_SIZE, | 1194 | dma_free_writecombine(bdev->dev, BAM_DESC_FIFO_SIZE, |