| .. | .. |
|---|
| 643 | 643 | chan = ccp->ccp_dma_chan + i; |
|---|
| 644 | 644 | dma_chan = &chan->dma_chan; |
|---|
| 645 | 645 | |
|---|
| 646 | | - if (dma_chan->client_count) |
|---|
| 647 | | - dma_release_channel(dma_chan); |
|---|
| 648 | | - |
|---|
| 649 | 646 | tasklet_kill(&chan->cleanup_tasklet); |
|---|
| 650 | 647 | list_del_rcu(&dma_chan->device_node); |
|---|
| 648 | + } |
|---|
| 649 | +} |
|---|
| 650 | + |
|---|
| 651 | +static void ccp_dma_release_channels(struct ccp_device *ccp) |
|---|
| 652 | +{ |
|---|
| 653 | + struct ccp_dma_chan *chan; |
|---|
| 654 | + struct dma_chan *dma_chan; |
|---|
| 655 | + unsigned int i; |
|---|
| 656 | + |
|---|
| 657 | + for (i = 0; i < ccp->cmd_q_count; i++) { |
|---|
| 658 | + chan = ccp->ccp_dma_chan + i; |
|---|
| 659 | + dma_chan = &chan->dma_chan; |
|---|
| 660 | + |
|---|
| 661 | + if (dma_chan->client_count) |
|---|
| 662 | + dma_release_channel(dma_chan); |
|---|
| 651 | 663 | } |
|---|
| 652 | 664 | } |
|---|
| 653 | 665 | |
|---|
| .. | .. |
|---|
| 771 | 783 | if (!dmaengine) |
|---|
| 772 | 784 | return; |
|---|
| 773 | 785 | |
|---|
| 774 | | - ccp_dma_release(ccp); |
|---|
| 786 | + ccp_dma_release_channels(ccp); |
|---|
| 775 | 787 | dma_async_device_unregister(dma_dev); |
|---|
| 788 | + ccp_dma_release(ccp); |
|---|
| 776 | 789 | |
|---|
| 777 | 790 | kmem_cache_destroy(ccp->dma_desc_cache); |
|---|
| 778 | 791 | kmem_cache_destroy(ccp->dma_cmd_cache); |
|---|