diff options
Diffstat (limited to 'drivers/dma/sh')
| -rw-r--r-- | drivers/dma/sh/shdma-base.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/dma/sh/shdma-base.c b/drivers/dma/sh/shdma-base.c index 94b6bde6c86a..e427a03a0e8b 100644 --- a/drivers/dma/sh/shdma-base.c +++ b/drivers/dma/sh/shdma-base.c | |||
| @@ -672,11 +672,12 @@ static struct dma_async_tx_descriptor *shdma_prep_dma_cyclic( | |||
| 672 | { | 672 | { |
| 673 | struct shdma_chan *schan = to_shdma_chan(chan); | 673 | struct shdma_chan *schan = to_shdma_chan(chan); |
| 674 | struct shdma_dev *sdev = to_shdma_dev(schan->dma_chan.device); | 674 | struct shdma_dev *sdev = to_shdma_dev(schan->dma_chan.device); |
| 675 | struct dma_async_tx_descriptor *desc; | ||
| 675 | const struct shdma_ops *ops = sdev->ops; | 676 | const struct shdma_ops *ops = sdev->ops; |
| 676 | unsigned int sg_len = buf_len / period_len; | 677 | unsigned int sg_len = buf_len / period_len; |
| 677 | int slave_id = schan->slave_id; | 678 | int slave_id = schan->slave_id; |
| 678 | dma_addr_t slave_addr; | 679 | dma_addr_t slave_addr; |
| 679 | struct scatterlist sgl[SHDMA_MAX_SG_LEN]; | 680 | struct scatterlist *sgl; |
| 680 | int i; | 681 | int i; |
| 681 | 682 | ||
| 682 | if (!chan) | 683 | if (!chan) |
| @@ -700,7 +701,16 @@ static struct dma_async_tx_descriptor *shdma_prep_dma_cyclic( | |||
| 700 | 701 | ||
| 701 | slave_addr = ops->slave_addr(schan); | 702 | slave_addr = ops->slave_addr(schan); |
| 702 | 703 | ||
| 704 | /* | ||
| 705 | * Allocate the sg list dynamically as it would consumer too much stack | ||
| 706 | * space. | ||
| 707 | */ | ||
| 708 | sgl = kcalloc(sg_len, sizeof(*sgl), GFP_KERNEL); | ||
| 709 | if (!sgl) | ||
| 710 | return NULL; | ||
| 711 | |||
| 703 | sg_init_table(sgl, sg_len); | 712 | sg_init_table(sgl, sg_len); |
| 713 | |||
| 704 | for (i = 0; i < sg_len; i++) { | 714 | for (i = 0; i < sg_len; i++) { |
| 705 | dma_addr_t src = buf_addr + (period_len * i); | 715 | dma_addr_t src = buf_addr + (period_len * i); |
| 706 | 716 | ||
| @@ -710,8 +720,11 @@ static struct dma_async_tx_descriptor *shdma_prep_dma_cyclic( | |||
| 710 | sg_dma_len(&sgl[i]) = period_len; | 720 | sg_dma_len(&sgl[i]) = period_len; |
| 711 | } | 721 | } |
| 712 | 722 | ||
| 713 | return shdma_prep_sg(schan, sgl, sg_len, &slave_addr, | 723 | desc = shdma_prep_sg(schan, sgl, sg_len, &slave_addr, |
| 714 | direction, flags, true); | 724 | direction, flags, true); |
| 725 | |||
| 726 | kfree(sgl); | ||
| 727 | return desc; | ||
| 715 | } | 728 | } |
| 716 | 729 | ||
| 717 | static int shdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | 730 | static int shdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, |
